+
    lHàj54  ã                   óx  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHt ^ RIHt ^ RIHtHtHt ^ RIHt ^ RIHtHtHtHtHt ^ RIHtHt ]P>                  ! ] 4      t!R	 R
 lt"R R lt#R R lt$R R lt%R R lt&RR R llt'R R lt(R R lt)R R lt* ! R R4      t+ ! R R]4      t,R# ) zœModal cloud execution environment using the native Modal SDK directly
(``Sandbox.create()`` + ``Sandbox.exec()``) with persistent snapshots across sessions.N©ÚPath)ÚAnyÚCallableÚOptional©Úget_hermes_home)ÚBaseEnvironmentÚ_load_json_storeÚ_update_json_store)Ú_ThreadedProcessHandle)ÚFileSyncManagerÚiter_sync_filesÚquoted_mkdir_commandÚquoted_rm_commandÚunique_parent_dirs)Ú	bash_argvÚensure_lazy_depc                ó$   € V ^8„  d   QhR\         /# ©é   Úreturnr   )Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/environments/modal.pyÚ__annotate__r      s   € ÷ 6ñ 6œñ 6ó    c                  ó$   € \        4       R ,          # )zmodal_snapshots.jsonr   © r   r   Ú_snapshot_storer      s   € ô ÓÐ5Õ5Ð5r   c                ó$   € V ^8„  d   QhR\         /# r   ©Údict)r   s   "r   r   r      s   € ÷ /ñ /œñ /r   c                  ó(   € \        \        4       4      # ©N)r
   r   r   r   r   Ú_load_snapshotsr$      s   € ÜœOÓ-Ó.Ð.r   c                óD   € V ^8„  d   QhR\         \        .R3,          RR/# )r   ÚupdateNr   )r   r!   )r   s   "r   r   r   !   s%   € ÷ 2ñ 2œh¬ v¨t |Õ4ð 2¸ñ 2r   c                 ó.   € \        \        4       V 4       R # r#   )r   r   )r&   s   &r   Ú_update_snapshotsr(   !   s   € Ü”Ó(¨&Ö1r   c                ó`   € V ^8„  d   QhR\         R\        \         R,          \        3,          /# )r   Útask_idr   N)ÚstrÚtupleÚbool)r   s   "r   r   r   %   s(   € ÷ ñ ¬Sð ´U¼3À½:ÄtÐ;KÕ5Lñ r   c                ó®   € \        4       pRV  2R3V R33 F;  w  r#VP                  V4      p\        V\        4      '       g   K.  V'       g   K8  WC3u # 	  R# )z\Return (snapshot_id, from_legacy_key); the namespaced key wins over the legacy bare task id.údirect:FT©NF)r$   ÚgetÚ
isinstancer+   )r*   Ú	snapshotsÚkeyÚlegacyÚsnapshot_ids   &    r   Ú_get_snapshot_restore_candidater7   %   s\   € äÓ!€IØ" 7 )Ð,¨eÐ4°wÀ°oÓF‰ˆØ—m‘m CÓ(ˆÜ�k¤3×'Ô'¯K©KØÐ&Ò&ñ Gð Ðr   c                ó4   € V ^8„  d   QhR\         R\         RR/# )r   r*   r6   r   N©r+   )r   s   "r   r   r   /   s!   € ÷ ñ ¤Cð ´cð ¸dñ r   c                 ó4   a a€ R  VV 3R llp\        V4       R# )c                ó(   € V ^8„  d   QhR\         RR/# ©r   r3   r   Nr    )r   s   "r   r   Ú,_store_direct_snapshot.<locals>.__annotate__0   s   € ÷ %ñ %œ$ð % 4ñ %r   c                 ó<   <€ SV R S 2&   V P                  SR4       R# ©r/   N)Úpop)r3   r6   r*   s   &€€r   r&   Ú&_store_direct_snapshot.<locals>.update0   s"   ø€ Ø)4ˆ	�G˜G˜9Ð%Ñ&Ø�‰�g˜tÖ$r   N©r(   ©r*   r6   r&   s   ff r   Ú_store_direct_snapshotrD   /   s   ù€ ÷%ñ %ô �fÖr   c                óB   € V ^8„  d   QhR\         R\         R,          RR/# )r   r*   r6   Nr   r9   )r   s   "r   r   r   7   s%   € ÷ ñ ¤Sð ´s¸Tµzð ÈTñ r   c                 ó4   a a€ R  VV 3R llp\        V4       R# )c                ó(   € V ^8„  d   QhR\         RR/# r<   r    )r   s   "r   r   Ú-_delete_direct_snapshot.<locals>.__annotate__8   s   € ÷ ñ œ$ð  4ñ r   c                 ó¾   <€ R S 2S3 Uu. uF+  pV P                  V4      f   K  SRW,          39   g   K)  VNK-  	  ppV F  pV P                  V4       K  	  R# u upi r?   )r1   r@   )r3   ÚkÚstaler4   r6   r*   s   &   €€r   r&   Ú'_delete_direct_snapshot.<locals>.update8   sl   ø€ Ø& w iÐ0°'Ñ:ó ZÑ:�qØ—M‘M !Ó$ô Ø5@ÀTÈ9Í<ÐDXÑ5X÷ �Ñ:ˆð ZãˆCØ�M‰M˜#Öó ùòZs   ‹A¥A¶ANrB   rC   s   ff r   Ú_delete_direct_snapshotrM   7   s   ù€ ÷ñ ô �fÖr   c                ó0   € V ^8„  d   QhR\         R\         /# )r   Ú
image_specr   ©r   )r   s   "r   r   r   A   s   € ÷ \ñ \¤Sð \¬Sñ \r   c                óš  a € \        R4       ^ RIp\        S \        4      '       g   S # S P	                  R4      '       d   VP
                  P                  S 4      # R.p\        ;QJ d    V 3R lR
 4       F  '       g   K   RM	  RM! V 3R lR
 4       4      '       d   VP                  ^ R4       VP
                  P                  S VR	7      # )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.ÚmodalNz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   óH   <"  € T F  qSP                  4       9   x € K  	  R # 5ir#   )Úlower)Ú.0ÚbaserO   s   & €r   Ú	<genexpr>Ú'_resolve_modal_image.<locals>.<genexpr>N   s   øé € Ð
GÑ2F¨$�:×#Ñ#Ó%Ö%Ó2Fùs   ƒ"TFz^RUN apt-get update -qq && apt-get install -y -qq python3 python3-venv > /dev/null 2>&1 || true)Úsetup_dockerfile_commands)ÚubuntuÚdebian)
r   rR   r2   r+   Ú
startswithÚImageÚfrom_idÚanyÚinsertÚfrom_registry)rO   Ú_modalÚsetup_commandss   f  r   Ú_resolve_modal_imagerd   A   sª   ø€ ô �GÔÛä�j¤#×&Ò&ØÐØ×Ñ˜U×#Ò#Ø�|‰|×#Ñ# JÓ/Ð/ð	JðK€N÷ ƒsÔ
GÑ2FÓ
G‡s‡s‚sÔ
GÑ2FÓ
G×GÒGØ×Ñ˜aØlô	nà�<‰<×%Ñ% jÈNÐ%Ó[Ð[r   c                ó4   € V ^8„  d   QhR\         R\        RR/# )r   ÚpayloadÚ
chunk_sizer   N)r+   Úint)r   s   "r   r   r   T   s!   € ÷ !ñ !¤sð !¼ð !Àñ !r   c              ƒ  óž  "  € VP                  RR4      p\        ^ \        V4      V4       FR  pV P                  P	                  W4WB,            4       V P                  P
                  P                  4       G Rj  x€L
  KT  	  V P                  P                  4        V P                  P
                  P                  4       G Rj  x€L
  R#  LP L5i)zBWrite byte-exact UTF-8 payload chunks to ``proc.stdin``, then EOF.úutf-8ÚsurrogateescapeN)ÚencodeÚrangeÚlenÚstdinÚwriteÚdrainÚaioÚ	write_eof)Úprocrf   rg   ÚdataÚoffsets   &&&  r   Ú_stream_stdinrw   T   s™   é € à�>‰>˜'Ð#4Ó5€DÜ˜œ3˜t›9 jÖ1ˆØ�
‰
×Ñ˜ VÕ%8Ð9Ô:Ø�j‰j×Ñ×"Ñ"Ó$×$Ò$ñ 2ð 	‡J�J×ÑÔØ
�*‰*×
Ñ
×
Ñ
Ó
 × Ò ñ 	%á ùs%   ‚A6CÁ8C	Á9A	CÃCÃCÃCc                ó$   € V ^8„  d   QhR\         /# r   r9   )r   s   "r   r   r   ^   s   € ÷ Zñ Z”sñ Zr   c                 óX   € \        V \        4      '       d   V P                  R RR7      # T # )rj   Úreplace)Úerrors)r2   ÚbytesÚdecode)Úvalues   &r   Ú_as_textr   ^   s'   € Ü6@ÀÌ×6NÒ6Nˆ5�<‰<˜¨	ˆ<Ó2ÐYÐTYÐYr   c                   ó@   a € ] tR t^bt o RtR tR tRR ltR tRt	V t
R# )	Ú_AsyncWorkerzEBackground thread with its own event loop for async-safe Modal calls.c                óV   € R V n         R V n        \        P                  ! 4       V n        R # r#   )Ú_loopÚ_threadÚ	threadingÚEventÚ_started©Úselfs   &r   Ú__init__Ú_AsyncWorker.__init__e   s   € Ø:>ˆŒ
Ø37ˆŒÜ!ŸšÓ)ˆŽr   c                óº   a € V 3R  lp\         P                  ! VRR7      S n        S P                  P                  4        S P                  P                  ^R7       R# )c                  óä   <€ \         P                  ! 4       S n        \         P                  ! S P                  4       S P                  P                  4        S P                  P                  4        R # r#   )ÚasyncioÚnew_event_looprƒ   Úset_event_loopr‡   ÚsetÚrun_foreverrˆ   s   €r   Ú	_run_loopÚ%_AsyncWorker.start.<locals>._run_loopk   sE   ø€ Ü ×/Ò/Ó1ˆDŒJÜ×"Ò" 4§:¡:Ô.Ø�M‰M×ÑÔØ�J‰J×"Ñ"Ö$r   T)ÚtargetÚdaemon©ÚtimeoutN)r…   ÚThreadr„   Ústartr‡   Úwait)r‰   r“   s   f r   rš   Ú_AsyncWorker.startj   sC   ø€ õ	%ô
 !×'Ò'¨yÀÔFˆŒØ�‰×ÑÔØ�‰×Ñ 2ÐÖ&r   c                ót   € ^ RI Hp V! WP                  4      pVf   \        R4      hVP	                  VR7      # )é    )Úsafe_schedule_threadsafezAsyncWorker loop is not runningr—   )Úagent.async_utilsrŸ   rƒ   ÚRuntimeErrorÚresult)r‰   Úcoror˜   rŸ   Úfutures   &&&  r   Úrun_coroutineÚ_AsyncWorker.run_coroutinet   s5   € Ý>á)¨$·
±
Ó;ˆØŠ>ÜÐ@ÓAÐAØ�}‰} Wˆ}Ó-Ð-r   c                ó(  € V P                   '       dP   V P                   P                  4       '       d0   V P                   P                  V P                   P                  4       V P                  '       d   V P                  P                  ^
R7       R# R# )é
   r—   N)rƒ   Ú
is_runningÚcall_soon_threadsafeÚstopr„   Újoinrˆ   s   &r   r«   Ú_AsyncWorker.stop|   sZ   € Ø�:�:ˆ:˜$Ÿ*™*×/Ñ/×1Ò1Ø�J‰J×+Ñ+¨D¯J©J¯O©OÔ<Ø�<�<ˆ<Ø�L‰L×Ñ bÐÖ)ñ r   )rƒ   r‡   r„   N)iX  )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rŠ   rš   r¥   r«   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r   r�   r�   b   s!   ø‡ € ÙOò*ò
'ô.÷*ð *r   r�   c                   óö   a a€ ] tR t^ƒt oRtRt^<tRtRV3R lV 3R llltRRRRRR	/V3R
 lR llt	V3R lR lt
V3R lR ltV3R lR ltV3R lR ltV3R lR ltRR	R^xRR/V3R lR lltR tRtVtV ;t# )Ú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.rf   Nc                ód   <€ V ^8„  d   QhRS[ RS[ RS[RS[S[S[ S[3,          ,          RS[RS[ /# )r   ÚimageÚcwdr˜   Úmodal_sandbox_kwargsÚpersistent_filesystemr*   )r+   rh   r   r!   r   r-   )r   rµ   s   "€r   r   ÚModalEnvironment.__annotate__�   sG   ø€ ÷ /ñ /™cð /©ð /Áð /Ù'/±±S¹#°XµÕ'?ð/á(,ð/á>Añ/r   c                óT  <a aa€ \         SS `  W#R 7       WVuS n        S n        R;S n        S n        \        4       S n        RS n        S P                  '       d   \        S P                  4      MRw  rxV'       d   \        P                  RVR,          4       \        R4       ^ RIoS P                  P                  4        R VVV 3R llp	  T	! \        T;'       g    T4      4       V'       d   V'       d   \!        S P                  V4       \        P                  RS P                  4       \+        R	 S P,                  S P.                  S P0                  S P2                  R
7      S n        S P                  P5                  RR7       S P7                  4        R#   \"         dY   p
T'       g   h \        P%                  RTR,          T
4       \'        S P                  T4       T	! \        T4      4        Rp
?
LêRp
?
ii ; i  \"         d    S P                  P)                  4        h i ; i))rº   r˜   Nz!Modal: restoring from snapshot %sºNé   NrR   c                ó(   € V ^8„  d   QhR\         RR/# )r   rO   r   NrP   )r   s   "r   r   Ú/ModalEnvironment.__init__.<locals>.__annotate__�   s   € ÷ 	bñ 	b¤ð 	b¨ñ 	br   c                 óx   <a € VV V3R  lpSP                   P                  V! 4       RR7      w  Sn        Sn        R# )c               “   ó<  <"  € SP                   P                  P                  R RR7      G Rj  x€L
 p \        S;'       g    / 4      pSP                  P
                  P                  ! RRSRV R\        VP                  RR4      4      /VB G Rj  x€L
 pW3#  Li L	5i)	zhermes-agentT)Úcreate_if_missingNr¹   Úappr˜   i  )ÚsleepÚinfinity)ÚAppÚlookuprr   r!   ÚSandboxÚcreaterh   r@   )rÆ   Úcreate_kwargsÚsandboxrb   rO   r»   s      €€€r   Ú_create_sandboxÚCModalEnvironment.__init__.<locals>._create.<locals>._create_sandboxž   s©   øé € Ø"ŸJ™J×-Ñ-×1Ñ1°.ÐTXÐ1ÓY×Y�Ü $Ð%9×%?Ð%?¸RÓ @�Ø &§¡× 5Ñ 5× 9Ò 9ñ !VØ/9ð!VØ?Bð!Vä × 1Ñ 1°)¸TÓ BÓCð!VàGTñ!V÷ V�ð �|Ð#ñ ZñVùs(   ƒ+B®B¯BÁABÂBÂBÂBi,  r—   N)Ú_workerr¥   Ú_appÚ_sandbox)rO   rÏ   rb   r»   r‰   s   f €€€r   Ú_createÚ*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                  ó   € \        R 4      # )z/root/.hermes)r   r   r   r   Ú<lambda>Ú+ModalEnvironment.__init__.<locals>.<lambda>¸   s	   € ¤°Ô!Ar   )Úget_files_fnÚ	upload_fnÚ	delete_fnÚbulk_upload_fnÚbulk_download_fnT)Úforcer0   )ÚsuperrŠ   Ú_persistentÚ_task_idrÓ   rÒ   r�   rÑ   Ú_sync_managerr7   ÚloggerÚinfor   rR   rš   rd   rD   Ú	ExceptionÚwarningrM   r«   r   Ú_modal_uploadÚ_modal_deleteÚ_modal_bulk_uploadÚ_modal_bulk_downloadÚsyncÚinit_session)r‰   r¹   rº   r˜   r»   r¼   r*   Úrestored_snapshot_idÚrestored_from_legacy_keyrÔ   Úexcrb   Ú	__class__s   f&&&f&&    @€r   rŠ   ÚModalEnvironment.__init__�   sÀ  û€ ô 	‰Ñ˜SÐÔ2Ø*?Ð'ˆÔ˜$œ-Ø$(Ð(ˆŒ˜œ	Ü#“~ˆŒØ59ˆÔà>B×>N×>NÐ>NÔ+¨D¯M©MÔ:ÐTañ 	7ÐçÜ�K‰KÐ;Ð=QÐRUÕ=VÔWÜ˜Ô ÛØ�‰×ÑÔ÷	bò 	bð	ðPÙÔ,Ð-A×-JÐ-JÀUÓKÔL÷ (×,DÜ*¨4¯=©=Ð:NÔOô 	�‰Ð6¸¿¹ÔFÜ,ÙAØ×(Ñ(°D×4FÑ4FØ×2Ñ2ÀT×E^ÑE^ô`ˆÔð 	×Ñ×Ñ dÐÔ+Ø×ÑÖøô' ô 5ß+ØÜ—‘ÐcØ3°CÕ8¸#ô?ä'¨¯©Ð7KÔLÙÔ,¨UÓ3×4Ñ4ûð5ûô ô 	Ø�L‰L×ÑÔØð	ús=   ÃF ÃF Ã(H  Ã8H  ÆG=Æ%AG8Ç3H  Ç8G=Ç=H  È 'H'ro   Ú
fail_labelÚcaptureFc          
      óT   <€ V ^8„  d   QhRS[ RS[RS[ R,          RS[ R,          RS[/# )r   Úcmdr˜   ro   Nrò   ró   )r+   rh   r-   )r   rµ   s   "€r   r   r½   ¾   sC   ø€ ÷ Cñ C™ð C©#ð C±c¸Dµjð CÑUXÐ[_ÕU_ð CÙñCr   c               ód   a aaaa€ VVVV V3R lpS P                   P                  V! 4       VR7      # )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               “   ó0  <"  € SP                   P                  P                  R RS4      G Rj  x€L
 p Se    \        V SSP                  4      G Rj  x€L
  S'       d-   V P
                  P                  P                  4       G Rj  x€L
 MRpV P                  P                  4       G Rj  x€L
 pS'       dU   V^ 8w  dN   S'       d   RM.RV P                  P                  P                  4       G Rj  x€L
  2p\        RS RV RV 24      hV#  LÝ L¼ LŠ Lh L$5i)Úbashz-cNÚ z: zModal z failed (exit Ú))
rÓ   Úexecrr   rw   Ú_STDIN_CHUNK_SIZEÚstdoutÚreadr›   Ústderrr¡   )	rt   ru   Ú	exit_codeÚdetailró   rõ   rò   r‰   ro   s	       €€€€€r   Ú_runÚ$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ùsi   ƒ+D®D¯"DÁDÁDÁ'DÂDÂ#DÂ)DÂ*DÂ6DÃ*DÃ/DÃ0DÄDÄDÄDÄDr—   )rÑ   r¥   )r‰   rõ   r˜   ro   rò   ró   r  s   ff$ddd r   Ú_execÚModalEnvironment._exec¾   s+   ü€ ÷		ñ 		ð �|‰|×)Ñ)©$«&¸'Ð)ÓBÐBr   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r   Ú	host_pathÚremote_pathr   Nr9   )r   rµ   s   "€r   r   r½   Î   s'   ø€ ÷ jñ j¡sð j¹ð jÀñ jr   c                ó:  € R\         P                  ! \        \        V4      P                  4      4       R\         P                  ! V4       2pV P                  V\        P                  ! \        V4      P                  4       4      P                  R4      ^R7       R# )z4Upload a single file via base64 piped through stdin.z	mkdir -p z && base64 -d > Úascii)ro   r˜   N)
ÚshlexÚquoter+   r   Úparentr  Úbase64Ú	b64encodeÚ
read_bytesr}   )r‰   r  r  rõ   s   &&& r   rç   Ú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   c                óJ   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RR/# )r   Úfilesr   N)Úlistr,   r+   )r   rµ   s   "€r   r   r½   Ó   s,   ø€ ÷ Nñ N©©U±3¹°8­_Õ(=ð NÀ$ñ Nr   c           	     óÐ  € V'       g   R# \         P                  ! 4       p\        P                  ! VRR7      ;_uu_ 4       pV F&  w  rEVP	                  WEP                  R4      R7       K(  	  RRR4       \        P                  ! VP                  4       4      P                  R4      p\        \        V4      4       R2pV P                  Wv^xRR	7       R#   + '       g   i     Lp; i)
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 /zbulk upload)ro   r˜   rò   )ÚioÚBytesIOÚtarfileÚopenÚaddÚlstripr  r  Úgetvaluer}   r   r   r  )r‰   r  ÚbufÚtarr  r  rf   rõ   s   &&      r   ré   Ú#ModalEnvironment._modal_bulk_uploadÓ   sª   € ÷ ÙÜ�jŠj‹lˆÜ�\Š\ #¨F×3Õ3°sÛ*/Ñ&�	Ø—‘˜	×+=Ñ+=¸cÓ+B�ÖCñ +0÷ 4ô ×"Ò" 3§<¡<£>Ó2×9Ñ9¸'ÓBˆÜ%Ô&8¸Ó&?Ó@ÐAÐA_Ð`ˆØ�
‰
�3¨s¸}ˆ
ÖM÷ 4×3ús   Á -CÃC%	c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Údestr   Nr   )r   rµ   s   "€r   r   r½   à   s   ø€ ÷ Kñ K©ð K°$ñ Kr   c                óª   € V P                  R^xRRR7      pTP                  \        V\        4      '       d   VP	                  4       4       R# T4       R# )zTDownload remote .hermes/ as a tar archive (sandboxes run as root, so /root/.hermes).z-tar cf - --exclude='*.sock' -C / root/.hermeszbulk downloadT)r˜   rò   ró   N)r  Úwrite_bytesr2   r+   rl   )r‰   r%  ru   s   && r   rê   Ú%ModalEnvironment._modal_bulk_downloadà   sJ   € ð �z‰zÐIÐSVÐcrð  }Aˆzó  BˆØ×Ñ¬*°T¼3×*?Ò*?˜Ÿ™›ÖJÀTÖJr   c                ó4   <€ V ^8„  d   QhRS[ S[,          RR/# )r   Úremote_pathsr   N)r  r+   )r   rµ   s   "€r   r   r½   æ   s#   ø€ ÷ @ñ @©$©s­)ð @¸ñ @r   c                ó>   € V P                  \        V4      ^R7       R# ©é   r—   N)r  r   )r‰   r*  s   &&r   rè   ÚModalEnvironment._modal_deleteæ   s   € Ø�
‰
Ô$ \Ó2¸Bˆ
Ö?r   c                ó   <€ V ^8„  d   QhRR/# )r   r   Nr   )r   rµ   s   "€r   r   r½   é   s   ø€ ÷ "ñ " ñ "r   c                ó:   € V P                   P                  4        R # r#   )râ   rë   rˆ   s   &r   Ú_before_executeÚ ModalEnvironment._before_executeé   s   € Ø×Ñ×ÑÖ!r   Úloginr˜   Ú
stdin_datac          	      ó@   <€ V ^8„  d   QhRS[ RS[RS[RS[ R,          /# )r   Ú
cmd_stringr3  r˜   r4  N)r+   r-   rh   )r   rµ   s   "€r   r   r½   ì   s6   ø€ ÷ Añ A¡Cð A±4ð AÉ#ð AÑadÐgkÕakñ Ar   c               ó†   a aaaaaa€ S P                   S P                  uooVV3R  lpR VVVV VVV3R llp\        WeR7      # )c                  ó^   <€ SP                  S P                  P                  4       ^R7       R# r,  )r¥   Ú	terminaterr   )rÎ   Úworkers   €€r   ÚcancelÚ*ModalEnvironment._run_bash.<locals>.cancelï   s%   ø€ Ø× Ñ  ×!2Ñ!2×!6Ñ!6Ó!8À"Ð ÖEr   c                óF   € V ^8„  d   QhR\         \        \        3,          /# r   )r,   r+   rh   )r   s   "r   r   Ú0ModalEnvironment._run_bash.<locals>.__annotate__ò   s   € ÷ 		Eñ 		Eœœs¤C˜x�ñ 		Er   c                  óX   <€ VVVVVV3R  lp SP                  V ! 4       S^,           R7      # )c               “   ó  <"  € SP                   P                  ! \        SS4      R S	/ G Rj  x€L
 p Se    \        V SSP                  4      G Rj  x€L
  \        V P                  P                  P                  4       G Rj  x€L
 4      p\        V P                  P                  P                  4       G Rj  x€L
 4      pV P                  P                  4       G Rj  x€L
 pRP                  R W3 4       4      V3#  LÎ L­ L~ LK L'5i)r˜   NÚ
c              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir#   r   )rU   Úparts   & r   rW   ÚKModalEnvironment._run_bash.<locals>.exec_fn.<locals>._do.<locals>.<genexpr>ú   s   é € Ð KÑ2B¨$Ãd§¢Ó2Bùs   ‚	�
)rû   rr   r   rw   rü   r   rý   rþ   rÿ   r›   r¬   )
Úprocessrý   rÿ   r   r6  r3  rÎ   r‰   r4  r˜   s
       €€€€€€r   Ú_doÚ8ModalEnvironment._run_bash.<locals>.exec_fn.<locals>._doó   sÌ   øé € Ø '§¡× 0Ò 0´)¸JÈÓ2NÐ `ÐX_Ñ `×`�ØÒ)Ü'¨°¸T×=SÑ=SÓT×TÐTÜ!¨¯©×(;Ñ(;×(?Ñ(?Ó(A×"AÓB�Ü!¨¯©×(;Ñ(;×(?Ñ(?Ó(A×"AÓB�Ø")§,¡,×"2Ñ"2Ó"4×4�	Ø—y‘yÑ K°6Ñ2BÓ KÓKÈYÐVÐVñ aáTÙ"AÙ"AÙ4ùsW   ƒ*D­C<®"DÁC>Á0DÂD Â4DÂ6DÂ7%DÃDÃ DÃ>DÄ DÄDÄDr—   )r¥   )rF  r6  r3  rÎ   r‰   r4  r˜   r:  s    €€€€€€€r   Úexec_fnÚ+ModalEnvironment._run_bash.<locals>.exec_fnò   s-   ø€ ÷Wò Wð ×'Ñ'©«°wÀµ|Ð'ÓDÐDr   )Ú	cancel_fn)rÓ   rÑ   r   )	r‰   r6  r3  r˜   r4  r;  rH  rÎ   r:  s	   ffddd  @@r   Ú	_run_bashÚModalEnvironment._run_bashì   s5   þ€ ØŸ-™-¨¯©ˆˆ�ö	F÷		Eö 		Eô & gÔ@Ð@r   c                ó|  a € S P                   f   R# S P                  '       d0   \        P                  R4       S P                  P	                  4        S P
                  '       dq   V 3R lp S P                  P                  V! 4       ^<R7      pV'       d@    \        S P                  V4       \        P                  RVR,          S P                  4        S P                  P                  S P                   P                  P                  4       ^R7       S P                  P                  4        R;S n         S n        R#   \         d    Rp LÀi ; i  \         d!   p\        P                  RT4        Rp?L£Rp?ii ; i  \         d     Lxi ; i  S P                  P                  4        R;S n         S n        i ; i)z>Snapshot the filesystem (if persistent) then stop the sandbox.Nz$Modal: syncing files from sandbox...c               “   ó€   <"  € S P                   P                  P                  R R7      G R j  x€L
 P                  #  L5i)N)Úttl)rÓ   Úsnapshot_filesystemrr   Ú	object_idrˆ   s   €r   Ú	_snapshotÚ+ModalEnvironment.cleanup.<locals>._snapshot  s2   øé € ð #Ÿm™m×?Ñ?×CÑCÈÐCÓM×M×XÑXÐXÑMùs   ƒ*>­<®>r—   z/Modal: saved filesystem snapshot %s for task %sr¿   z%Modal: filesystem snapshot failed: %s)rÓ   râ   rã   rä   Ú	sync_backrà   rÑ   r¥   rå   rD   rá   ræ   r9  rr   r«   rÒ   )r‰   rR  r6   Úes   f   r   ÚcleanupÚModalEnvironment.cleanupþ   sc  ø€ à�=‰=Ò ÙØ××ÐÜ�K‰KÐ>Ô?Ø×Ñ×(Ñ(Ô*Ø××ÐõYð#Ø"Ÿl™l×8Ñ8¹»ÈbÐ8ÓQ�÷ ðOÜ*¨4¯=©=¸+ÔFÜ—K‘KÐ QÐS^Ð_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? Â>E Ã?F  Ä?EÅEÅE=ÅE8Å8E=Æ FÆF ÆFÆF Æ*F;)rÒ   rà   rÓ   râ   rá   rÑ   i   )z/rooté<   NTÚdefault)r®   r¯   r°   r±   r²   Ú_stdin_modeÚ_snapshot_timeoutrü   rŠ   r  rç   ré   rê   rè   r1  rK  rV  r³   r´   Ú__classcell__)rð   rµ   s   @@r   r·   r·   ƒ   s»   ù‡ € ñ]ð €KØÐð (Ð÷/õ /ðbCÀ4ð CÐbfð CØ#÷Cò C÷ jð j÷
Nð N÷Kð K÷@ð @÷"ð "ðA¸%ð AÐPSð AÐnr÷ Aò A÷$-ò -r   r·   r#   )-r²   rŽ   r  r  Úloggingr  r  r…   Úpathlibr   Útypingr   r   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(   r7   rD   rM   rd   rw   r   r�   r·   r   r   r   Ú<module>rf     sž   ðñZó Û Û 	Û Û Û Û Ý ß *Ñ *å ,ß YÑ YÝ A÷cõ cç Gà	×	Ò	˜8Ó	$€õ6õ/õ2õõ÷õ\õ&!õZ÷*ñ *ôBW-�ö W-r   