+
    jHàj*  ã                  óÈ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
 ]P                  ! ]4      tRt]P                  ! R],           4      tRt]P                  ! R],           R,           ]P$                  4      t]P                  ! R],           R	,           ],           R
,           ]P$                  4      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 R lltR# )a-  Repair model-mangled ``computer_use`` screenshot paths in final responses.

Some models rewrite the Windows path ``computer_use`` reported into a POSIX-looking
one (``C:\Users\Alice\...`` -> ``/Users/Alice/...``) inside an explicit ``MEDIA:``
directive, so delivery-path validation rejects it and drops the attachment.
Deliberately narrow: only rewrites paths in a response that *already* carries a
``MEDIA:`` directive whose ``computer_use_<uuid>`` basename exactly matches a
canonical path returned this turn.  Never auto-attaches; validation still runs.
)ÚannotationsN)ÚAnyÚDictÚIteratorÚListz(?:[A-Za-z]:[/\\]|/|\\\\)Ú^z(computer_use_[0-9a-f]{32}\.(?:png|jpe?g)Ú$z)\(shareable screenshot saved to (?P<path>z	[^\r\n]*?z)\)c               ó    € V ^8„  d   QhRRRR/# )é   Úmessagesúlist[dict[str, Any]]Úreturnúdict[str, str]© )Úformats   "Ú9/home/ubuntu/.hermes/hermes-agent/gateway/media_repair.pyÚ__annotate__r   "   s   € ÷ ñ Ð#7ð ¸Nñ ó    c                óÒ  € / pV  FÞ  pVP                  R4      R8w  d   K  VP                  R4      ;'       g    .  F¤  pVP                  R4      ;'       g    VP                  R4      p\        VP                  R4      ;'       g    / P                  R4      ;'       g    VP                  R4      ;'       g    R4      pV'       g   K�  V'       g   K—  WQ\        V4      &   K¦  	  Kà  	  V# )	zAMap assistant tool-call ids to tool names for the given messages.ÚroleÚ	assistantÚ
tool_callsÚidÚcall_idÚfunctionÚnameÚ )ÚgetÚstr)r   ÚmappingÚmsgÚcallr   r   s   &     r   Útool_name_by_call_idr"   "   s¼   € à €GÛˆØ�7‰7�6‹?˜kÔ)ÙØ—G‘G˜LÓ)×/Ð/¨RÒ/ˆDØ—h‘h˜t“n×;Ð;¨¯©°Ó(;ˆGÜ˜Ÿ™ Ó,×2Ð2°×7Ñ7¸Ó?×YÐYÀ4Ç8Á8ÈFÓCS×YÐYÐWYÓZˆDß‰wŸ4™4Ø(,œ˜G›Ó%ó	 0ñ ð €Nr   c               ó    € V ^8„  d   QhRRRR/# )r
   Úpathr   r   r   r   )r   s   "r   r   r   0   s   € ÷ ]ñ ]¨ð ]°ñ ]r   c                óø   € \         P                  ! R\        T ;'       g    R4      P                  4       P                  R4      4      R,          p\        P                  V4      '       d   VP                  4       # R# )zJCanonical (lowercased) capture basename for either separator style, or ''.z[/\\]r   z`"'éÿÿÿÿ)ÚreÚsplitr   ÚstripÚ!_COMPUTER_USE_CAPTURE_BASENAME_REÚ	fullmatchÚlower)r$   Úbasenames   & r   Ú_computer_use_capture_basenamer.   0   sX   € ä�xŠx˜¤# d§j j¨b£/×"7Ñ"7Ó"9×"?Ñ"?ÀÓ"GÓHÈÕL€HÜ@×JÑJÈ8×TÒTˆ8�>‰>ÓÐ\ÐZ\Ð\r   c               ó    € V ^8„  d   QhRRRR/# )r
   Úcontentr   r   zIterator[str]r   )r   s   "r   r   r   6   s   € ÷ Dñ D¨cð D°mñ Dr   c              #  óÐ  "  € \        V \        4      '       d±   V P                  4       pVP                  R4      '       g@   \        P                  V 4       F$  pVP                  R4      P                  4       x € K&  	  R#  \        P                  ! V4      p\        T\        \        34      '       d   \        T4       Rj  x€L
  R# R# \        V \        4      '       d   V  F  p\        V4       Rj  x€L
  K  	  R# \        V \        4      '       d¹   V P                  R4      pT \        V\        4      '       d   TM/ 3 F5  p\        VP                  R4      \        4      '       g   K*  VR,          x € K7  	  R FJ  pV P                  V4      p\        V\        \        \        34      '       g   K7  \        V4       Rj  x€L
  KL  	  R# R#   \         d     R# i ; i EL Lï L#5i)záYield persisted screenshot paths from computer_use result content (JSON, a
multimodal list, or text; the latter two keep the canonical path in the summary
line since the envelope's ``meta`` is not stored in the tool message).r$   NÚmetaÚscreenshot_path)Ú{Ú[)r0   ÚtextÚtext_summaryÚsummary)Ú
isinstancer   r)   Ú
startswithÚ _COMPUTER_USE_CAPTURE_SUMMARY_REÚfinditerÚgroupÚjsonÚloadsÚ	ExceptionÚdictÚlistÚ _iter_computer_use_capture_pathsr   )	r0   ÚstrippedÚmatchÚpayloadÚpartr2   ÚholderÚfieldÚnesteds	   &        r   rC   rC   6   sƒ  é € ô �'œ3×ÒØ—=‘=“?ˆØ×"Ñ" :×.Ò.Ü9×BÑBÀ7ÖK�Ø—k‘k &Ó)×/Ñ/Ó1Ô1ñ Láð	Ü—j’j Ó*ˆGô �g¤¤d˜|×,Ò,Ü7¸Ó@×@Ò@ñ -ä	�GœT×	"Ò	"ÛˆDÜ7¸Ó=×=Ò=ó ä	�GœT×	"Ò	"Ø�{‰{˜6Ó"ˆØ¬
°4¼×(>Ò(>¡ÀBÓGˆFÜ˜&Ÿ*™*Ð%6Ó7¼×=Ô=ØÐ.Õ/Ô/ñ Hó
 DˆEØ—[‘[ Ó'ˆFÜ˜&¤3¬¬dÐ"3×4Ô4Ü;¸FÓC×CÒCó Dñ 
#øô ô 	Úð	úò Añ >ñ Dùsh   ‚A=G&Â G Â*G&Ã GÃ1G&Ã2G"Ã3A2G&Å*AG&Æ2G&Ç G$ÇG&ÇGÇG&ÇGÇG&Ç"G&Ç$G&c               ó$   € V ^8„  d   QhRRRRRR/# )r
   r   r   Úhistory_offsetÚintr   r   )r   s   "r   r   r   X   s#   € ÷ 	ñ 	Ð%9ð 	È3ð 	ÐSgñ 	r   c                óÊ   € V'       d   \        V 4      V8¼  d   WR  # \        \        V 4      ^,
          RR4       F%  pW,          P                  R4      R8X  g   K!  WR  u # 	  . # )Nr   Úuserr&   )ÚlenÚranger   )r   rL   Úindexs   && r   Ú_current_turn_messagesrS   X   s`   € ßœS ›]¨nÔ<Ø˜Ð(Ð(ô ”s˜8“} qÕ(¨"¨bÖ1ˆØ�?×Ñ˜vÓ&¨&Ö0Ø˜FÐ#Ò#ñ 2ð €Ir   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©r
   Úresponser   r   r   rL   rM   r   r   )r   s   "r   r   r   d   s+   € ÷ ñ °sð ÐFZð Ðloð Ðx{ñ r   c                óp   €  \        WV4      #   \         d    \        P                  RRR7       T u # i ; i)zåRecover model-mangled paths in explicit ``MEDIA:`` directives whose basename
matches (case-insensitively) a canonical screenshot path from this turn.
Fail-open: the repair is cosmetic, so any error returns the response unchanged.z%computer_use media path repair failedT)Úexc_info)Ú/_repair_explicit_computer_use_media_paths_innerr@   ÚloggerÚdebug)rV   r   rL   s   &&&r   Ú(repair_explicit_computer_use_media_pathsr\   d   s:   € ðÜ>¸xÐSaÓbÐbøÜô Ü�‰Ð<ÀtˆÔLØŠðús   ‚ Ž$5´5c               ó    € V ^8„  d   QhRRRR/# )r
   Úturn_messagesr   r   r   r   )r   s   "r   r   r   o   s   € ÷ ñ Ð,@ð À^ñ r   c                óH  € \        V 4      p/ pV  EF  pVP                  R4      R	9  d   K  \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      p\        VP                  R4      ;'       g5    VP                  R4      ;'       g    VP                  V4      ;'       g    R4      R8w  d   K¶  \        VP                  R4      4       F9  p\	        V4      pV'       g   K  \
        P                  V4      '       g   K5  WRV&   K;  	  EK  	  V# )
zX``{lowercase basename: absolute canonical path}`` from this turn's computer_use results.r   Útool_call_idr   r   r   Ú	tool_nameÚcomputer_user0   >   Útoolr   )r"   r   r   rC   r.   Ú_ABS_PATH_PREFIX_RErE   )r^   Úcall_id_namesÚ	canonicalr    r   r$   r-   s   &      r   Ú_canonical_capture_pathsrg   o   sê   € ä(¨Ó7€MØ "€IÜˆØ�7‰7�6‹?Ð"6Ô6ÙÜ�c—g‘g˜nÓ-×IÐI°·±¸Ó1C×IÐIÀrÓJˆÜˆs�w‰w�v‹×ZÐZ #§'¡'¨+Ó"6×ZÐZ¸-×:KÑ:KÈGÓ:T×ZÐZÐXZÓ[Ð_mÔmÙÜ4°S·W±W¸YÓ5GÖHˆDÜ5°dÓ;ˆHß‰xÔ/×5Ñ5°d×;Ô;Ø&*˜(Ó#ô Iñ ð Ðr   c               ó(   € V ^8„  d   QhRRRRRRRR/# rU   r   )r   s   "r   r   r   €   s/   € ÷ ñ ¸cð ÐMað Ðsvð ð  @Cñ r   c                ó   € R V 9  d   V # \        \        W4      4      pV'       g   V # ^ RIHp T pVP	                  V 4      ^ ,           FB  w  rgVP                  \        V4      4      pV'       g   K)  Wh8w  g   K1  VP                  Wh4      pKD  	  V# )zMEDIA:)ÚBasePlatformAdapter)rg   rS   Úgateway.platforms.baserj   Úextract_mediar   r.   Úreplace)	rV   r   rL   Úcanonical_by_basenamerj   ÚrepairedÚemitted_pathÚ	_is_voicerf   s	   &&&      r   rY   rY   €   sŠ   € Ø�xÔØˆÜ4Ô5KÈHÓ5eÓfÐß Øˆõ ;à€HØ#6×#DÑ#DÀXÓ#NÈq×#QÐ#QÑˆØ)×-Ñ-Ô.LÈ\Ó.ZÓ[ˆ	ß‰9˜Ö2Ø×'Ñ'¨Ó@ŠHñ $Rð €Or   )é    )Ú__doc__Ú
__future__r   r>   Úloggingr'   Útypingr   r   r   r   Ú	getLoggerÚ__name__rZ   Ú_ABS_PATH_PREFIX_PATTERNÚcompilerd   Ú_CAPTURE_BASENAME_PATTERNÚ
IGNORECASEr*   r;   r"   r.   rC   rS   r\   rg   rY   r   r   r   Ú<module>r}      sÝ   ðñõ #ã Û Û 	ß ,Ó ,à	×	Ò	˜8Ó	$€ð 8Ð Ø—j’j Ð(@Õ!@ÓAÐ ØGÐ à$&§J¢J¨tÐ6OÕ/OÐRVÕ/VÐXZ×XeÑXeÓ$fÐ !Ø#%§:¢:ðØ+õ,Ø.:õ;Ø=VõWØY_õ`à‡M�Mó$Ð  õõ]õDõD	÷õ÷"ñ r   