+
    iHàjœ  ã                  óÚ   € R t ^ RIHt ^ RIt^ RIHt ^ RIHt . ROt]P                  ! R4      t
^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 R lltR# )u†  CJK/wide-character-aware re-alignment of model-emitted markdown tables.

Models pad tables assuming one cell per character; CJK glyphs and most emoji
take two, so body rows drift right on real terminals. This rebuilds padding
with ``wcwidth.wcswidth`` while preserving pipes/dashes (Rich already aligns CJK).
Deliberately conservative: only contiguous ``| ... |`` blocks with a divider are
rewritten; single-line/mid-stream fragments pass through (callers buffer rows and
flush complete blocks). ``wcswidth`` returns ``-1`` for some emoji+variation-selector
sequences (``âš ï¸�``); those clamp to 0 â€” a 1-cell drift beats widening every table.
)ÚannotationsN)ÚList)Úwcswidthz^\s*:?-{3,}:?\s*$c               ó    € V ^8„  d   QhRRRR/# )é   ÚsÚstrÚreturnÚint© )Úformats   "Ú:/home/ubuntu/.hermes/hermes-agent/agent/markdown_tables.pyÚ__annotate__r      s   € ÷ ñ �3ð ˜3ñ ó    c                ó,   € \        \        V 4      ^ 4      # )zK``wcswidth`` clamped to >= 0 (it returns -1 for control/unknown sequences).)Úmaxr   )r   s   &r   Ú_disp_widthr      s   € äŒx˜‹{˜AÓÐr   c               ó    € V ^8„  d   QhRRRR/# )r   Úrowr   r	   ú	list[str]r   )r   s   "r   r   r      s   € ÷ [ñ [˜ð [ ñ [r   c                óÀ   € V P                  4       P                  R4      P                  R4      P                  R4       Uu. uF  qP                  4       NK  	  up# u upi )z<Split ``| a | b | c |`` into ``["a", "b", "c"]`` with trims.Ú|)ÚstripÚremoveprefixÚremovesuffixÚsplit)r   Úcs   & r   Úsplit_table_rowr      sH   € à"Ÿy™y›{×7Ñ7¸Ó<×IÑIÈ#ÓN×TÑTÐUXÔYÓZÑY˜!�G‰GŽIÑYÑZÐZùÒZs   Á Ac               ó    € V ^8„  d   QhRRRR/# ©r   r   r   r	   Úboolr   )r   s   "r   r   r   $   s   € ÷ Lñ L˜#ð L $ñ Lr   c                ó¬   € \        V 4      p\        V4      ^8„  ;'       d5    \        ;QJ d    R V 4       F  '       d   K   R# 	  R# ! R V 4       4      # )z5True when ``row`` is a markdown table separator line.c              3  óL   "  € T F  p\         P                  V4      x € K  	  R # 5i©N)Ú_DIVIDER_CELL_REÚmatch)Ú.0r   s   & r   Ú	<genexpr>Ú#is_table_divider.<locals>.<genexpr>'   s   é € Ð!KÁUÀÔ"2×"8Ñ"8¸×";Ð";ÃUùs   ‚"$FT)r   ÚlenÚall)r   Úcellss   & r   Úis_table_dividerr,   $   sE   € ä˜CÓ €EÜˆu‹:˜‰>×KÐKŸc›cÑ!KÁUÓ!KŸcœcÐKšcÐK˜cÑ!KÁUÓ!KÓKÐKr   c               ó    € V ^8„  d   QhRRRR/# r   r   )r   s   "r   r   r   *   s   € ÷ 	Uñ 	U˜cð 	U dñ 	Ur   c                ó¢   € V P                  4       p\        V4      ;'       d.    VP                  R4      ;'       g    VP                  R4      ^8¬  # )a<  True when ``row`` could plausibly be a markdown table row.

Intentionally permissive for streaming callers deciding whether to buffer a
line (a false positive at most delays printing one line). A leading pipe is
the strongest signal; without it we accept >= 2 pipes so models that omit
the leading pipe still match.
r   )r   r    Ú
startswithÚcount)r   Ústrippeds   & r   Úlooks_like_table_rowr2   *   sC   € ð �y‰y‹{€HÜ�‹>×TÐT˜x×2Ñ2°3Ó7×SÐS¸8¿>¹>È#Ó;NÐRSÑ;SÐTr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úrowsúlist[list[str]]Úavailable_widthú
int | Noner	   r   r   )r   s   "r   r   r   6   s"   € ÷ ñ ˜ð ¸*ð ÐPYñ r   c           	     óJ  aaa€ \        R V  4       4      pV  Uu. uF#  q3R.V\        V4      ,
          ,          ,           NK%  	  p p\        V4       Uau. uF  o\        \        .V3R lV  4       O5!  NK   	  upoVe<   \	        S4      ^V,          ,           ^,           \        V^4      8”  d   \        WV4      # R V3R lloS! V ^ ,          4      RRP                  R S 4       4      ,           R,           .pVP                  V3R lV R	,           4       4       V# u upi u upi )
a  Render ``rows`` (header + body, divider implied) at uniform widths.

When the horizontal table would exceed ``available_width`` fall back to a
vertical key-value rendering: terminal soft-wrap mid-cell destroys alignment
visually even when the bytes are perfectly padded.
c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir#   )r)   )r&   Úrs   & r   r'   Ú _render_block.<locals>.<genexpr>=   s   é € Ð%¡˜1”�A—�£ùs   ‚Ú c              3  óH   <"  € T F  p\        VS,          4      x € K  	  R # 5ir#   )r   )r&   r:   r   s   & €r   r'   r;   ?   s   øé € Ð#D¹t¸!¤K°°!µ×$5Ð$5»tùs   ƒ"c               ó    € V ^8„  d   QhRRRR/# )r   r+   r   r	   r   r   )r   s   "r   r   Ú#_render_block.<locals>.__annotate__D   s   € ÷ sñ s�Ið s #ñ sr   c                óh   <€ R RP                  V3R l\        V 4       4       4      ,           R,           # )z| z | c           
   3  óŠ   <"  € T F8  w  rVR \        ^ SV,          \        V4      ,
          4      ,          ,           x € K:  	  R# 5i)Ú N)r   r   )r&   Úkr   Úwidthss   &  €r   r'   Ú._render_block.<locals>._row.<locals>.<genexpr>E   s8   øé € Ð kÑZjÑRVÐRS  S¬3¨q°&¸µ)¼kÈ!»nÕ2LÓ+MÕ%M×!MÒ!MÓZjùs   ƒA Az |)ÚjoinÚ	enumerate)r+   rD   s   &€r   Ú_rowÚ_render_block.<locals>._rowD   s*   ø€ Ø�e—j‘jÔ kÔZcÐdiÔZjÓ kÓkÕkÐnrÕrÐrr   r   c              3  óB   "  € T F  pR V^,           ,          x € K  	  R# 5i)Ú-Nr   )r&   Úws   & r   r'   r;   G   s   é € Ð(GÁ¸1¨°°Aµ¯ªÃùs   ‚c              3  ó4   <"  € T F  pS! V4      x € K  	  R # 5ir#   r   )r&   r:   rH   s   & €r   r'   r;   H   s   øé € Ð)¡˜1‰t�A�wˆw£ùs   ƒºé   NN)r   r)   ÚrangeÚ_MIN_COL_WIDTHÚsumÚ_render_verticalrF   Úextend)r4   r6   Úncolsr:   r   ÚoutrH   rD   s   &&  ` @@r   Ú_render_blockrW   6   s÷   ú€ ô Ñ%¡Ó%Ó%€EÙ15Ó6±¨A��˜¤ A£�Õ'×'Ð'±€DÐ6ÜOTÐUZÌ|Ô\É|È!Œc”.ÐEÔ#D¹tÓ#DÖEÉ|Ñ\€FàÒ"¤s¨6£{°Q¸µYÕ'>ÀÕ'BÄSÈÐZ\ÓE]Ô']Ü ¨_Ó=Ð=÷sð sñ ��Q•‹=˜# §¡Ñ(GÁÓ(GÓ GÕGÈ#ÕMÐ
N€CØ‡J�JÔ)  R¦Ó)Ô)Ø€Jùò 7ùÚ\s   š)DÁ$D c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úwordr   rL   r
   r	   r   r   )r   s   "r   r   r   L   s!   € ÷ 'ñ '�cð '˜cð ' iñ 'r   c                óà   € . pR^ rCV  FQ  p\        V4      ;'       g    ^pWF,           V8”  d   V'       d   VP                  V4       YVrCKB  W5,           WF,           rCKS  	  V'       d
   W#.,           # T# )z>Split a single over-wide word into display-width-``w`` chunks.r<   )r   Úappend)rY   rL   rV   ÚbufÚbwÚchÚcws   &&     r   Ú_hard_breakr`   L   sb   € à€CØ�!ˆÛˆÜ˜‹_×!Ð! ˆØ�7�QŒ;Ÿ3Ø�J‰J�sŒOØ’à•h ¥’ñ ÷ ˆ3��;Ð& 3Ð&r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Útextr   Úwidthr
   r	   r   r   )r   s   "r   r   r   Z   s!   € ÷ $ñ $˜ð $ Sð $¨Yñ $r   c                óÂ  aaaa€ S^ 8:  g	   V '       g   V .# V P                  4       pV'       g   R.# . oR^ uooR VVVV3R llpV Fp  p\        V4      pS'       g   V! WE4       K   S^,           V,           S8:  d#   SRV,           ,          oS^V,           ,          oKW  SP                  S4       V! WE4       Kr  	  S'       d   SP                  S4       S;'       g    R.# )zÅSoft-wrap ``text`` at word boundaries to ``width`` display cells.

Words wider than ``width`` are hard-broken. Empty input yields a single
empty string so the caller's row count stays predictable.
r<   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rY   r   Úwwr
   r	   ÚNoner   )r   s   "r   r   Ú$_wrap_to_width.<locals>.__annotate__h   s!   € ÷ -ñ -�Sð -˜cð - dñ -r   c                óž   <€ VS8:  d   WuooR # \        V S4      pSP                  VR R 4       V'       d
   VR,          MRo\        S4      oR # )Nr<   éÿÿÿÿ)r`   rT   r   )rY   rf   ÚpiecesÚcurrentÚ	current_wÚlinesrc   s   && €€€€r   Ú_startÚ_wrap_to_width.<locals>._starth   sI   ø€ à�Œ;Ø!%ÐˆG’Yä   uÓ-ˆFØ�L‰L˜  ˜Ô%ß$*�f˜R–j°ˆGÜ# GÓ,ŠIr   rB   )r   r   r[   )	rb   rc   Úwordsro   rY   rf   rl   rm   rn   s	   &f    @@@r   Ú_wrap_to_widthrr   Z   sÆ   û€ ð �„zŸØˆvˆØ�J‰J‹L€EßØˆtˆØ€EØ˜QÐ€GˆY÷-ó -ó ˆÜ˜ÓˆßÙ�4ÖØ˜�]˜RÕ 5Ô(Ø�s˜T•zÕ!ˆGØ˜˜R�ÕŠIà�L‰L˜Ô!Ù�4Öñ ÷ Ø�‰�WÔØ�=ˆ=�R�DÐr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r4   r5   rU   r
   r6   r	   r   r   )r   s   "r   r   r   �   s)   € ÷ ñ ˜?ð °3ð Èð ÐQZñ r   c                óÎ  € V '       g   . # \        V ^ ,          R.V\        V ^ ,          4      ,
          ,          ,           4       UUu. uF  w  r4T;'       g    RV^,            2NK  	  pppRV'       d   \        ^\        ^(V^,
          4      4      M^,          p\        ^
V^,
          4      p. p\        V R,          4       EF  w  ršV	^ 8”  d   VP	                  V4       \        V4       Fî  w  r¼V\        V
4      8  d	   W«,          MRpV'       g   VP	                  V R24       K=  \        V\        ^
V\        V4      ,
          ^,
          4      4      pVP	                  V RV^ ,           24       \        V4      ^8”  d#   \        RP                  VR,          4      V4      MR	 F/  pVP                  4       '       g   K  VP	                  RV 24       K1  	  Kð  	  EK  	  V# u uppi )
uø   Render a too-wide table as ``Header: value`` blocks (Claude Code's narrow fallback).

Each body row becomes one block with continuation lines indented two spaces,
blocks separated by a thin ``â”€`` rule; every line stays under ``available_width``.
r<   zColumn u   â”€rN   Ú:z: rB   z  r   )	rG   r)   r   Úminr[   rr   r   rF   r   )r4   rU   r6   ÚiÚhÚlabelsÚ	separatorÚcont_budgetrV   Úrir   ÚciÚlabelÚvalueÚwrappedÚcls   &&&             r   rS   rS   �   s˜  € ÷ Øˆ	Ü1:¸4À½7ÀbÀTÈUÔUXÐY]Ð^_ÕY`ÓUaÕMaÕEbÕ;bÔ1cÔdÑ1c©¨ˆa×$Ð$�W˜Q �U˜GÐ$Ò$Ñ1c€FÑdØÇ/œ˜R¤ R¨¸1Õ)<Ó!=Ô>ÐWYÕZ€IÜ�b˜/¨AÕ-Ó.€KØ€CÜ˜T "�X×&‰ˆØ�Œ6Ø�J‰J�yÔ!Ü" 6Ö*‰IˆBØ!¤C¨£Hœ}�C–G°"ˆEßØ—
‘
˜e˜W A˜;Ô'ÙÜ$ U¬C°°OÄkÐRWÓFXÕ4XÐ[\Õ4\Ó,]Ó^ˆGØ�J‰J˜%˜  7¨1¥: ,Ð/Ô0äLOÐPWËLÐ[\ÔL\”n S§X¡X¨g°b­kÓ%:¸KÔHÐbdÒd�Ø—8‘8—:”:Ø—J‘J  B 4˜yÖ)ó eô +ñ 'ð €Jùó% es   ÁG!ÁG!c               ó$   € V ^8„  d   QhRRRRRR/# )r   rb   r   r6   r7   r	   r   )r   s   "r   r   r   ž   s!   € ÷ ñ  #ð ¸
ð Ècñ r   c                óÂ  € RV 9  d   V # V P                  R4      p. p^ \        V4      rTWE8  Ed!   W$,          pRV9   dõ   V^,           V8  dç   \        W$^,           ,          4      '       dÉ   \        V4      p. pV^,           p	W•8  dl   RW),          9   d_   W),          P	                  4       '       dC   \        W),          4      '       g!   VP                  \        W),          4      4       V	^,          p	Kq  \        V4      '       g	   V'       d)   VP                  \        V.V,           V4      4       T	pEK
  VP                  V4       V^,          pEK'  RP                  V4      # )a  Rewrite every ``| ... |`` + divider block with wcwidth-aware padding.

Non-table lines are returned verbatim, so this is safe on arbitrary prose.
With ``available_width`` (terminal cells), tables wider than that render as
vertical key-value pairs instead of soft-wrapping mid-cell.
r   Ú
)
r   r)   r,   r   r   r[   ÚanyrT   rW   rF   )
rb   r6   rn   rV   rw   ÚnÚlineÚheaderÚbodyÚjs
   &&        r   Úrealign_markdown_tablesr‹   ž   s  € ð �$„ØˆØ�J‰J�tÓ€EØ€CØŒc�%‹j€qØ
�%Ø�xˆà�$Œ;˜1˜q�5 1œ9Ô)9¸%ÀAÅ½,×)GÒ)GÜ$ TÓ*ˆFØ$&ˆDØ�A•ˆAØ”%˜C 5¥8œO°µ·±×0@Ò0@Ü'¨­×1Ò1Ø—K‘K¤°µÓ 9Ô:Ø�Q•’Ü�6�{Š{ŸdØ—
‘
œ=¨&¨°D­¸/ÓJÔKØ�ÚØ�
‰
�4ÔØ	ˆQ�‹Ø�9‰9�S‹>Ðr   )r,   r2   r‹   r   r#   )Ú__doc__Ú
__future__r   ÚreÚtypingr   Úwcwidthr   Ú__all__Úcompiler$   rQ   r   r   r,   r2   rW   r`   rr   rS   r‹   r   r   r   Ú<module>r“      sj   ðñ	õ #ã 	Ý å â
d€ð —:’:Ð2Ó3Ð Ø€õõ
[õ
Lõ	U÷õ,'õ$õN÷:ñ r   