§
    ‰eîi_  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ  e	d	¬
¦  «         G d„ d¦  «        ¦   «         Z e	d	¬
¦  «         G d„ d¦  «        ¦   «         Zdd„Zdd„Z G d„ de¦  «        ZdS )an  Shared Hermes-side execution flow for Modal transports.

This module deliberately stops at the Hermes boundary:
- command preparation
- cwd/timeout normalization
- stdin/sudo shell wrapping
- common result shape
- interrupt/cancel polling

Direct Modal and managed Modal keep separate transport logic, persistence, and
trust-boundary decisions in their own modules.
é    )ÚannotationsN)Úabstractmethod)Ú	dataclass)ÚAny)ÚBaseEnvironment)Úis_interruptedT)Úfrozenc                  ó@   — e Zd ZU dZded<   ded<   ded<   dZded	<   dS )
ÚPreparedModalExeczCNormalized command data passed to a transport-specific exec runner.ÚstrÚcommandÚcwdÚintÚtimeoutNú
str | NoneÚ
stdin_data)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   © ó    ú@/home/div/.hermes/hermes-agent/tools/environments/modal_utils.pyr   r      sD   € € € € € € àMÐMà€L€L�LØ€H€H�HØ€L€L�LØ!€JÐ!Ð!Ð!Ñ!Ð!Ð!r   r   c                  ó0   — e Zd ZU dZdZded<   dZded<   dS )ÚModalExecStartz*Transport response after starting an exec.Nz
Any | NoneÚhandleúdict | NoneÚimmediate_result)r   r   r   r   r   r   r   r   r   r   r   r   %   s;   € € € € € € à4Ð4à€FÐÐÐÑØ$(ÐÐ(Ð(Ð(Ñ(Ð(Ð(r   r   r   r   r   Úreturnc                ó¸   — dt          j        ¦   «         j        dd…         › �}||v r'dt          j        ¦   «         j        dd…         › �}||v °'| › d|› d|› d|› �S )zDAppend stdin as a shell heredoc for transports without stdin piping.ÚHERMES_EOF_Né   z << 'z'
Ú
)ÚuuidÚuuid4Úhex)r   r   Úmarkers      r   Úwrap_modal_stdin_heredocr)   -   s|   € à1�4œ:™<œ<Ô+¨B¨Q¨BÔ/Ð1Ð1€FØ
�JÐ
Ð
Ø5�tœz™|œ|Ô/°°°Ô3Ð5Ð5ˆð �JÐ
Ð
àÐ=Ð=˜FÐ=Ð= zÐ=Ð=°VÐ=Ð=Ð=r   Ú
sudo_stdinc                óZ   — dt          j        |                     ¦   «         ¦  «        › d| › �S )zFFeed sudo via a shell pipe for transports without direct stdin piping.zprintf '%s\n' z | )ÚshlexÚquoteÚrstrip)r   r*   s     r   Úwrap_modal_sudo_piper/   5   s.   € àK�Uœ[¨×):Ò):Ñ)<Ô)<Ñ=Ô=ÐKÐKÀ'ÐKÐKÐKr   c                  óÀ   — e Zd ZU dZdZdZdZded<   dZdZ		 d(ddd
œd)d„Z
d*d„Zd	dddœd+d„Zd,d„Zd-d„Zd.d„Zed/d"„¦   «         Zed0d&„¦   «         Zed1d'„¦   «         ZdS )2ÚBaseModalExecutionEnvironmentuâ  Execution flow for the *managed* Modal transport (gateway-owned sandbox).

    This deliberately overrides :meth:`BaseEnvironment.execute` because the
    tool-gateway handles command preparation, CWD tracking, and env-snapshot
    management on the server side.  The base class's ``_wrap_command`` /
    ``_wait_for_process`` / snapshot machinery does not apply here â€” the
    gateway owns that responsibility.  See ``ManagedModalEnvironment`` for the
    concrete subclass.
    Úpayloadg      Ð?Nzfloat | NoneÚ_client_timeout_grace_secondsz[Command interrupted]zModal execution errorÚ )r   r   r   r   r   r   ú
int | Noner   r   r    Údictc               óv  — |                       ¦   «          |                      ||||¬¦  «        }	 |                      |¦  «        }n6# t          $ r)}|                      | j        › d|› �¦  «        cY d }~S d }~ww xY w|j        �|j        S |j        €|                      | j        › d�¦  «        S d }| j        �#t          j
        ¦   «         |j        z   | j        z   }t          j
        ¦   «         }	|	|	dœ}
	 t          ¦   «         rG	 |                      |j        ¦  «         n# t          $ r Y nw xY w|                      | j        d¦  «        S 	 |                      |j        ¦  «        }n6# t          $ r)}|                      | j        › d|› �¦  «        cY d }~S d }~ww xY w|�|S |�]t          j
        ¦   «         |k    rF	 |                      |j        ¦  «         n# t          $ r Y nw xY w|                      |j        ¦  «        S 	 ddlm}  ||
d	¦  «         n# t          $ r Y nw xY wt          j        | j        ¦  «         �ŒI)
N©r   r   r   z: z): transport did not return an exec handle)Ú
last_touchÚstartTé‚   r   )Útouch_activity_if_duezmodal command running)Ú_before_executeÚ_prepare_modal_execÚ_start_modal_execÚ	ExceptionÚ_error_resultÚ_unexpected_error_prefixr   r   r3   ÚtimeÚ	monotonicr   r   Ú_cancel_modal_execÚ_resultÚ_interrupt_outputÚ_poll_modal_execÚ_timeout_result_for_modalÚtools.environments.baser<   ÚsleepÚ_poll_interval_seconds)Úselfr   r   r   r   Úpreparedr:   ÚexcÚdeadlineÚ_nowÚ_activity_stateÚresultr<   s                r   Úexecutez%BaseModalExecutionEnvironment.executeK   sü  € ð 	×ÒÑÔÐØ×+Ò+ØØØØ!ð	 ,ñ 
ô 
ˆð	QØ×*Ò*¨8Ñ4Ô4ˆEˆEøÝð 	Qð 	Qð 	QØ×%Ò%¨Ô)FÐ&OÐ&OÈ#Ð&OÐ&OÑPÔPÐPÐPÐPÐPÐPÐPøøøøð	Qøøøð Ô!Ð-ØÔ)Ð)àŒ<ÐØ×%Ò%ØÔ0Ð[Ð[Ð[ñô ð ð ˆØÔ-Ð9Ý”~Ñ'Ô'¨(Ô*:Ñ:¸TÔ=_Ñ_ˆHåŒ~ÑÔˆàØð
ð 
ˆð
	4ÝÑÔð AðØ×+Ò+¨E¬LÑ9Ô9Ð9Ð9øÝ ð ð ð Ø�Dðøøøà—|’| DÔ$:¸CÑ@Ô@Ð@ðUØ×.Ò.¨u¬|Ñ<Ô<��øÝð Uð Uð UØ×)Ò)¨TÔ-JÐ*SÐ*SÈcÐ*SÐ*SÑTÔTÐTÐTÐTÐTÐTÐTøøøøðUøøøð Ð!Ø�àÐ#­¬Ñ(8Ô(8¸HÒ(DÐ(DðØ×+Ò+¨E¬LÑ9Ô9Ð9Ð9øÝ ð ð ð Ø�Dðøøøà×5Ò5°hÔ6FÑGÔGÐGðØIÐIÐIÐIÐIÐIØ%Ð% oÐ7NÑOÔOÐOÐOøÝð ð ð Ø�ðøøøõ ŒJ�tÔ2Ñ3Ô3Ð3ñ=	4sq   ¯A Á
A8ÁA3Á-A8Á3A8ÄD Ä
D)Ä(D)ÅE# Å#
FÅ-FÆFÆFÆ7G Ç
GÇGÇ=H È
HÈHÚNonec                ó   — dS )z8Hook for backends that need pre-exec sync or validation.Nr   )rM   s    r   r=   z-BaseModalExecutionEnvironment._before_execute’   s   € àˆr   r8   r   c               óü   — |p| j         }|p| j        }|}| j        dk    r|nd }|�| j        dk    rt          ||¦  «        }|                      |¦  «        \  }}	|	�t          ||	¦  «        }t          ||||¬¦  «        S )Nr2   Úheredoc)r   r   r   r   )r   r   Ú_stdin_moder)   Ú_prepare_commandr/   r   )
rM   r   r   r   r   Úeffective_cwdÚeffective_timeoutÚexec_commandÚ
exec_stdinr*   s
             r   r>   z1BaseModalExecutionEnvironment._prepare_modal_exec–   s©   € ð ˜˜tœxˆØ#Ð3 t¤|ÐàˆØ#'Ô#3°yÒ#@Ð#@�Z�ZÀdˆ
ØÐ! dÔ&6¸)Ò&CÐ&CÝ3°LÀ*ÑMÔMˆLà#'×#8Ò#8¸Ñ#FÔ#FÑ ˆ�jØÐ!Ý/°¸jÑIÔIˆLå Ø ØØ%Ø!ð	
ñ 
ô 
ð 	
r   ÚoutputÚ
returncoder   c                ó   — ||dœS )N)r_   r`   r   )rM   r_   r`   s      r   rF   z%BaseModalExecutionEnvironment._result±   s   € àØ$ð
ð 
ð 	
r   c                ó.   — |                       |d¦  «        S )Né   ©rF   )rM   r_   s     r   rA   z+BaseModalExecutionEnvironment._error_result·   s   € Ø�|Š|˜F AÑ&Ô&Ð&r   c                ó6   — |                       d|› d�d¦  «        S )NzCommand timed out after Úsé|   rd   )rM   r   s     r   rI   z7BaseModalExecutionEnvironment._timeout_result_for_modalº   s"   € Ø�|Š|ÐA°wÐAÐAÐAÀ3ÑGÔGÐGr   rN   r   c                ó   — dS )z Begin a transport-specific exec.Nr   )rM   rN   s     r   r?   z/BaseModalExecutionEnvironment._start_modal_exec½   ó   € € € r   r   r   r   c                ó   — dS )z8Return a final result dict when complete, else ``None``.Nr   ©rM   r   s     r   rH   z.BaseModalExecutionEnvironment._poll_modal_execÁ   ri   r   c                ó   — dS )z.Cancel or terminate the active transport exec.Nr   rk   s     r   rE   z0BaseModalExecutionEnvironment._cancel_modal_execÅ   ri   r   )r4   )
r   r   r   r   r   r5   r   r   r    r6   )r    rU   )
r   r   r   r   r   r5   r   r   r    r   )r_   r   r`   r   r    r6   )r_   r   r    r6   )r   r   r    r6   )rN   r   r    r   )r   r   r    r   )r   r   r    rU   )r   r   r   r   rY   rL   r3   r   rG   rB   rT   r=   r>   rF   rA   rI   r   r?   rH   rE   r   r   r   r1   r1   :   sd  € € € € € € ðð ð €KØ!ÐØ26Ð!Ð6Ð6Ð6Ñ6Ø/ÐØ6Ðð
 ðE4ð
 #Ø!%ðE4ð E4ð E4ð E4ð E4ð E4ðNð ð ð ð Ø"Ø!%ð
ð 
ð 
ð 
ð 
ð 
ð6
ð 
ð 
ð 
ð'ð 'ð 'ð 'ðHð Hð Hð Hð ð/ð /ð /ñ „^ð/ð ðGð Gð Gñ „^ðGð ð=ð =ð =ñ „^ð=ð =ð =r   r1   )r   r   r   r   r    r   )r   r   r*   r   r    r   )r   Ú
__future__r   r,   rC   r%   Úabcr   Údataclassesr   Útypingr   rJ   r   Útools.interruptr   r   r   r)   r/   r1   r   r   r   ú<module>rr      s†  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø *Ð *Ð *Ð *Ð *Ð *ð €�$ÐÑÔð"ð "ð "ð "ð "ñ "ô "ñ Ôð"ð €�$ÐÑÔð)ð )ð )ð )ð )ñ )ô )ñ Ôð)ð>ð >ð >ð >ðLð Lð Lð Lð
M=ð M=ð M=ð M=ð M= Oñ M=ô M=ð M=ð M=ð M=r   