+
    „WÝj9d  ã                  ó  € R t ^ RIH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 ^ RIHtHtHtHt ^ RIHtHt ^ RIHt ]P.                  ! R4      tR	 t]! 0 RDm4      tRER
 R lltR R ltR R ltR R ltR R lt RFR R llt!R R lt"R t#R R lt$]PJ                  ! R4      t&]PJ                  ! R4      t']PJ                  ! R4      t(]PJ                  ! R4      t)]PJ                  ! R4      t*R t+R!t,R"t-],]-,           t.]PJ                  ! R#4      t/RFR$ R% llt0RFR& R' llt1RGR( R) llt2RFR* R+ llt3R, R- lt4R. R/ lt5R0 R1 lt6R2R/R3 R4 llt7R5 R6 lt8R7 R8 lt9R9 t:R: t;R; R< lt<R=^/R> R? llt=R@ RA lt>RFRB RC llt?R# )Hal  Classic-CLI terminal input helpers: file-drop/attachment path resolution, bracketed-paste patching, extended Enter-key sequences, CPR leak guards and TUI input-height estimation.

Split out of ``cli.py``; ``cli`` re-exports every public name and moved bodies late-bind
cli-level names through ``from cli import ...`` at call time so facade monkeypatch seams hold.
)ÚannotationsN)Úsuppress)ÚPath)ÚDictÚAnyÚOptionalÚMapping)ÚunquoteÚurlparse©ÚtÚclic                 ó   € ^ RI p V # )z]Late import of the ``cli`` facade: mutable CLI module state (and its test seams) lives there.N©r   r   s    ÚQC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\cli_terminal_input.pyÚ_clir      s
   € ãà€Jó    c               ó    € V ^8„  d   QhRRRR/# )é   ÚfilenameÚstrÚreturn© )Úformats   "r   Ú__annotate__r   '   s   € ÷ 3ñ 3¨ð 3¸Sñ 3r   c                óÀ   € \         P                  P                  R4      RRR.pV F1  p\         P                  P                  V4      '       g   K*  V RV  2u # 	  RV  2# )zCReturn a realistic example media path for the current Termux setup.z~/storage/sharedz/sdcardz/storage/emulated/0z/storage/self/primaryz
/Pictures/z~/storage/shared/Pictures/)ÚosÚpathÚ
expanduserÚisdir)r   Ú
candidatesÚroots   &  r   Ú_termux_example_image_pathr"   '   sf   € ô 	�‰×ÑÐ-Ó.ØØØð	€Jó ˆÜ�7‰7�=‰=˜×ÔØ�V˜: h ZÐ0Ò0ñ ð (¨ zÐ2Ð2r   c               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r   ztuple[str, str]r   )r   s   "r   r   r   6   s   € ÷ <ñ <˜3ð < ?ñ <r   c                ó¦  € \        T ;'       g    R4      P                  4       p V '       g   R# V ^ ,          R9   d‡   V ^ ,          p^pV\        V 4      8  da   W,          pVR8X  d#   V^,           \        V 4      8  d   V^,          pKA  W18X  d   V ^V W^,           R P                  4       3# V^,          pKp  V R,          R3# ^ pV\        V 4      8  dY   W,          pVR8X  d7   V^,           \        V 4      8  d    W^,           ,          R8X  d   V^,          pKU  VR8X  d   MV^,          pKh  V RV P                  RR4      WR P                  4       3# )	zXSplit a leading path token (quoted or with ``\ `` escapes) from trailing free-form text.Ú Ú\Nºé   NNÚ ú\ )r&   r&   ¾   Ú"Ú')r   ÚstripÚlenÚreplace)r$   ÚquoteÚposÚchs   &   r   Ú_split_path_inputr5   6   s-  € ä
ˆc�iˆi�R‹.×
Ñ
Ó
 €CßØˆà
ˆ1…v�ÔØ�A•ˆØˆØ”C˜“HŒnØ•ˆBØ�TŒz˜c A�g¬¨C«Ô0Ø�q•�ÙØŒ{Ø˜1˜S�z 3¨Q¥w y >×#7Ñ#7Ó#9Ð9Ð9Ø�1�HŠCØ�2�w˜ˆ{Ðà
€CØ
”�C“Œ.Ø�XˆØ�Œ:˜# �'¤C¨£HÔ,°¸1µWµÀÔ1DØ�1�HŠCØ�3ŒYØà�1�HŠCàˆt�ˆ9×Ñ˜U CÓ(¨#¨d¨)¯/©/Ó*;Ð;Ð;r   c               ó    € V ^8„  d   QhRRRR/# )r   Úraw_pathr   r   zPath | Noner   )r   s   "r   r   r   V   s   € ÷ 3ñ 3 sð 3¨{ñ 3r   c                ó:  € \        T ;'       g    R4      P                  4       pV'       g   R# V^ ,          VR,          8X  d"   V^ ,          R9   d   V^R P                  4       pVP                  RR4      pV'       g   R# TpVP                  R4      '       dÝ    \	        V4      pVP
                  R8X  dÀ   \        VP                  ;'       g    R4      pVP                  '       d(   \        P                  R8X  d   RVP                   V 2pMg\        P                  R8X  dS   \        V4      ^8¼  dC   V^ ,          R	8X  d5   V^,          P                  4       '       d   V^,          R
8X  d
   VR,          p\        P                  P                  \        P                  P                  V4      4      p\        P                  R8w  d€   VP                  RR	4      p\        V4      ^8¼  d^   V^,          R
8X  dP   V^,          R	8X  dB   V^ ,          P                  4       '       d%   RV^ ,          P!                  4        R	VR,           2p\#        V4      pVP%                  4       '       g<   \#        \        P&                  ! R\        P(                  ! 4       4      4      pWe,          p VP+                  4       p VP-                  4       '       d   VP/                  4       '       g   R#  V#   \         d    Tp ELi ; i  \         d    Tp LUi ; i  \0         d     R# i ; i)z¤Resolve a user-supplied attachment path (quotes, ``~``, env vars, ``file://``; relative to TERMINAL_CWD).

Returns ``None`` unless it resolves to an existing file.
r&   Nr+   r*   úfile://ÚfileÚntz//Ú/Ú:r(   r'   z/mnt/:é   NNÚTERMINAL_CWDéÿÿÿÿr,   )r   r/   r1   Ú
startswithr
   Úschemer	   r   Únetlocr   Únamer0   ÚisalphaÚ	ExceptionÚ
expandvarsr   Úlowerr   Úis_absoluteÚgetenvÚgetcwdÚresolveÚexistsÚis_fileÚOSError)r7   ÚtokenÚexpandedÚparsedÚ
normalizedr   Úbase_dirÚresolveds   &       r   Ú_resolve_attachment_pathrV   V   s‚  € ô
 �—�˜BÓ×%Ñ%Ó'€EßÙàˆQ…x�5˜•9Ô  q¥¨ZÔ!7Ø�a˜�×!Ñ!Ó#ˆØ�M‰M˜% Ó%€EßÙà€HØ×Ñ˜	×"Ò"ð	Ü˜e“_ˆFØ�}‰} Ô&Ü" 6§;¡;×#4Ð#4°"Ó5�Ø—=—=�=¤R§W¡W°¤_Ø!# F§M¡M ?°8°*Ð=‘HÜ—W‘W ”_¬¨X«¸!Ô);ÀÈÅÈsÔ@RÐW_Ð`aÕWb×WjÑWj×WlÒWlÐqyÐz{Õq|ð  ADô  rDð  (¨�|�Hô �w‰w×!Ñ!¤"§'¡'×"4Ñ"4°XÓ">Ó?€HÜ	‡w�w�$„Ø×%Ñ% d¨CÓ0ˆ
Üˆz‹?˜aÔ J¨q¥M°SÔ$8¸ZÈ½]ÈcÔ=QÐV`ÐabÕVc×VkÑVk×VmÒVmØ˜z¨!�}×2Ñ2Ó4Ð5°Q°zÀ"µ~Ð6FÐGˆHÜ�‹>€DØ×Ñ×ÒÜœŸ	š	 .´"·)²)³+Ó>Ó?ˆØ�ˆðØ—<‘<“>ˆðØ�‰× Ò ¨×(8Ñ(8×(:Ò(:Ùð );ð €Oøô1 ô 	Ø‹Hð	ûô ô ØŠðûô ô ÚðúsU   Â3K$ ÃK$ Ã'&K$ ÄAK$ ÅK$ Ê"K8 Ê3L Ë	L Ë$K5Ë4K5Ë8LÌLÌLÌLc               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   Ú	remainderr   r   Údictr   )r   s   "r   r   r   Œ   s&   € ÷ hñ h˜Dð h¨Sð h°Tñ hr   c                óT   € ^ RI Hp RV RV P                  P                  4       V9   RV/# )é    )Ú_IMAGE_EXTENSIONSr   Úis_imagerX   )r   r\   ÚsuffixrH   )r   rX   r\   s   && r   Ú_file_drop_resultr_   Œ   s-   € Ý%Ø�D˜* d§k¡k×&7Ñ&7Ó&9Ð=NÑ&NÐP[Ð]fÐgÐgr   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
user_inputr   r   zdict | Noner   )r   s   "r   r   r   ‘   s   € ÷ #3ñ #3 #ð #3¨+ñ #3r   c                ót  € ^ RI HpHpHp \	        V \
        4      '       g   R# V P                  4       pV'       g   R# VR,          R	9   pV'       d
   VR,          MTpVP                  R
4      ;'       g~    V'       * ;'       d    VP                  R4      ;'       gV    \        V4      ^8¬  ;'       d@    V^,          R8H  ;'       d,    V^,          R9   ;'       d    V^ ,          P                  4       pV'       g   R# V! V4      pVe
   V! VR4      # V! V4      w  ršV! V	4      pVf€   RV9   dy   V'       gq   \        \        V4       UUu. uF  w  rÍVR8X  g   K  VNK  	  upp4       F;  pV! VRV P                  4       4      pVf   K"  WN^,           R P                  4       p
 M	  Vf   R# V! Wº4      # u uppi )zjDetect a dragged/pasted file path at the start of *user_input* -> ``{path, is_image, remainder}`` or None.)r_   rV   r5   N:Nr)   Nr(   r9   r=   r&   r*   r,   )r<   Ú~z./z../>   r<   r'   )r   r_   rV   r5   Ú
isinstancer   r/   rA   r0   rE   ÚreversedÚ	enumerateÚrstrip)ra   r_   rV   r5   ÚstrippedÚquotedÚunquotedÚstarts_like_pathÚdirect_pathÚfirst_tokenrX   Ú	drop_pathÚidxr4   r3   s   &              r   Ú_detect_file_droprp   ‘   s¢  € çRÑRÜ�j¤#×&Ò&Ùà×ÑÓ!€HßÙð �b�\˜ZÑ'€Fß%ˆx˜Ž|¨8€Hà×ÑÐ3Ó4÷ 	pð 	pØŒJ×9Ð9˜8×.Ñ.¨yÓ9÷	pð 	pä�‹M˜QÑ×nÐn 8¨A¥;°#Ñ#5×nÐn¸(À1½+ÈÑ:T×nÐnÐYaÐbcÕYd×YlÑYlÓYnð ÷
 Ùá*¨8Ó4€KØÒÙ  ¨bÓ1Ð1á.¨xÓ8Ñ€KÙ(¨Ó5€IØÒ˜S Hœ_·VÜ´	¸(Ô0CÔQÑ0C¡W SÀrÈSÁyŸS˜SÑ0CÒQÖRˆCÙ0°¸$¸3°×1FÑ1FÓ1HÓIˆIØÔ$Ø$¨1¥W YÐ/×5Ñ5Ó7�	Ùñ	 Sð
 ÒÙÙ˜YÓ2Ð2ùó Rs   Å	F4
ÅF4
c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   Úattached_imagesz
list[Path]Úimage_counterÚintÚwidthz
int | Noner   r   r   )r   s   "r   r   r   ·   s1   € ÷ qñ q°Zð qÐPSð qÐ\fð qÐruñ qr   c                óf  a€ V '       g   R# T;'       g!    \         P                  ! R4      P                  pR R lpV^48  dE   \        V 4      ^8X  d   RV! V ^ ,          P                  ^4       R2# \        R\        V 4      R7      # V^P8  d`   \        V 4      ^8X  d   RV! V ^ ,          P                  ^ 4       R2# RV! V ^ ,          P                  ^4       R\        V 4      ^,
           R2# V\        V 4      ,
          ^,           oR	P                  V3R
 l\        \        V 4      4       4       4      # )zZAttached-image badge row: compact summary on narrow terminals, per-image badges otherwise.r&   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rD   r   Úlimitrt   r   r   )r   s   "r   r   Ú5_format_image_attachment_badges.<locals>.__annotate__¾   s&   € ÷ Qñ Q�Sð Q ð Q¨ñ Qr   c                ó`   € \        V 4      V8:  d   V # V R \        ^V^,
          4       R,           # )Nz...)r0   Úmax)rD   rx   s   &&r   Ú_truncÚ/_format_image_attachment_badges.<locals>._trunc¾   s0   € Ü˜4“y EÔ)ˆtÐP¨tÐ4G´c¸!¸UÀQ½YÓ6GÐ/HÈ5Õ/PÐPr   u   [ðŸ“Ž Ú]zcli.terminal.image_badge_count)Úcountz] [+r*   c              3  óL   <"  € T F  p\        R SV,           R7      x € K  	  R# 5i)z!cli.terminal.image_badge_numbered)ÚindexNr   )Ú.0ÚiÚbases   & €r   Ú	<genexpr>Ú2_format_image_attachment_badges.<locals>.<genexpr>Ì   s"   øé € ÐpÑToÈq”AÐ9ÀÈÅ×JÑJÓToùs   ƒ!$)éP   é   )ÚshutilÚget_terminal_sizeÚcolumnsr0   rD   r   ÚjoinÚrange)rr   rs   ru   r|   r„   s   &&& @r   Ú_format_image_attachment_badgesrŽ   ·   s  ø€ çÙà×?Ð?”V×-Ò-¨hÓ7×?Ñ?€EõQð ˆr„zÜˆÓ 1Ô$Ø™F ?°1Õ#5×#:Ñ#:¸BÓ?Ð@ÀÐBÐBÜÐ1¼¸_Ó9MÔNÐNàˆr„zÜˆÓ 1Ô$Ø™F ?°1Õ#5×#:Ñ#:¸BÓ?Ð@ÀÐBÐBØ™˜¨qÕ1×6Ñ6¸Ó;Ð<¸DÄÀ_ÓAUÐXYÕAYÐ@ZÐZ[Ð\Ð\àœ3˜Ó/Õ/°!Õ3€DØ�8‰8ÔpÔTYÔZ]Ð^mÓZnÔToÓpÓpÐpr   c               ó    € V ^8„  d   QhRRRR/# )r   Úpasted_textr   r   Úboolr   )r   s   "r   r   r   Ï   s   € ÷ #ñ #¸cð #Àdñ #r   c                ó,   € V P                  4       '       * # )z@Auto-attach clipboard images only for image-only paste gestures.)r/   )r�   s   &r   Ú,_should_auto_attach_clipboard_image_on_paster“   Ï   s   € à× Ñ Ó"Ô"Ð"r   c                ó2  €  Ve?   \        VR4      '       d-   VP                  VP                  8  d   VP                  Vn        YY4T3pY‰Y«T3p T ! . TOTNTNTOTN5!  #   \         d     L)i ; i  \        \        3 d    T ! . TORNRNTO^ N5!  u # i ; i)aF  prompt_toolkit ``_output_screen_diff`` with resize guards.

Inflates ``previous_screen.height`` when the new screen is taller so pt skips the
cursor move that stamps chrome into scrollback; on a corrupt previous paint buffer
(tmux re-attach) retries once as a first paint instead of crashing the loop.

1. 2. On AttributeError/TypeError from a corrupt previous paint buffer (classic after tmux attach with
same width), retry once with ``previous_screen=None`` so pt first-paints cleanly instead of crashing the
event loop with ``'cell' object has no attribute 'char'``. See #26137.
NÚheight)Úhasattrr•   rF   ÚAttributeErrorÚ	TypeError)Úorig_osdÚappÚoutputÚscreenÚcurrent_posÚcolor_depthÚprevious_screenÚ
last_styleÚis_doneÚfull_screenÚattrs_for_style_stringÚstyle_string_has_styleÚsizeÚprevious_widthÚcommonÚtails   &&&&&&&&&&&&&&  r   Ú_hermes_call_output_screen_diffr©   Ô   sÊ   € ðØÒ&¬7°?ÀH×+MÒ+MÐRa×RhÑRhÐkq×kxÑkxÔRxØ%+§]¡]ˆOÔ"ð ˜6°Ð<€FØÐ"8ÐRVÐW€Dð7ÙÐT˜ÐT ÐT°*ÐT¸tÐTÀ^ÓTÐTøô ô Ùðûô œIÐ&ô 7ñ Ð6˜Ð6 Ð6 tÐ6¨dÐ6°AÓ6Ò6ð7ús$   ‚AA  ÁA1 Á A.Á-A.Á1"BÂBc               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r   r   ò   s   € ÷ <Gñ <G¨dñ <Gr   c                 ó8  aaaa€  ^ RI Hu Hp  ^ RIHo ^ RIHo \        V RR4      '       d   R# RoR VVVV3R lloSV P                  n	        R	V n
        \        P                  R
4       R#   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)z¸Patch ``Vt100Parser.feed`` to flush a bracketed paste whose ESC[201~ end mark never arrives.

Without it a dropped end mark (SSH glitch, sleep/wake) freezes input forever. Idempotent.
N)ÚKeys)ÚKeyPressÚ_hermes_bp_timeout_patchedFg       @c               ó    € V ^8„  d   QhRRRR/# )r   Údatar   r   r¬   r   )r   s   "r   r   Ú:_apply_bracketed_paste_timeout_patch.<locals>.__annotate__  s   € ÷ '	6ñ '	6°3ð '	6¸4ñ '	6r   c                ó®  <€ V P                   '       Edr   V ;P                  V,          un        R pW P                  9   d•   V P                  P                  V4      pV P                  RV pV P                  S! SP                  V4      4       RV n         V P                  V\        V4      ,           R pRV n        RV n        V'       d   S! W4       R# R# \        V RR4      p\        P                  ! 4       pVf	   Wpn        R# Wv,
          S
8”  dv   V P                  pRV n         RV n        RV n        V'       dK   V P                  S! SP                  V4      4       \        P                  RWv,
          \        V4      4       R# R# R# \        V4       F@  w  r‰V P                   '       d   S! WVR 4        R# V P                  P                  V	4       KB  	  R# )z[201~NFr&   Ú_hermes_bp_startuw   Bracketed-paste timeout (%.1fs) â€” flushed %d bytes without end mark. Terminal may have dropped ESC[201~ (see #16263).)Ú_in_bracketed_pasteÚ_paste_bufferr�   Úfeed_key_callbackÚBracketedPaster0   rµ   ÚgetattrÚtimeÚ	monotonicÚloggerÚwarningrf   Ú_input_parserÚsend)Úself_parserr²   Úend_markÚ	end_indexÚpaste_contentÚ	remainingÚbp_startÚnowrƒ   ÚcÚ_BP_TIMEOUT_SÚ_PtKeyPressÚ_PtKeysÚ_patched_vt100_feeds   &&        €€€€r   rÌ   ÚA_apply_bracketed_paste_timeout_patch.<locals>._patched_vt100_feed  sš  ø€ Ø×.×.Ñ.Ø×)Ò)¨TÕ1Õ)Ø&�à×8Ñ8Ô8Ø +× 9Ñ 9× ?Ñ ?ÀÓ I�IØ$/×$=Ñ$=¸j¸yÐ$I�MØ×1Ñ1±+¸g×>TÑ>TÐVcÓ2dÔeØ6;�KÔ3Ø +× 9Ñ 9¸)ÄcÈ(ÃmÕ:SÐ:TÐ U�IØ02�KÔ-Ø37�KÔ0ß Ù+¨KÖCñ !ô  ' {Ð4FÈÓM�HÜŸ.š.Ó*�CØÒ'Ø7:Ö4Ø�¨-Ô7Ø(3×(AÑ(A˜Ø:?˜Ô7Ø46˜Ô1Ø7;˜Ô4ß(Ø'×9Ñ9¹+Àg×F\ÑF\Ð^kÓ:lÔmÜ"ŸN™Nð!0ð !$¥´°MÓ0Bö	ñ )ñ 8ô & džO‘D�AØ"×6×6Ð6Ù+¨K¸a¸b¸ÔBÚØ×-Ñ-×2Ñ2°1Ö5ó	 ,r   Tz:Applied Vt100Parser bracketed-paste timeout patch (#16263)z)Bracketed-paste timeout patch skipped: %s)Ú!prompt_toolkit.input.vt100_parserÚinputÚvt100_parserÚprompt_toolkit.keysr®   Ú(prompt_toolkit.key_binding.key_processorr¯   rº   ÚVt100ParserÚfeedr°   r½   ÚdebugrF   )Ú
_vt100_modÚexcrÉ   rÊ   rË   rÌ   s     @@@@r   Ú$_apply_bracketed_paste_timeout_patchrØ   ò   s�   û€ ð
7Gß>Ð>Ý7ÝTä�:Ð;¸U×CÒCÙàˆ÷'	6ó '	6ðR ':ˆ
×ÑÔ#Ø04ˆ
Ô-Ü�‰ÐQÖRøÜô GÜ�‰Ð@À#×FÒFûðGús   †'A- °;A- Á-BÁ8BÂBz\x1b\[\d+;\d+Rz\^\[\[\d+;\d+Rz\x1b\[<\d+;\d+;\d+[Mm]z\^\[\[<\d+;\d+;\d+[Mm]z<\d+;\d+;\d+[Mm]zK[?1006l[?1003l[?1002l[?1000l[?1004l[?2004l[?1049l[<u[>4m[0m[?25hz[>1uz[>4;2mz	\\[ \t]*$c               ó    € V ^8„  d   QhRRRR/# ©r   ÚenvzOptional[Mapping[str, str]]r   r‘   r   )r   s   "r   r   r   _  s   € ÷ 
~ñ 
~Ð9ð 
~ÀTñ 
~r   c                ó
  € V f   \         P                  MT p V P                  R4      ;'       g    RP                  4       R8H  ;'       g;    V P                  R4      ;'       g    RP                  4       P	                  4       R8H  # )a'  Whether the terminal is Ghostty.

Ghostty gets ONLY modifyOtherKeys: its Kitty disambiguate mode strips Alt from
Backspace (upstream bug), breaking backward-kill-word.

Ghostty implements modifyOtherKeys correctly (it then emits ``\x1b[27;3;127~``, which the alias table
also maps). See #87630.
ÚTERM_PROGRAMr&   ÚghosttyÚTERMúxterm-ghostty)r   ÚenvironÚgetr/   rH   )rÛ   s   &r   Ú_is_ghostty_terminalrã   _  si   € ð šŒ"�*Š*¨€CØ�G‰G�NÓ#×)Ð) r×0Ñ0Ó2°iÑ?×}Ð}ÀCÇGÁGÈFÃO×DYÐDYÐWY×C`ÑC`ÓCb×ChÑChÓCjÐn}ÑC}Ð}r   c               ó    € V ^8„  d   QhRRRR/# rÚ   r   )r   s   "r   r   r   l  s   € ÷ ñ Ð0Kð ÐW[ñ r   c                ó
  € V f   \         P                  MT p V P                  R4      ;'       g    RP                  4       pV P                  R4      ;'       g    RP                  4       P	                  4       p\        V P                  R4      ;'       gm    VR	9   ;'       g`    V P                  R4      ;'       gG    RV9   ;'       g:    VR8H  ;'       g-    VP                  R4      ;'       g    VP	                  4       R8H  4      # )
zdAllowlist of terminals where requesting modified-Enter reporting is safe (aligned with the Ink TUI).rÝ   r&   rß   Ú
WT_SESSIONÚKITTY_WINDOW_IDÚkittyrà   Útmux>   ÚvscodeÚWezTermrÞ   ú	iTerm.app)r   rá   râ   r/   rH   r‘   rA   )rÛ   Úterm_programÚterms   &  r   Ú&_terminal_supports_extended_enter_keysrï   l  s   € àšŒ"�*Š*¨€CØ—G‘G˜NÓ+×1Ð1¨r×8Ñ8Ó:€LØ�G‰G�F‹O×!Ð!˜r×(Ñ(Ó*×0Ñ0Ó2€DÜØ�‰�Ó÷ 	Eð 	EØÐHÑH÷	Eð 	Eà�7‰7Ð$Ó%÷	Eð 	Eà)0°D©÷	Eð 	Eð �?Ñ"÷	Eð 	Eð �?‰?˜6Ó"÷		Eð 	Eð '3×&8Ñ&8Ó&:¸fÑ&Dóð r   c               ó    € V ^8„  d   QhRRRR/# rÚ   r   )r   s   "r   r   r   z  s   € ÷ #ñ #Ð2Mð #ÐY]ñ #r   c                óä  € ^ RI HpHpHpHp V! V4      '       g   R# V! V4      '       d   TMTp V e6   \        V R4      '       d$   V P                  V4       V P                  4        R# \        P                  ed   \        P                  P                  4       '       d@   \        P                  P                  V4       \        P                  P                  4        R# R#   \         d     R# i ; i)uê  Ask allowlisted terminals to report modified keys distinctly.

Pushes BOTH kitty keyboard protocol and xterm modifyOtherKeys (kitty dropped the
latter; tmux/VS Code only accept it). Both re-encode modified keys as sequences
stock prompt_toolkit barely maps (Ctrl+C once arrived as ``ESC[99;5u``), so
``install_modify_other_keys_aliases()`` must have run first. Ghostty gets only
modifyOtherKeys. The exit reset pops both modes.

Under either protocol the terminal re-encodes modified keys as escape sequences â€” Kitty disambiguate
mode as ``ESC[<codepoint>;<mod>u`` (plus the Esc key as ``ESC[27u``), modifyOtherKeys=2 as
``ESC[27;<mod>;<codepoint>~``. Stock prompt_toolkit 3.x maps almost none of these, which is why the CSI
>1u push was temporarily removed in 87074 (Ctrl+C arrived as ``ESC[99;5u`` and died, #56684).
``install_modify_other_keys_aliases()`` (called at CLI startup from ``hermes_cli.pt_input_extras``) now
populates ``ANSI_SEQUENCES`` with the full Ctrl/Alt/Shift/multi-modifier and functional-key tables under
BOTH formats, so every existing key binding continues to fire â€” including Ctrl+C, which is handled by
prompt_toolkit's ``c-c`` binding (raw mode clears ISIG, so the kernel INTR path was never in play for
the CLI).
See #87630.
)Ú_EXTENDED_ENTER_KEYS_SEQÚ_MODIFY_OTHER_KEYS_SEQrã   rï   FÚ	write_rawT)r   rò   ró   rã   rï   r–   rô   ÚflushÚsysÚstdoutÚisattyÚwriterF   )r›   rÛ   rò   ró   rã   rï   Úseqs   &&     r   Ú_enable_extended_enter_keysrû   z  s½   € ÷( Có  CÙ1°#×6Ò6ÙÙ$8¸×$=Ò$=Ñ
 ÐC[€Cð
ØÒ¤'¨&°+×">Ò">Ø×Ñ˜SÔ!Ø�L‰LŒNÙÜ�:‰:Ò!¤c§j¡j×&7Ñ&7×&9Ò&9Ü�J‰J×Ñ˜SÔ!Ü�J‰J×ÑÔÙñ øô ô ØÙðús   °7C  Á)5C  Â=C  Ã C/Ã.C/c               ó    € V ^8„  d   QhRRRR/# )r   ÚconfigzOptional[dict[str, Any]]r   r‘   r   )r   s   "r   r   r      s    € ÷ mñ mÐ-Eð mÐQUñ mr   c                ó„  € V f   \        4       P                  p \        V \        4      '       d   V P	                  R4      MRp\        V\        4      '       d   VP	                  RR4      MRp\        V\
        4      '       d   V# \        V\        4      ;'       d"    VP                  4       P                  4       R9   '       * # )zg``display.cli_multiline_shortcuts`` (default on: Ctrl+J = newline; off restores the legacy c-j submit).NÚdisplayÚcli_multiline_shortcutsT>   Ú0ÚnoÚoffÚfalseÚdisabled)	r   Ú
CLI_CONFIGrd   rY   râ   r‘   r   r/   rH   )rý   rÿ   Úvalues   &  r   Ú _cli_multiline_shortcuts_enabledr     s�   € à‚~Ü“×"Ñ"ˆÜ'1°&¼$×'?Ò'?ˆf�j‰j˜Ô#ÀT€GÜ<FÀwÔPT×<UÒ<UˆG�K‰KÐ1°4Ô8Ð[_€EÜ�%œ×ÒØˆÜ˜5¤#Ó&×kÐk¨5¯;©;«=×+>Ñ+>Ó+@ÐDkÑ+kÔlÐlr   c               ó    € V ^8„  d   QhRRRR/# )r   Útextr   r   r‘   r   )r   s   "r   r   r   «  s   € ÷ Dñ D¨#ð D°$ñ Dr   c                óV   € ^ RI Hp \        TP                  T ;'       g    R4      4      # )z@True when Enter should turn a trailing backslash into a newline.©Ú_BACKSLASH_LINE_CONTINUATION_REr&   )r   r  r‘   Úsearch©r
  r  s   & r   Ú_is_backslash_line_continuationr  «  s"   € å3ÜÐ/×6Ñ6°t·z°z¸rÓBÓCÐCr   c               ó    € V ^8„  d   QhRRRR/# )r   r
  r   r   r   )r   s   "r   r   r   ±  s   € ÷ Fñ F¨Sð F°Sñ Fr   c                óT   € ^ RI Hp TP                  RT ;'       g    R4      R,           # )z7Replace a trailing ``\`` marker with an actual newline.r  r&   Ú
)r   r  Úsubr  s   & r   Ú"_apply_backslash_line_continuationr  ±  s#   € å3Ø*×.Ñ.¨r°4·:°:¸2Ó>ÀÕEÐEr   c               ó   € V ^8„  d   QhRR/# ©r   r   r‘   r   )r   s   "r   r   r   ·  s   € ÷ ñ  dñ r   c                 ó´  a€ \         P                  o\        P                  R8X  g°   \        ;QJ d    V3R lR 4       F  '       g   K   RM	  RM! V3R lR 4       4      '       gp   SP                  RR4      P                  4       R8X  gK   SP                  RR4      P                  4       R	8X  g&   R
SP                  RR4      P                  4       9   d   R# R FT  p  \        V RRRR7      ;_uu_ 4       pR
VP                  4       P                  4       9   d    RRR4        R#  RRR4       KV  	  R#   + '       g   i     Kk  ; i  \         d     K|  i ; i)zEnvironments delivering Ctrl+Enter as bare LF (Windows Terminal, WSL, SSH, Ghostty): c-j must stay newline.

See issue #22379.
Úwin32c              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5i©N)râ   )r‚   ÚvrÛ   s   & €r   r…   Ú/_preserve_ctrl_enter_newline.<locals>.<genexpr>¿  s&   øé € ð Qñ $P˜aˆs�w‰w�q�zˆzó $Pùs   ƒ!TFrß   r&   rà   rÝ   rÞ   Ú	microsoftÚWSL_DISTRO_NAMEÚrz	utf-8-sigÚignore)ÚencodingÚerrorsN)ÚSSH_CONNECTIONÚ
SSH_CLIENTÚSSH_TTYræ   ÚGHOSTTY_RESOURCES_DIRÚGHOSTTY_BIN_DIR)z/proc/versionz/proc/sys/kernel/osrelease)
r   rá   rö   ÚplatformÚanyrâ   rH   ÚopenÚreadrO   )ÚpÚfrÛ   s     @r   Ú_preserve_ctrl_enter_newliner/  ·  s"  ø€ ô
 �*‰*€Cä�‰˜Ôß‹3ô Qñ $Pó Q�3�3Š3ô Qñ $Pó Q÷ Qò Qà�7‰7�6˜2Ó×$Ñ$Ó&¨/Ô9¸S¿W¹WÀ^ÐUWÓ=X×=^Ñ=^Ó=`ÐdmÔ=mØ˜#Ÿ'™'Ð"3°RÓ8×>Ñ>Ó@Ô@áã<ˆð	Ü�a˜ {¸8×DÕDÈØ !§&¡&£(§.¡.Ó"2Ô2Ø÷ EÒDØ2÷ EÑDñ =ñ ÷ E×DÐDûô ô 	Úð	ús6   ÃEÃ5%D4ÄEÄ&EÄ4EÄ?EÅEÅEÅEÚmultiline_shortcuts_enabledc               ó    € V ^8„  d   QhRRRR/# )r   r0  zOptional[bool]r   r¬   r   )r   s   "r   r   r   Ð  s   € ÷ ñ È.ð Ðdhñ r   c               óè   € ^ RI HpHp Vf   V! 4       pV P                  R4      ! V4       \        P
                  R8w  d3   V'       g)   V! 4       '       g   V P                  R4      ! V4       R# R# R# R# )av  Enter always submits; c-j submits only with multiline shortcuts off AND where Ctrl+Enter isn't c-j.

Even when the setting is disabled, environments where Ctrl+Enter is known to arrive as c-j (Windows,
WSL, SSH, Windows Terminal, Ghostty) keep c-j reserved for newline; otherwise Ctrl+Enter submits instead
of composing. See _preserve_ctrl_enter_newline() and issue #22379.
)r  r/  NÚenterr  zc-j)r   r  r/  Úaddrö   r)  )ÚkbÚhandlerr0  r  r/  s   &&$  r   Ú_bind_prompt_submit_keysr7  Ð  s\   € ÷ SØ"Ò*Ù&FÓ&HÐ#Ø‡F�Fˆ7„O�GÔÜ
‡|�|�wÔ×'BÑKg×KiÒKiØ
�‰ˆuŒ�gÖñ LjÑ'BÑr   c               ó   € V ^8„  d   QhRR/# r«   r   )r   s   "r   r   r   ß  s   € ÷ 7ñ 7°ñ 7r   c                ó�   € \        \        4      ;_uu_ 4        RV P                  n        RRR4       R#   + '       g   i     R# ; i)zGLet prompt_toolkit fall back from CPR without printing into the prompt.N)r   rF   ÚrendererÚcpr_not_supported_callback)rš   s   &r   Ú#_disable_prompt_toolkit_cpr_warningr<  ß  s(   € ä	”)×	Õ	Ø26ˆ�‰Ô/÷ 
×	×	Ò	ús	   ˜4´A	c               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   r   å  s   € ÷ Yñ Y ñ Yr   c                 ó~   € \         P                  P                  RR4      R8H  ;'       g    \        P                  R8g  # )u�  Suppress prompt_toolkit CPR queries (delayed replies leak into input); Windows keeps pt's default.

Delayed CPR replies (``ESC[<row>;<col>R`` / visible ``^[[<row>;<col>R``) leak into the status line and
can freeze input when the reply is slow (#13870 on SSH/slow PTYs). The same race hits local POSIX TTYs
under heavy subagent / status-line load â€” see ``tests/hermes_cli/test_cpr_local_leak.py``.
ÚPROMPT_TOOLKIT_NO_CPRr&   Ú1r  )r   rá   râ   rö   r)  r   r   r   Ú_terminal_may_leak_cprrA  å  s1   € ô �:‰:�>‰>Ð1°2Ó6¸#Ñ=×XÐXÄÇÁÐQXÑAXÐXr   c                ó|   a aaa€  ^ RI o^ RIHpHo ^ RIHo VVVV 3R lpV! S VRR7      #   \         d     R# i ; i)a¼  Vt100_Output with ``enable_cpr=False`` (``from_pty()`` doesn't expose it), or None on failure.

prompt_toolkit's renderer sends ``ESC[6n`` (Device Status Report) to learn the cursor row before
painting in non-fullscreen mode; the terminal replies ``ESC[<row>;<col>R``. When that reply is delayed
it races into the display as raw ``^[[39;1R`` and can stall the renderer's pending-CPR future (#13870;
also local POSIX under heavy subagent load).
N)ÚVt100_OutputÚ	_get_size)ÚSizec                 óÆ   <€ R ;r S! SP                  4       4      w  rS! T ;'       g    ^T;'       g    ^PR7      #   \        SP                  \        \        3 d     LAi ; i)N)Úrowsr‹   )ÚfilenorO   ÚUnsupportedOperationr—   Ú
ValueError)rG  r‹   rE  rD  Ú_ior÷   s     €€€€r   Ú_get_term_sizeÚ2_build_cpr_disabled_output.<locals>._get_term_sizeü  s`   ø€ Ø!Ð!ˆDðÙ )¨&¯-©-«/Ó :‘�ñ ˜TŸZ˜Z R°·°¸BÔ?Ð?øô ˜S×5Ñ5´~ÄzÐRô Ùðús   †< ¼!A ÁA F)Ú
enable_cpr)ÚioÚprompt_toolkit.output.vt100rC  rD  Úprompt_toolkit.data_structuresrE  rF   )r÷   rC  rL  rE  rD  rK  s   f  @@@r   Ú_build_cpr_disabled_outputrR  ï  s@   û€ ðÛßGÝ7÷	@ð 	@ñ ˜F N¸uÔEÐEøÜô Úðús   †%, ¬;º;c                ó@   € ^ RI HpHp V! 4       '       d	   V! V 4      # R# )z\CPR-disabled ``Vt100_Output`` when CPR may leak, else None (Application keeps pt's default).)rR  rA  N)r   rR  rA  )r÷   rR  rA  s   &  r   Ú_select_classic_cli_pt_outputrT  	  s   € çFÙ1G×1IÒ1IÑ% fÓ-ÐSÈtÐSr   c               ó    € V ^8„  d   QhRRRR/# )r   r
  r   r   ztuple[str, bool]r   )r   s   "r   r   r     s   € ÷ #ñ #°Sð #Ð=Mñ #r   c                óR  € ^ RI HpHpHpHpHp V '       g   V R3# RpRV 9   W3RV 9   W%3RV 9   ;'       d     RV 9   ;'       d    RV 9   ;'       g    RV 9   R	V33 FI  w  rxp	V'       g   K  Ve   VP                  R
V 4      p V	P                  R
V 4      w  r
T;'       g    V
^ 8„  pKK  	  W3# )zXStrip leaked CPR replies and mouse-report fragments -> ``(cleaned, had_mouse_reports)``.)Ú_DSR_CPR_ESC_REÚ_DSR_CPR_VISIBLE_REÚ_SGR_MOUSE_BARE_REÚ_SGR_MOUSE_ESC_REÚ_SGR_MOUSE_VISIBLE_REFz[z^[Ú<Ú;ÚMÚmNr&   )r   rW  rX  rY  rZ  r[  r  Úsubn)r
  rW  rX  rY  rZ  r[  Úhad_mouse_reportsÚpresentÚcpr_reÚmouse_rer   s   &          r   Ú*_strip_leaked_terminal_responses_with_metare    sÅ   € çvÕvßØ�Uˆ{ÐàÐà	�D‰˜/Ð=Ø	�‰Ð*ÐBØ	�‰×	EÐ	E˜ ™×	EÐ	E¨#°©+×*DÐ*D¸À¹ÀtÐM_Ð`ó&Ñ!ˆ˜÷
 ÙØÒØ—:‘:˜b $Ó'ˆDØ—m‘m B¨Ó-‰ˆØ-×:Ð:°¸±Òñ&ð Ð"Ð"r   Ú
max_heightc          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   Úlineszlist[str] | tuple[str, ...]Úprompt_textr   Úterminal_columnsrt   rf  r   r   )r   s   "r   r   r   $  s;   € ÷ Cñ CØ&ðCØ58ðCØLOðCØ`cðCàñCr   c          
     óÚ  € ^ RI Hp  ^ RIHp \        ^T! T;'       g    ^ ^ 4      4      p\        ^ T! T;'       g    R4      4      p^ p\        T ;'       g    R.4       FC  w  ršT! T
;'       g    R4      V	^ 8X  d   TM^ ,           pV\        ^V) V,          ) 4      ,          pKE  	  \        \        V^4      \        ^\        T;'       g    ^4      4      4      #   \         d    R p LÛi ; i)zºInput rows from live terminal cells; the BeforeInput prompt consumes cells only on line 0.

Never substitute a fake wide fallback: a mis-sized TextArea leaves stale cells at the bottom.
)Ú_int_or)Ú
get_cwidthc                ó,   € \        T ;'       g    R 4      # )r&   )r0   )r  s   &r   Ú<lambda>Ú,_estimate_tui_input_height.<locals>.<lambda>/  s   € ¤3 u§{ {°Ô#3r   r&   )	r   rl  Úprompt_toolkit.utilsrm  rF   r{   rf   Úminrt   )rh  ri  rj  rf  rl  rm  r‹   Úprompt_widthÚvisual_linesr�   ÚlineÚdisplay_widths   &&&$        r   Ú_estimate_tui_input_heightrw  $  sÛ   € õ ð4Ý3ô �!‘WÐ-×2Ð2°°AÓ6Ó7€GÜ�q™* [×%6Ð%6°BÓ7Ó8€Là€LÜ  § ¨2¨$Ö/‰ˆÙ" 4§: :¨2Ó.À%È1Ä*±,ÐRSÕTˆØœ˜A - °7Õ!:Ð;Ó<Õ<Šñ 0ô Œs�< Ó#¤S¨¬C°
·°¸aÓ,@Ó%AÓBÐBøô ô 4Ù3Š
ð4ús   ˆC ÃC*Ã)C*c               ó    € V ^8„  d   QhRRRR/# )r   Údisplay_configÚobjectr   r‘   r   )r   s   "r   r   r   <  s   € ÷ )ñ )¸Fð )Àtñ )r   c                óì   € \        V \        4      '       g   / p V P                  RV P                  RR4      4      p\        V\        4      '       d"   VP	                  4       P                  4       R9  # VRJ# )z`Initial status-bar visibility; both YAML ``off`` (False) and strings like ``"hidden"`` mean off.Ú	statusbarÚtui_statusbarÚtopF>   r  r  r  r  Úhidden)rd   rY   râ   r   r/   rH   )ry  Ústatusbar_configs   & r   Ú'_status_bar_visible_from_display_configr�  <  sl   € ä�n¤d×+Ò+ØˆØ%×)Ñ)¨+°~×7IÑ7IÈ/Ð[`Ó7aÓbÐÜÐ"¤C×(Ò(Ø×%Ñ%Ó'×-Ñ-Ó/Ð7\Ñ\Ð\Ø 5Ð(Ð(r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úqueryz
str | NoneÚ	image_argr   ztuple[str, list[Path]]r   )r   s   "r   r   r   F  s"   € ÷ 0ñ 0 ð 0¸
ð 0ÐNdñ 0r   c                ó,  € ^ RI HpHpHp T ;'       g    Rp. p\	        V\
        4      '       dh   V! V4      pV'       dX   VP                  R4      '       dA   VP                  VR,          4       VR,          ;'       g    RVR,          P                   R2pV'       dY   V! V4      pVf   \        RV 24      hVP                  P                  4       V9  d   \        R	V 24      hVP                  V4       V\        \        P                  V4      4      3# )
z;Collect local image attachments for single-query CLI flows.)r\   rp   rV   r&   r]   r   rX   z[User attached image: r~   zImage file not found: zNot a supported image file: )r   r\   rp   rV   rd   r   râ   ÚappendrD   rJ  r^   rH   ÚlistrY   Úfromkeys)	rƒ  r„  r\   rp   rV   ÚmessageÚimagesÚdroppedÚexplicit_paths	   &&       r   Ú_collect_query_imagesr�  F  sî   € çRÑRØ�kˆk�r€GØ€Fä�'œ3×ÒÙ# GÓ,ˆß�w—{‘{ :×.Ò.Ø�M‰M˜' &�/Ô*Ø˜kÕ*×^Ð^Ð0FÀwÈvÅ×G[ÑG[ÐF\Ð\]Ð.^ˆGçÙ0°Ó;ˆØÒ ÜÐ5°i°[ÐAÓBÐBØ×Ñ×%Ñ%Ó'Ð/@Ô@ÜÐ;¸M¸?ÐKÓLÐLØ�‰�mÔ$à”DœŸ™ vÓ.Ó/Ð/Ð/r   >
   ú.bmpú.gifú.icoú.jpgú.pngú.svgú.tifú.jpegú.tiffú.webp)zcat.pngr  )NN)@Ú__doc__Ú
__future__r   Úloggingr   Úrer‰   rö   r»   Ú
contextlibr   Úpathlibr   Útypingr   r   r   r   Úurllib.parser	   r
   Ú
agent.i18nr   Ú	getLoggerr½   r   Ú	frozensetr\   r"   r5   rV   r_   rp   rŽ   r“   r©   rØ   ÚcompilerW  rX  rZ  r[  rY  Ú_TERMINAL_INPUT_MODE_RESET_SEQÚ_KITTY_KEYBOARD_PUSH_SEQró   rò   r  rã   rï   rû   r  r  r  r/  r7  r<  rA  rR  rT  re  rw  r�  r�  r   r   r   Ú<module>r¦     s�  ðñõ #ã Û 	Û 	Û Û 
Û Ý Ý ß /Ó /ß *å ð 
×	Ò	˜5Ó	!€òñ ò ó Ð ÷3õ<õ@3õlhõ
#3÷Lqõ0#ò
7õ<<GðL —*’*Ð.Ó/€ð —j’jÐ!2Ó3Ð ð —J’JÐ8Ó9Ð ð Ÿ
š
Ð#<Ó=Ð ð —Z’ZÐ 3Ó4Ð ðð ð &Ð ð &Ð ð 4Ð6LÕLÐ ð #%§*¢*¨\Ó":Ð ÷
~÷÷#÷LmõDõFõð2Ð[_÷ õ7õYòò4Tõ#ð*CØfg÷Cõ0)÷0ñ 0r   