Ë
    ãß²jÊ  ã                   óÊ   — U d Z ddlZddlZddlZddlmZ i Zeeeeef   f   e	d<    ej                  «       ZdZdZdededz  fd	„Zdeddfd
„Zdedz  fd„Zddedz  ddfd„Zy)u™  skill_view repeat-view dedup registry: per-task cache of (skill name, file_path) ->
(skill file mtime+size). A repeat view of an UNCHANGED file returns a short stub â€” the earlier
tool result already carries the content verbatim. Cleared via ``reset_skill_view_dedup()`` on
context compression AND on a committed proactive tool-result prune, because both replace the
original content with a one-line marker.
é    N)ÚDictÚ_skill_view_trackeréÈ   uâ   Skill content unchanged since it was loaded earlier in this conversation â€” refer to the earlier skill_view result; it is still current and complete. (Re-issued after context compression, this returns the full content again.)ÚpayloadÚreturnc                 ó¦   — | j                  d«      x}sy	 t        j                  |«      }||j                  |j                  fS # t
        $ r Y yw xY w)zIStat the skill file a successful skill_view served, for change detection.Ú_source_pathN)ÚgetÚosÚstatÚst_mtime_nsÚst_sizeÚOSError)r   ÚsrcÚsts      ú</home/ubuntu/.hermes/hermes-agent/tools/skills_tool_dedup.pyÚ_skill_view_fingerprintr      sR   € à—;‘;˜~Ó.Ð.ˆCÐ.ØðÜ�W‰W�S‹\ˆØ�R—^‘^ R§Z¡ZÐ0Ð0øÜò Ùðús   –-A Á	AÁAc                 óª  — | r%|j                  d«      s|j                  d«      dk(  ryt        |«      x}€yt        |j                  d«      xs |«      |xs df}t        5  t        j                  t        | «      i «      }|||<   t        |«      t        kD  r(|t        t        |«      «      = t        |«      t        kD  rŒ(ddd«       y# 1 sw Y   yxY w)zARecord a served skill_view so an identical repeat can be deduped.Úsetup_neededÚreadiness_statusNÚnameÚ )
r
   r   ÚstrÚ_skill_view_tracker_lockr   Ú
setdefaultÚlenÚ_SKILL_VIEW_DEDUP_CAPÚnextÚiter)Útask_idr   Ú	file_pathr   ÚfpÚkeyÚcaches          r   Ú_record_skill_viewr%   #   s¿   € ñ �w—{‘{ >Ô2Ø�{‰{Ð-Ó.°.Ò@ØÜ% gÓ.Ð.ˆÐ7ØÜˆw�{‰{˜6Ó"Ò* dÓ+¨Yª_¸"Ð
=€CÜ	!ñ )Ü#×.Ñ.¬s°7«|¸RÓ@ˆØˆˆc‰
Ü�%‹jÔ0Ò0Ø”dœ4 ›;Ó'Ð(ô �%‹jÔ0Ó0÷)÷ )ñ )ús   Á!AC	Ã	Cc                 óÂ  — | syt        |«      }t        5  t        j                  t        | «      «      x}s
	 ddd«       yt	        |j                  «       «      D ]Þ  \  }\  }}}|\  }	}
|
|xs dk7  sD|	|k7  r@|j                  d|	z   «      s,|	j                  d|z   «      s|j                  d«      d   |	k7  rŒ]	 t        j                  |«      }|j                  |j                  f||fk7  }|r|j                  |d«        ddd«       yt        j                  dd|	|xs ddd	t         d
œd	¬«      c cddd«       S  	 ddd«       y# t        $ r d}Y Œhw xY w# 1 sw Y   yxY w)zsDedup stub when this exact skill file was already served to this task and
    is unchanged on disk; None otherwise.Nr   ú/ú:éÿÿÿÿTÚ	unchangedzSKILL.mdF)ÚsuccessÚstatusr   ÚfileÚdedupÚcontent_returnedÚmessage)Úensure_ascii)r   r   r   r
   ÚlistÚitemsÚendswithÚsplitr   r   r   r   r   ÚpopÚjsonÚdumpsÚ_SKILL_VIEW_DEDUP_MESSAGE)r    r   r!   Únr$   r#   r   Úmtime_nsÚsizeÚrec_nameÚrec_fpr   Úchangeds                r   Ú_check_skill_view_dedupr@   4   s…  € ñ ØÜˆD‹	€AÜ	!ñ KÜ,×0Ñ0´°W³Ó>Ð>�Ð>Ø÷Kð Kô
 +/¨u¯{©{«}Ó*=ò 	KÑ&ˆCÑ&�#�x Ø"ÑˆH�fØ˜)š/ rÒ*Ø ’M¨!¯*©*°S¸8±^Ô*DØ$×-Ñ-¨c°A©gÔ6¸1¿7¹7À3»<ÈÑ;KÈxÒ;WØðÜ—W‘W˜S“\�ØŸ>™>¨2¯:©:Ð6¸8ÀTÐ:JÑJ�ñ Ø—	‘	˜#˜tÔ$Ø÷%Kð Kô& —:‘:Ø¨;ÀØ!Ò/ Z¸$ÐTYÜ4ñ6ð EJôKñ K÷'Kñ Kñ
	K÷Kð. øô ò Ø’ðú÷Kð. úsB   •"EÁ A6EÂ72EÃ)EÄ(EÄ9EÅEÅEÅEÅEÅEr    c                 ó¦   — t         5  | €t        j                  «        nt        j                  t	        | «      d«       ddd«       y# 1 sw Y   yxY w)zVClear the dedup cache (all tasks when task_id is None); called on context compression.N)r   r   Úclearr6   r   )r    s    r   Úreset_skill_view_deduprC   T   s?   € ä	!ñ 8Øˆ?Ü×%Ñ%Õ'ä×#Ñ#¤C¨£L°$Ô7÷	8÷ 8ñ 8ús   ‡7AÁA)N)Ú__doc__r7   r   Ú	threadingÚtypingr   r   r   ÚtupleÚ__annotations__ÚLockr   r   r9   Údictr   r%   r@   rC   © ó    r   ú<module>rM      s§   ðòó Û 	Û Ý à57Ð �T˜#˜t E¨5 LÑ1Ð1Ñ2Ó 7Ø)˜9Ÿ>™>Ó+Ð ØÐ ð'ð ð Tð ¨e°d©ló ð)¸$ð )À4ó )ð"¸¸t¹ó ñ@8 C¨$¡Jð 8¸$ô 8rL   