Ë
    ãß²jñ%  ã                  ó¢   — d Z ddlmZ ddlZ ej                  dej
                  «      Zdd„Zdd„Zdd„Z	dd„Z
dd	„Z	 	 	 	 	 	 	 	 	 	 dd
„Zdd„Zy)a¬  Conservative heredoc masking for shell-command scanners ('&' guard, blocked-command checks,
cron lifecycle_guard) that false-positive on heredoc *bodies*. Stripping every body is unsafe the
other way (a fake ``<<`` in quotes can swallow an operator; unquoted bodies expand; ``bash <<'EOF'``
executes), so a body is masked ONLY when every delimiter is quoted, every heredoc has an exact
terminator line, the owning simple command is an allowlisted non-shell interpreter, and no list
operator follows the heredoc. Otherwise the command is returned untouched: a false positive is
acceptable, hiding shell syntax from a guard is not.
Masked bodies keep their newline count (re.MULTILINE).é    )ÚannotationsNzq^\s*(?:[A-Z_][A-Z0-9_]*=\S+\s+)*(?:env\s+)?(?:[A-Za-z0-9_./-]+/)?(?:python(?:3(?:\.\d+)*)?|osascript|cat)(?=\s|$)c                ó¤   — |dz   }|t        | «      k  r<| |   |k(  r|dz   S || |   dk(  r|dz   t        | «      k  rdndz  }|t        | «      k  rŒ<|S )z>Index just past the backslash-aware span opened at ``cursor``.é   ú\é   ©Úlen)ÚcommandÚcursorÚcloserÚends       ú8/home/ubuntu/.hermes/hermes-agent/tools/shell_heredoc.pyÚ	_span_endr      sg   € à
�1‰*€CØ
”�G“Ò
Ø�3‰<˜6Ò!Ø˜‘7ˆNØ�G˜C‘L DÒ(¨S°1©W´s¸7³|Ò-C‰qÈÑJˆð ”�G“Ó
ð €Jó    c                óø  — g }d}|t        | «      k  rØ| |   }|dv r�|dk(  r| j                  d|dz   «      dz   nt        | |d«      }| || }|j                  |«      s|j	                  | |d «       nz|dk(  xr
 d|v xs d|v }|j	                  |r|n|d	z  «       |}n?|dk(  r$t        | |d«      }|j	                  | || «       |}n|j	                  |«       |dz  }|t        | «      k  rŒØd
j                  |«      S )zDBlank inert quoted spans; keep ``$(``/backtick-bearing ones visible.r   ú'"ú'r   ú"Nú$(ú`r   Ú )r	   Úfindr   ÚendswithÚappendÚjoin)r
   Úresultr   Úcharr   ÚsegmentÚkeeps          r   Ú_mask_simple_quotesr        s  € à€FØ€FØ
”3�w“<Ò
Ø�v‰ˆØ�5‰=Ø8<Àº�7—<‘<  V¨a¡ZÓ0°1Ò4Ü! '¨6°3Ó7ð à˜f SÐ)ˆGØ×#Ñ# DÔ)Ø—‘˜g f gÐ.Ô/ØØ˜3‘;ÒF D¨G OÒ$E°s¸g°~ˆDØ�M‰M¡T™'¨t°a©xÔ8Ø‰FØ�SŠ[Ü˜G V¨SÓ1ˆCØ�M‰M˜' &¨Ð-Ô.Ø‰Fà�M‰M˜$ÔØ�a‰KˆFð% ”3�w“<Ó
ð& �7‰7�6‹?Ðr   c                óð  — | j                  d|«      r| j                  d|«      ry| j                  d|dz   «      }|r|dz   n|dz   }|t        | «      k  r"| |   dv r|dz  }|t        | «      k  r| |   dv rŒ|t        | «      k\  s| |   d	v ryg }d
}|t        | «      k  �r>| |   j                  «       �s*| |   dv �s"| |   }|dk(  r;|dz   t        | «      k\  s
| |dz      d	v ryd}|j                  | |dz      «       |dz  }n³|dv r™d}|dz  }|t        | «      k  ro| |   |k7  rg| |   }|d	v ry|dk(  r+|dk(  r&|dz   t        | «      k\  ry| |dz      dv r
|dz  }| |   }|j                  |«       |dz  }|t        | «      k  r	| |   |k7  rŒg|t        | «      k\  ry|dz  }n|j                  |«       |dz  }|t        | «      k  r| |   j                  «       s	| |   dv s�Œ"|s|sy|dj	                  |«      ||fS )zRParse one ``<<`` opener -> ``(end_index, delimiter, strip_tabs, quoted)`` or None.ú<<ú<<<NÚ-r   é   z 	r   z
Fz;&|<>()r   Tr   r   z$`"\
r   )Ú
startswithr	   Úisspacer   r   )r
   ÚindexÚ
strip_tabsr   Ú	delimiterÚquotedr   Úcurrents           r   Ú_parse_heredoc_operatorr-   :   sV  € à×Ñ˜d EÔ*¨g×.@Ñ.@ÀÈÔ.NØØ×#Ñ# C¨°©Ó3€JÙ$ˆU�QŠY¨%°!©)€FØ
”3�w“<Ò
 G¨F¡O°uÑ$<Ø�!‰ˆð ”3�w“<Ò
 G¨F¡O°uÒ$<à”�W“Ò ¨¡°FÑ!:ØØ€IØ€FØ
”3�w“<Ó
¨°©×)@Ñ)@Õ)BÀgÈfÁoÐYbÒFbØ�v‰ˆØ�4Š<Ø˜‰zœS ›\Ò)¨W°V¸a±ZÑ-@ÀFÑ-JØØˆFØ×Ñ˜W V¨a¡ZÑ0Ô1Ø�a‰K‰FØ�U‰]ØˆFØ�a‰KˆFØœ3˜w›<Ò'¨G°F©O¸tÒ,CØ! &™/�Ø˜fÑ$ØØ˜3’; 7¨d¢?Ø ‘z¤S¨£\Ò1Ø#Ø˜v¨™zÑ*¨iÑ7Ø !™˜Ø")¨&¡/˜Ø× Ñ  Ô)Ø˜!‘�ð œ3˜w›<Ò'¨G°F©O¸tÓ,Cð œ˜W›Ò%ØØ�a‰K‰Fà×Ñ˜TÔ"Ø�a‰KˆFð9 ”3�w“<Ò
¨°©×)@Ñ)@Ô)BÀgÈfÁoÐYbÓFbñ: ™VØØ�2—7‘7˜9Ó% z°6Ð9Ð9r   c                óf   — |r| |dz
     nd}|dz   t        | «      k  r| |dz      nd}|dv xs |dk(  S )zNReturn whether ``&`` at ``index`` belongs to ``>&``/``<&``/``&>`` redirection.r   r   z<>Ú>r   )r
   r(   ÚbeforeÚafters       r   Ú_is_fd_redirect_ampersandr2   h   sF   € á#(ˆW�U˜Q‘YÒ¨b€FØ"'¨!¡)¬c°'«lÒ":ˆG�E˜A‘IÒÀ€EØ�Tˆ>Ò)˜U c™\Ð)r   c                ó|  — |}d}d}g }d}d}|}|t        | «      k  �r| |   }	|	dk(  r|s|€�n	|	dk(  xr |dk7  xr | xr |dz   t        | «      k  }
|s|€|
r|	|k(  rd}||
rdndz  }n¾|	dv r|	}|dz  }n²|	d	k(  r-||k(  s | |dz
     j                  «       s
| |dz
     d
v rd}|dz  }n€| j                  d|«      r|dz  }nh| j                  d|«      r2t        | |«      }|€d}|dz  }n@|\  }}}}|j	                  |||f«       n$|	dv r|	dk(  rt        | |«      s
|rd}n|dz   }|dz  }|t        | «      k  r�Œ|||||fS )a.  Scan one logical command.

    Return ``(end, specs, unknown_operator, post_heredoc_list_operator, owner_start)``.
    List operators before the first heredoc select the simple command that owns it. A list
    operator after a heredoc keeps the body visible because another command may consume it.
    NFÚ
r   r   r   r   z'"`ú#z;&|()Tr#   r%   r"   z;|&ú&)r	   r'   r&   r-   r   r2   )r
   Ústartr   ÚquoteÚcommentÚspecsÚunknown_operatorÚpost_heredoc_list_operatorÚowner_startr   ÚescapedÚparsedr*   r)   r+   s                  r   Ú_scan_heredoc_command_unitr@   o   s·  € ð €FØ€EØ€GØ€EØÐØ!&ÐØ€KØ
”3�w“<Ó
Ø�v‰ˆØ�4Š<™W¨¨Ùà˜$‘,Ò] 5¨C¡<Ò]¸°KÒ]ÀFÈQÁJÔQTÐU\ÓQ]ÑD]ˆÙ�eÐ'©7Ø�uŠ}Ø�Ø™7‘a¨Ñ)‰FØ�V‰^ØˆEØ�a‰K‰FØ�SŠ[˜f¨šo°¸À!¹Ñ1D×1LÑ1LÔ1NØ!(¨°!©Ñ!4¸Ñ!?ØˆGØ�a‰K‰FØ×Ñ  vÔ.Ø�a‰K‰FØ×Ñ  fÔ-Ü,¨W°fÓ=ˆFØˆ~Ø#'Ð Ø˜!‘‘à8>Ñ5�˜	 :¨vØ—‘˜i¨°VÐ<Õ=à�u‰}Ø˜’Ô 9¸'À6Ô JáØ15Ñ.à"(¨1¡*�KØ�a‰KˆFðG ”3�w“<Ô
ðH �5Ð*Ð,FÈÐSÐSr   c                óæ   — |}	 | j                  d|«      }|dk(  rt        | «      n|dz   }| || j                  d«      j                  d«      }|r|j                  d«      n|}||k(  r|S |dk(  ry|}Œo)zAReturn the position after an exact shell heredoc terminator line.r4   éÿÿÿÿr   úú	N)r   r	   ÚremovesuffixÚlstrip)	r
   Ú
body_startr*   r)   r   Únewliner1   ÚlineÚ	candidates	            r   Ú_find_heredoc_closerK   ¤   s†   € ð €FØ
Ø—,‘,˜t VÓ,ˆØ '¨2¢”�G”°7¸Q±;ˆØ�v˜eÐ$×1Ñ1°$Ó7×DÑDÀTÓJˆÙ)3�D—K‘K Ô%¸ˆ	Ø˜	Ò!ØˆLØ�bŠ=ØØˆð r   c           	     ó¢  ‡— d| vr| S | j                  d«      }g }d}||k  rêt        | |«      \  }}}}}|r| S |s|t        | «      k\  rnÃ|dz   }Œ2|t        | «      k\  r| S |dz   }	g }
|D ]/  \  }}}t        | |	||«      }|€| c S |
j	                  |	|f«       |}	Œ1 t        d„ |D «       «      rX|sVt        | || «      Št        | || «      }t        ˆfd„dD «       «      s&t        j                  |«      r|j                  |
«       |	}||k  rŒêg }d}|D ]%  \  }}|| || d| j                  d||«      z  gz  }|}Œ' d	j                  |«      | |d z   S )
zHMask heredoc bodies that are provably inert data (see module docstring).r"   r   r   Nc              3  ó(   K  — | ]
  \  }}}|–— Œ y ­w©N© )Ú.0Ú
_delimiterÚ_strip_tabsr+   s       r   ú	<genexpr>z-strip_inert_heredoc_bodies.<locals>.<genexpr>Ö   s   è ø€ ÒDÑ:˜: {°F”ÑDùs   ‚c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wrN   rO   )rP   ÚmarkerÚmasked_openers     €r   rS   z-strip_inert_heredoc_bodies.<locals>.<genexpr>Û   s   øè ø€ ò àð ˜-Ô'ñùs   ƒ)r   r   z<(z>(ú(ú)ú{ú}r4   r   )Úrfindr@   r	   rK   r   Úallr    ÚanyÚ_INERT_HEREDOC_CONSUMER_REÚsearchÚextendÚcountr   )r
   Úlast_opener_indexÚrangesÚcommand_startÚcommand_endr:   r;   r<   r=   Úbody_cursorÚbody_rangesr*   r)   Ú_quotedÚ	close_endÚmasked_ownerÚpartsÚpreviousr7   r   rV   s                       @r   Ústrip_inert_heredoc_bodiesrm   ´   sÂ  ø€ ð �7ÑØˆØŸ™ dÓ+ÐØ$&€FØ€MØ
Ð,Ò
,ô ' w°Ó>ñ	
ØØØØ&ØáØˆNÙØœc '›lÒ*ØØ'¨!™OˆMØØœ#˜g›,Ò&ØˆNØ! A‘oˆØ-/ˆØ.3ò 	$Ñ*ˆI�z 7Ü+¨G°[À)ÈZÓXˆIØÐ Ø’Ø×Ñ ¨YÐ7Ô8Ø#‰Kð	$ô ÑD¸eÔDÔDÙ.ä/°¸ÀkÐ0RÓSˆMÜ.¨w°{À;Ð/OÓPˆLÜó àIôô ô -×3Ñ3°LÔAØ—‘˜kÔ*Ø#ˆðI Ð,Ó
,ðL €EØ€HØò ‰
ˆˆsØ�'˜( 5Ð)¨4°'·-±-ÀÀeÈSÓ2QÑ+QÐRÑRˆØ‰ðð �7‰7�5‹>˜G H IÐ.Ñ.Ð.r   )r
   Ústrr   Úintr   rn   Úreturnro   )r
   rn   rp   rn   )r
   rn   r(   ro   )r
   rn   r(   ro   rp   Úbool)r
   rn   r7   ro   )
r
   rn   rG   ro   r*   rn   r)   rq   rp   z
int | None)Ú__doc__Ú
__future__r   ÚreÚcompileÚ
IGNORECASEr^   r   r    r-   r2   r@   rK   rm   rO   r   r   ú<module>rw      s   ðñ:õ #ã 	ð (˜RŸZ™Zð8à‡M�MóÐ óóó4+:ó\*ó2TðjØðØ"%ðØ25ðØCGðØLVóô 3/r   