+
    lHàj•  ã                  ó(  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
HtHtHtHt ]P                  ! ]4      tRt]P&                  ! 4       tR R ltR R	 ltR
 R ltR R ltR R ltRRRRRR/R R lltR R ltR R ltR R ltR# )a<  Persistent MCP tool-schema cache for lazy server startup: per-server tool manifests on
disk so Hermes can register MCP tools into the agent snapshot without spawning the stdio
child at idle dashboard startup. Entries are keyed by server name + a fingerprint of the
connection config (command/args/url/tools filters).)ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚOptionalzmcp_schema_cache.jsonc               ó   € V ^8„  d   QhRR/# )é   Úreturnr   © )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/tools/mcp_schema_cache.pyÚ__annotate__r      s   € ÷ 9ñ 9�Tñ 9ó    c                 ó@   € ^ RI Hp  V ! 4       R,          \        ,          # )é    ©Úget_hermes_homeÚcache)Úhermes_constantsr   Ú_CACHE_FILENAMEr   s    r   Ú_cache_pathr      s   € Ý0ÙÓ˜wÕ&¬Õ8Ð8r   c               ó    € V ^8„  d   QhRRRR/# )r	   ÚconfigÚdictr
   Ústrr   )r   s   "r   r   r      s   € ÷ @ñ @˜tð @¨ñ @r   c                ó  € V P                  R4      ;'       g    / pRV P                  R4      RV P                  R4      ;'       g    . RV P                  R4      RV P                  R4      R\        VP                  R4      ;'       g    . 4      R\        VP                  R	4      ;'       g    . 4      /p\        P                  ! VR
RR7      p\        P
                  ! VP                  R4      4      P                  4       R,          # )zEStable hash of the connection-defining parts of an MCP server config.ÚtoolsÚcommandÚargsÚurlÚ	transportÚtools_includeÚincludeÚtools_excludeÚexcludeT)Ú	sort_keysÚ
separatorszutf-8:Né   N)Ú,Ú:)ÚgetÚsortedÚjsonÚdumpsÚhashlibÚsha256ÚencodeÚ	hexdigest)r   Útools_filterÚpayloadÚraws   &   r   Úconfig_fingerprintr6      sÔ   € à—:‘:˜gÓ&×,Ð,¨"€Là�6—:‘:˜iÓ(Ø�—
‘
˜6Ó"×(Ð( bØˆv�z‰z˜%Ó Ø�V—Z‘Z Ó,Øœ × 0Ñ 0°Ó ;× AÐ A¸rÓBØœ × 0Ñ 0°Ó ;× AÐ A¸rÓBðD€Gô �*Š*�W¨¸Ô
D€CÜ�>Š>˜#Ÿ*™* WÓ-Ó.×8Ñ8Ó:¸3Õ?Ð?r   c               ó   € V ^8„  d   QhRR/# )r	   r
   údict[str, Any]r   )r   s   "r   r   r   )   s   € ÷ 	ñ 	�>ñ 	r   c                 ó(  € \        4       p V P                  4       '       g   / #  \        P                  ! V P	                  R R7      4      p\        V\        4      '       d   V# / #   \         d#   p\        P                  RY4       / u Rp?# Rp?ii ; i)z	utf-8-sig)Úencodingz&Could not read MCP schema cache %s: %sN)
r   Úexistsr-   ÚloadsÚ	read_textÚ
isinstancer   Ú	ExceptionÚloggerÚdebug)ÚpathÚdataÚexcs      r   Ú	_load_allrE   )   sr   € Ü‹=€DØ�;‰;�=Š=Øˆ	ðÜ�zŠz˜$Ÿ.™.°+˜.Ó>Ó?ˆÜ! $¬×-Ò-ˆtÐ5°2Ð5øÜô Ü�‰Ð=¸tÔIØ�	ûðús#   ¤=A$ Á"A$ Á$BÁ/BÂBÂBc               ó    € V ^8„  d   QhRRRR/# )r	   rC   r8   r
   ÚNoner   )r   s   "r   r   r   5   s   € ÷ 7ñ 7�Nð 7 tñ 7r   c                ó8   € ^ RI Hp V! \        4       V RR7       R# )r   )Úatomic_json_writei€  )ÚmodeN)ÚutilsrI   r   )rC   rI   s   & r   Ú	_save_allrL   5   s   € Ý'á”k“m T°×6r   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   Úserver_namer   Úfingerprintr
   zOptional[dict]r   )r   s   "r   r   r   ;   s!   € ÷ &ñ & #ð &°Cð &¸Nñ &r   c                ó  € \         ;_uu_ 4        \        4       P                  V 4      pRRR4       \        X\        4      '       d   VP                  R4      V8w  d   R# VP                  R4      pVP                  R4      p\        V\
        \        34      ;'       dN    \        V\
        \        34      ;'       d0    \        P                  ! 4       V,
          R,          \        V4      8¬  pV'       d   R# T#   + '       g   i     L×; i)a\  Return cached entry when fingerprint matches (and TTL holds), else None. ``tools/list``
results may carry ``ttlMs`` (SEP-2549); an entry older than a recorded TTL is a miss so the
next startup re-probes instead of serving a stale manifest forever. Entries without a TTL
never expire. ``cacheScope`` is irrelevant: this cache is per-user local disk.NrO   Úttl_msÚ
written_atg     @�@)Ú_cache_lockrE   r+   r>   r   ÚintÚfloatÚtime)rN   rO   ÚentryrQ   rR   Úexpireds   &&    r   Úget_cached_entryrY   ;   sÄ   € ÷
 
ŽÜ“—‘ Ó,ˆ÷ 
ä�eœT×"Ò" e§i¡i°Ó&>À+Ô&MÙØ�Y‰Y�xÓ €FØ—‘˜<Ó(€JÜ˜&¤3¬ ,Ó/÷ Hð H´J¸zÌCÔQVÈ<Ó4X÷ Hð HÜ—I’I“K *Õ,°Õ6¼%À»-ÑGð çˆ4Ð% Ð%÷ 
�ús   �C8Ã8D	Úutility_toolsrQ   Úcache_scopec               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r	   rN   r   rO   r   ú
list[dict]rZ   zOptional[list[dict]]rQ   zOptional[float]r[   zOptional[str]r
   rG   r   )r   s   "r   r   r   K   sA   € ÷ ñ  3ð °Sð ÀJð Ø%9ðØJYðà#0ðà<@ñr   c               óŠ  € RTRTRT;'       g    . /p\        V\        \        34      '       d   WFR&   \        P                  ! 4       VR&   V'       d   WVR&   \        ;_uu_ 4        \        4       pRV9  d"   VP                  V 4      V8X  d    RRR4       R# WgV &   \        V4       RRR4       R#   + '       g   i     R# ; i)z¥Persist tool schemas after a successful live connect. ``ttl_ms`` / ``cache_scope`` are
the server's ``tools/list`` SEP-2549 hints; ``written_at`` anchors TTL expiry.rO   r   rZ   rQ   rR   r[   N)r>   rT   rU   rV   rS   rE   r+   rL   )rN   rO   r   rZ   rQ   r[   rW   rC   s   &&$$$$  r   Úwrite_cache_entryr_   K   sŸ   € ð
 ˜K¨°%¸È-×J]ÐJ]Ð[]Ð^€EÜ�&œ3¤˜,×'Ò'Ø ˆh‰Ü"Ÿiši›kˆˆlÑßØ*ˆmÑß	ŽÜ‹{ˆð ˜uÔ$¨¯©°+Ó)>À%Ô)GØ÷ 
‰ð "ˆ[ÑÜ�$Œ÷ 
��Šús   Á%)B1ÂB1Â1C	c               ó$   € V ^8„  d   QhRRRRRR/# )r	   rW   r   Úkeyr   r
   r]   r   )r   s   "r   r   r   a   s!   € ÷ :ñ :�tð : #ð :¨*ñ :r   c                ój   € V P                  V4      p\        V\        4      '       d   \        V4      # . # )N)r+   r>   Úlist)rW   ra   Úvalues   && r   Ú_list_fieldre   a   s*   € Ø�I‰I�c‹N€EÜ$ U¬D×1Ò1Œ4�‹;Ð9°rÐ9r   c               ó    € V ^8„  d   QhRRRR/# ©r	   rW   r   r
   r]   r   )r   s   "r   r   r   f   s   € ÷ 'ñ ' $ð '¨:ñ 'r   c                ó   € \        V R4      # )z>Return cached MCP tool dicts (name, description, inputSchema).r   ©re   ©rW   s   &r   Útools_from_cache_entryrk   f   s   € ä�u˜gÓ&Ð&r   c               ó    € V ^8„  d   QhRRRR/# rg   r   )r   s   "r   r   r   k   s   € ÷ /ñ /¨$ð /°:ñ /r   c                ó   € \        V R4      # )z5Return cached ``{schema, handler_key}`` utility rows.rZ   ri   rj   s   &r   Úutility_tools_from_cache_entryrn   k   s   € ä�u˜oÓ.Ð.r   )Ú__doc__Ú
__future__r   r/   r-   ÚloggingÚ	threadingrV   Úpathlibr   Útypingr   r   r   r   Ú	getLoggerÚ__name__r@   r   ÚLockrS   r   r6   rE   rL   rY   r_   re   rk   rn   r   r   r   Ú<module>rx      sŽ   ðñ7õ
 #ã Û Û Û Û Ý ß ,Ó ,à	×	Ò	˜8Ó	$€à)€Ø�nŠnÓ€õ9õ
@õ	õ7õ&ð Ø<@ðØ\`ðà37÷õ,:õ
'÷
/r   