+
    iHàjê  ã                  ó2  € R t ^ RIHt ^ RIt^ RIt^ RIHt ]! RR04      t]! 0 Rm4      t	R R lt
RtR	 R
 lt]P                  ! R]P                  4      tR R lt]! RR04      t]P                  ! R]P                  4      tRtR R ltR R ltR R ltR# )z4Shared helpers for classifying tool result payloads.)ÚannotationsN)ÚAnyÚ
write_fileÚpatchc               ó    € V ^8„  d   QhRRRR/# )é   Ú	tool_nameÚstrÚreturnÚbool© )Úformats   "ÚE/home/ubuntu/.hermes/hermes-agent/agent/tool_result_classification.pyÚ__annotate__r      s   € ÷ 1ñ 1¨ð 1°ñ 1ó    c                ó   € V \         9  # ©N)ÚNO_EFFECT_TOOL_NAMES)r   s   &r   Útool_may_have_side_effectr      s   € ØÔ0Ñ0Ð0r   Úguardrail_refusalc               ó    € V ^8„  d   QhRRRR/# ©r   Úresultr   r
   r   r   )r   s   "r   r   r   "   s   € ÷ Nñ N ð N¨ñ Nr   c                óþ   € T p\        V \        4      '       d&    \        P                  ! V P	                  4       4      p\        V\        4      ;'       d    VP                  \        4      RJ #   \
         d     R# i ; i)zNReturn True when ``result`` (JSON string or parsed dict) is a harness refusal.FT)	Ú
isinstancer	   ÚjsonÚloadsÚstripÚ	ExceptionÚdictÚgetÚGUARDRAIL_REFUSAL_KEY)r   Údatas   & r   Úis_guardrail_refusalr#   "   sg   € à€DÜ�&œ#×Òð	Ü—:’:˜fŸl™l›nÓ-ˆDô �dœDÓ!×MÐM d§h¡hÔ/DÓ&EÈÐ&MÐMøô ô 	Úð	ús   š$A- Á-A<Á;A<zI"(?:error|failed)"(?!\s*:\s*(?:null|false|0|""|\[\]|\{\})\s*(?:[,}\]]|$))c               ó    € V ^8„  d   QhRRRR/# )r   r   r	   r
   r   r   )r   s   "r   r   r   4   s   € ÷ iñ i˜sð i tñ ir   c                óú   € V R,          p\         ;QJ d/    R \        P                  V4       4       F  '       g   K   RM$	  RM ! R \        P                  V4       4       4      ;'       g    V P                  R4      # )a	  Last-resort text test for a failed tool result: a non-empty ``"error"``/``"failed"``
STARTING in the first 500 chars, or a body starting with ``Error``. The value is read past
the cut, so an ``"error": null`` straddling char 500 is not mistaken for a truncated one.:NiX  Nc              3  óF   "  € T F  qP                  4       R 8  x € K  	  R# 5i)iô  N)Ústart)Ú.0Úms   & r   Ú	<genexpr>Ú%has_failure_marker.<locals>.<genexpr>9   s   é € ÐJÑ(I 1�w‰w‹y˜3ŽÓ(Iùs   ‚!TFÚError)ÚanyÚ_FAILURE_MARKER_REÚfinditerÚ
startswith)r   Úheads   & r   Úhas_failure_markerr2   4   sZ   € ð �$�<€Dß‹3ÑJÔ(:×(CÑ(CÀDÔ(IÓJ�3�3Š3ÑJÔ(:×(CÑ(CÀDÔ(IÓJÓJ×hÐhÈf×N_ÑN_Ð`gÓNhÐhr   ÚfailedÚerrorz*rate[\s_-]?limit|too many requests|\b429\bc               ó    € V ^8„  d   QhRRRR/# r   r   )r   s   "r   r   r   C   s   € ÷ Gñ G˜Cð G Dñ Gr   c                ó.  a€ V o\        V \        4      '       d&    \        P                  ! V P	                  4       4      o\        S\        4      '       g   R# \        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      '       g8   RSP                  R4      SP                  R4      SP                  R4      39   d   R# SP                  R	4      p\        V\        4      '       d+   VP                  R
4      ;'       g    VP                  R4      MTp\        V\        4      ;'       d    \        \        P                  V4      4      #   \
         d)    \        \        P                  T R,          4      4      u # i ; i)z÷True when a FAILED result says the backend throttled the call (a ``retry_after`` field, a 429
status, or rate-limit wording in its error). Only meaningful for results already judged failed:
a successful page can mention rate limits in its content.:Niô  NFc              3  óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   )r    )r(   Úkr"   s   & €r   r*   Ú"is_rate_limited.<locals>.<genexpr>O   s   øé € Ð
2Ñ 1˜1ˆ4�8‰8�A�;ˆ;Ó 1ùs   ƒ!Ti­  ÚstatusÚstatus_codeÚcoder4   Úmessage)r   r	   r   r   r   Ú
ValueErrorr   Ú_RATE_LIMIT_REÚsearchr   r-   Ú_RETRY_AFTER_KEYSr    )r   r4   Útextr"   s   &  @r   Úis_rate_limitedrC   C   s&  ø€ ð €DÜ�&œ#×Òð	=Ü—:’:˜fŸl™l›nÓ-ˆDô �dœD×!Ò!Ùß
ƒsÔ
2Õ 1Ó
2‡s‡s‚sÔ
2Õ 1Ó
2×2Ò2°c¸d¿h¹hÀxÓ>PÐRV×RZÑRZÐ[hÓRiÐko×ksÑksÐtzÓk{Ð=|Ô6|ÙØ�H‰H�WÓ€EÜ8BÀ5Ì$×8OÒ8Oˆ5�9‰9�YÓ×4Ð4 5§9¡9¨VÓ#4øÐUZ€DÜ�dœCÓ ×FÐF¤T¬.×*?Ñ*?ÀÓ*EÓ%FÐFøô ô 	=Üœ×-Ñ-¨f°T­lÓ;Ó<Ò<ð	=ús   ›$E! Å!0FÆFc               ó    € V ^8„  d   QhRRRR/# )r   r"   r   r
   z
str | Noner   )r   s   "r   r   r   V   s   € ÷ Yñ Y˜dð Y zñ Yr   c                óz  € \        V P                  RR4      4      P                  4       \        9   d   \        V P                  R4      4      # V P                  R4      p\	        V\
        4      '       dC   V'       d;   \        ;QJ d    R V 4       F  '       d   K   RM	  RM! R V 4       4      '       g   R# V Uu. uF  q"P                  R4      NK  	  pp\        V4      '       g   R# V^ ,          p\	        V\        4      '       d%   \        VP                  R	4      ;'       g    T4      # \        V4      # u upi )
a�  Error text when a JSON-object result failed by SHAPE rather than by its top-level
``error``: a ``status`` of failed/error, or a ``results`` batch where EVERY item carries an
error (delegate_task with all children interrupted, a connector batch with every call
refused). None for a clean or partial result. Top-level JSON objects skip the substring
scan, so this is what keeps those failures counted.r:   Ú Úresultsc              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5ir   )r   r   )r(   Úis   & r   r*   Ú&shape_failure_error.<locals>.<genexpr>_   s   é € Ð:^ÑX]ÐST¼:ÀaÌ×;NÐ;NÓX]ùs   ‚FTNr4   r=   )r	   r    ÚlowerÚ_FAILED_STATUSESr   ÚlistÚallr   )r"   ÚitemsrI   ÚerrorsÚfirsts   &    r   Úshape_failure_errorrR   V   sâ   € ô ˆ4�8‰8�H˜bÓ!Ó"×(Ñ(Ó*Ô.>Ô>Ü�4—8‘8˜HÓ%Ó&Ð&Ø�H‰H�YÓ€EÜ�eœT×"Ò"¯%·s³sÑ:^ÑX]Ó:^·s·s²sÑ:^ÑX]Ó:^×7^Ò7^ÙÙ&+Ó,¡e �e‰e�GŽn¡e€FÐ,Üˆv�;Š;ÙØ�1�I€EÜ1;¸EÄ4×1HÒ1HŒ3ˆu�y‰y˜Ó#×,Ð, uÓ-ÐXÌcÐRWËjÐXùò	 -s   Â<D8c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r	   r   r   r
   r   r   )r   s   "r   r   r   h   s!   € ÷ ñ ¨3ð ¸ð Àñ r   c                ód  € V \         9  g   \        V\        4      '       g   R#  \        P                  ! VP                  4       4      p\        T\        4      '       d   TP                  R4      '       d   R# T R8X  d   RT9   # T R8X  d   TP                  R4      RJ # R#   \         d     R# i ; i)z@Return True when a file mutation result proves the write landed.Fr4   r   Úbytes_writtenr   ÚsuccessT)	ÚFILE_MUTATING_TOOL_NAMESr   r	   r   r   r   r   r   r    )r   r   r"   s   && r   Úfile_mutation_result_landedrX   h   s™   € àÔ0Ô0¼
À6Ì3×8OÒ8OÙðÜ�zŠz˜&Ÿ,™,›.Ó)ˆô �dœD×!Ò! T§X¡X¨g×%6Ò%6ÙØ�LÔ Ø $Ñ&Ð&Ø�GÔØ�x‰x˜	Ó" dÐ*Ð*Ùøô ô Úðús   ¥$B  Â B/Â.B/>   Ú	read_fileÚ
skill_viewÚ
web_searchÚskills_listÚweb_extractÚsearch_filesÚread_terminalÚsession_searchÚvision_analyzeÚbrowser_consoleÚbrowser_snapshotÚbrowser_get_images)Úretry_afterÚ
retryAfterÚretry_after_secondsÚretry_after_ms)Ú__doc__Ú
__future__r   r   ÚreÚtypingr   Ú	frozensetrW   r   r   r!   r#   ÚcompileÚ
IGNORECASEr.   r2   rL   r?   rA   rC   rR   rX   r   r   r   Ú<module>rp      s­   ðÙ :å "ã Û 	Ý ñ % l°GÐ%<Ó=Ð ñ !ò "ó Ð õ1ð ,Ð õNð —Z’ZØPÐRT×R_ÑR_óaÐ õiñ ˜h¨Ð0Ó1Ð à—’ÐIÈ2Ï=É=ÓY€ØZÐ õGõ&Y÷$r   