+
    jHàj½ˆ  ã                  óÈ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RI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HtHtHtHt ^ RIHt ]P6                  ! R4      t0 R7mtR	]R
&   RR8RR9/tR]R&   R0t R	]R&   R0t!R	]R&   Rt"^t#Rt$R R lt%]&! R04      t'Rt(Rt)^ t*Rt+]
PX                  ! R4      t-Rt.Rt/Rt0R R lt1R R lt2R  R! lt3R"t4^t5^@t6]7! 4       t8]! R#R$7       ! R% R&4      4       t9]! R#R$7       ! R' R(4      4       t:]! R#R$7       ! R) R*4      4       t;]! R#R$7       ! R+ R,4      4       t<R-t=R.t>]7! 4       t?R:R/ R0 llt@R1 R2 ltAR-tBR3 R4 ltC ! R5 R64      tDR# );zåPlugin hook / middleware / event-bus / system-prompt-section dispatch.

Mixed into :class:`hermes_cli.plugins.PluginManager`. ``_resolve_hook_callback_timeout`` stays on
the origin (tests patch it there) and is looked up lazily.
)ÚannotationsN)Ú	dataclass)ÚAnyÚCallableÚDictÚListÚMappingÚOptionalÚSetÚUnion)ÚOBSERVER_SCHEMA_VERSIONzhermes_cli.pluginsÚpre_commandÚpost_compactionzset[str]Ú_HOOK_TIMEOUT_BOUNDED_HOOKSzdict[str, tuple[str, ...]]Ú_HOOK_CALL_IDENTITY_FIELDSÚpre_tool_callÚ_HOOK_TIMEOUT_FAIL_CLOSED_HOOKSÚsubagent_stopÚ_HOOK_CALLER_THREAD_HOOKSg      N@z;pre_tool_call plugin callback timed out or is still runningc               ó(   € V ^8„  d   QhRRRRRRRR/# )	é   Ú	hook_nameÚstrÚcbr   ÚexcÚBaseExceptionÚreturnzdict[str, str]© )Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/hermes_cli/plugins_dispatch.pyÚ__annotate__r    F   s/   € ÷ uñ u¨Sð u°hð uÀ]ð uÐWeñ uó    c                ó–   € \        VR\        V4      4      pRRRV  RV R\        V4      P                   R\	        V4      R,           2/# )	uõ   Block directive for a fail-closed hook whose callback raised: names the callback and the
error (truncated â€” a hook that embeds tool args in its exception must not grow the tool
result) so the operator can tell a crashing guard from a slow one.Ú__name__ÚactionÚblockÚmessagez plugin callback z raised z: ºNéÈ   N)ÚgetattrÚreprÚtyper#   r   )r   r   r   Úcallback_names   &&& r   Ú_policy_error_block_directiver-   F   s_   € ô ˜B 
¬D°«HÓ5€MØ�gØ˜)˜Ð$5°m°_ÀHÌTÐRUËY×M_ÑM_ÐL`Ð`bÔcfÐgjÓckÐlpÕcqÐbrÐsðuð ur!   Úafter_memoryi   i@  z^[a-z0-9][a-z0-9._-]{0,127}$z## Plugin Context: z%<!-- hermes-plugin-sections:start -->z#<!-- hermes-plugin-sections:end -->c               ó    € V ^8„  d   QhRRRR/# )r   Úvaluer   r   Úboolr   )r   s   "r   r    r    Z   s   € ÷ Zñ Z¨Sð Z°Tñ Zr!   c                ón   € \        V \        4      ;'       d    \        \        P	                  V 4      4      # )zDReturn whether *value* is a stable, heading-safe section identifier.)Ú
isinstancer   r1   Ú_SYSTEM_PROMPT_SECTION_ID_REÚ	fullmatch)r0   s   &r   Ú!is_valid_system_prompt_section_idr6   Z   s)   € ä�eœSÓ!×YÐY¤dÔ+G×+QÑ+QÐRWÓ+XÓ&YÐYr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú
section_idr   Úcontentr   r   )r   s   "r   r    r    _   s&   € ÷ Mñ M¨Sð M¸3ð MÀ3ñ Mr!   c                ó4   € \          V  R\        V4       RV 2# )zJRender an auditable, length-framed block recoverable from the full prompt.z"
<!-- hermes-plugin-section-chars:z -->

)Ú%_SYSTEM_PROMPT_SECTION_HEADING_PREFIXÚlen)r8   r9   s   &&r   Úformat_system_prompt_sectionr=   _   s.   € ô 1Ð
1°*°ð >,Ü,/°«L¨>¸À'Àð	LðMr!   c               ó    € V ^8„  d   QhRRRR/# )r   ÚsectionsÚlistr   r   r   )r   s   "r   r    r    f   s   € ÷ [ñ [¨Dð [°Sñ [r!   c                óØ   € V '       g   R# V  Uu. uF#  p\        VP                  VP                  4      NK%  	  pp\         R2RP	                  V4      ,           R\
         2,           # u upi )z=Render the canonical container used for persistence recovery.Ú Ú
z

)r=   Úidr9   ÚPLUGIN_SECTIONS_STARTÚjoinÚPLUGIN_SECTIONS_END)r?   ÚitemÚblockss   &  r   Úformat_system_prompt_sectionsrJ   f   s\   € çÙÙNVÓWÉhÀdÔ*¨4¯7©7°D·L±LÖAÉh€FÐWÜ#Ð$ BÐ'¨&¯+©+°fÓ*=Õ=À"ÔEXÐDYÐ@ZÕZÐZùò Xs   �)A'ÚhermesT)Úfrozenc                  óN   € ] tR t^wt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
tR# )ÚPluginSystemPromptSectionz:A plugin-owned section rendered once for each new session.r   rD   z(str | Callable[[Mapping[str, Any]], str]r9   ÚpositionÚintÚ	max_charsÚpluginr   N©r#   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r   r!   r   rN   rN   w   s   ‡ áDàƒGØ5Ó5ØƒMØƒNØ‡Kr!   rN   c                  óD   € ] tR t^‚t$ RtR]R&   R]R&   R]R&   R]R&   RtR# )	Ú!RenderedPluginSystemPromptSectionz4Validated prompt bytes frozen on the owning AIAgent.r   rD   r9   rO   rR   r   NrS   r   r!   r   r[   r[   ‚   s   ‡ á>àƒGØƒLØƒMØ‡Kr!   r[   c                  ó0   € ] tR t^Œt$ RtR]R&   R]R&   RtR# )Ú_EventSubscriptionz%Host-owned subscription ledger entry.r   Úownerr   Úcallbackr   NrS   r   r!   r   r]   r]   Œ   s   ‡ á/àƒJØ×r!   r]   c                  óX   € ] tR t^”t$ RtR]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   RtR# )Ú_QueuedPluginEventz9Immutable dispatch envelope consumed by the event worker.r   Úeventúdict[str, Any]Úpayloadztuple[_EventSubscription, ...]ÚsubscriptionsrP   ÚdepthÚ
generationzcontextvars.ContextÚcontextr   NrS   r   r!   r   ra   ra   ”   s(   ‡ áCàƒJØÓØ1Ó1ØƒJØƒOð !× r!   ra   g      >@g     À‚@c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úkwargsrc   r   r   r   úOptional[str]r   )r   s   "r   r    r    ©   s!   € ÷ ñ  ð ¸3ð Èñ r!   c                óª   € \         P                  VR4       F8  pV P                  V4      p\        V\        4      '       g   K,  V'       g   K6  Vu # 	  R# )uä  Identity of the call this callback fires for, or ``None`` when the event has none.

Concurrent invocations of the same tool in one session must not collapse into one
gate key: they are different work, and treating the second as a duplicate drops the
hook as if a callback had timed out (upstream #98382). The identity is already in the
payload; nothing new is plumbed. Deliberately not ``api_request_id`` â€” one API request
carries many tool calls, which would re-collapse the keys.
N)Útool_call_idÚturn_id)r   Úgetr3   r   )rj   r   Úfieldr0   s   &&  r   Ú_hook_call_identityrq   ©   sF   € ô ,×/Ñ/°	Ð;VÖWˆØ—
‘
˜5Ó!ˆÜ�eœS×!Ô!§e¡eØŠLñ Xñ r!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r   r   ÚtimeoutÚfloatr   r1   r   )r   s   "r   r    r    ¹   s&   € ÷ dñ d¨3ð d¸ð dÀ4ñ dr!   c                ó^   € V^ 8:  g   V \         9   d   R# V \        9   ;'       g
    V \        9   # )zCWhether *hook_name* should run under the non-blocking timeout path.F)r   r   r   )r   rs   s   &&r   Ú_hook_uses_callback_timeoutrv   ¹   s.   € à�!„|�yÔ$=Ô=ÙØÔ3Ñ3×cÐc°yÔDcÑ7cÐcr!   c               ó    € V ^8„  d   QhRRRR/# )r   Úresultr   r   r   )r   s   "r   r    r    Ã   s   € ÷  ñ  ¨#ð  °#ñ  r!   c                ó8  a aaa€ \         P                  ! S 4      '       g   S #  \        P                  ! 4        / o/ o\        P                  ! 4       oR TTTT 3R llp\        P                  ! \        P                  ! 4       P
                  T3RRR7      P                  4        SP                  \        R7      '       g   \        R\        R R	24      hR
S9   d
   SR
,          hSP                  R4      #   \         d    \        P
                  ! S 4      u # i ; i)zÂResolve a plugin command result, awaiting async handlers: ``asyncio.run`` when no loop is
running, else a helper thread with its own loop (30s bound so a hung handler cannot wedge the
terminal).c               ó   € V ^8„  d   QhRR/# ©r   r   ÚNoner   )r   s   "r   r    Ú3resolve_plugin_command_result.<locals>.__annotate__Ñ   s   € ÷ ñ �Tñ r!   c                 óÀ   <€  \         P                  ! S4      SR &   SP                  4        R#   \         d   p T SR&    Rp ? L'Rp ? ii ; i  SP                  4        i ; i©r0   r   N)ÚasyncioÚrunr   Úset)r   ÚdoneÚfailureÚoutcomerx   s    €€€€r   Ú_runnerÚ.resolve_plugin_command_result.<locals>._runnerÑ   sM   ø€ ð	Ü&Ÿ{š{¨6Ó2ˆG�GÑð �H‰HŽJøô ô 	!Ø ˆG�EŽNûð	!ûð �H‰H�Jús%   ƒ. ®A¹A¾A ÁAÁA ÁAzhermes-plugin-command-awaitT©ÚtargetÚargsÚnameÚdaemon©rs   z5Plugin command async handler did not complete within z.0fÚsr   r0   )ÚinspectÚisawaitabler€   Úget_running_loopÚRuntimeErrorr�   Ú	threadingÚEventÚThreadÚcontextvarsÚcopy_contextÚstartÚwaitÚ"_PLUGIN_COMMAND_AWAIT_TIMEOUT_SECSÚTimeoutErrorro   )rx   r†   rƒ   r„   r…   s   f @@@r   Úresolve_plugin_command_resultrœ   Ã   sõ   û€ ô ×Ò˜v×&Ò&Øˆð#Ü× Ò Ô"ð !€GØ(*€GÜ�?Š?Ó€D÷ó ô ×ÒœK×4Ò4Ó6×:Ñ:À'ÀØ7ÀôFßFKÁeÄgØ�9‰9Ô?ˆ9×@Ò@ÜÐRÜ@ÀÐEÀQðHó Ið 	Ià�ÔØ�e�nÐØ�;‰;�wÓÐøô/ ô #Ü�{Š{˜6Ó"Ò"ð#ús   ¤C5 Ã5!DÄDc                  ó8  € ] tR t^åt]R R l4       t]R R l4       tR R ltRR/R	 R
 llt	R R lt
R R ltR R l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" ltR# R$ lt]R% R& l4       tR' R( ltR)R*/R+ R, lltR-tR*# )/ÚPluginDispatchMixinc               ó$   € V ^8„  d   QhRRRRRR/# )r   r_   r   rd   rc   r   r   )r   s   "r   r    Ú PluginDispatchMixin.__annotate__ç   s!   € ÷ 
ñ 
¨ð 
¸>ð 
Ènñ 
r!   c                óH  €  \         P                  ! V 4      P                  p\        ;QJ d*    R TP                  4        4       F  '       g   K   RM	  RM! R TP                  4        4       4      '       d   \        T4      # \         P                  P                  \         P                  P                  0pTP                  4        UUu/ uF(  w  rEYB9   g   K  Y$,          P                  T9   g   K&  YEbK*  	  upp#   \        \        3 d    \        T4      u # i ; iu uppi )zšThe slice of *payload* a callback accepts: everything for ``**kwargs`` (or
un-introspectable) callbacks, only declared names for narrow legacy signatures.c              3  ón   "  € T F+  qP                   \        P                  P                  8H  x € K-  	  R # 5i©N)Úkindr�   Ú	ParameterÚVAR_KEYWORD)Ú.0Úps   & r   Ú	<genexpr>Ú<PluginDispatchMixin._hook_callback_kwargs.<locals>.<genexpr>î   s%   é € ÐTÑ@S¸1�v‰vœ×*Ñ*×6Ñ6Ö6Ó@Sùs   ‚35TF)r�   Ú	signatureÚ
parametersÚ	TypeErrorÚ
ValueErrorÚdictÚanyÚvaluesr¥   ÚPOSITIONAL_OR_KEYWORDÚKEYWORD_ONLYÚitemsr¤   )r_   rd   r¬   Úkeyword_kindsr‹   r0   s   &&    r   Ú_hook_callback_kwargsÚ)PluginDispatchMixin._hook_callback_kwargsæ   sé   € ð	!Ü ×*Ò*¨8Ó4×?Ñ?ˆJ÷ ‹3ÑTÀ
×@QÑ@QÔ@SÓT�3�3Š3ÑTÀ
×@QÑ@QÔ@SÓT×TÒTÜ˜“=Ð Ü ×*Ñ*×@Ñ@Ä'×BSÑBS×B`ÑB`Ðaˆà+2¯=©=¬?ô
Ù+:™K˜DØÑ!ô Ø&0Õ&6×&;Ñ&;¸}Ñ&Lô ˆDŠK©?ò
ð 	
øô œ:Ð&ô 	!Ü˜“=Ò ð	!üó

s#   ‚ C< Ã

DÃDÃ2DÃ<DÄDc               ó$   € V ^8„  d   QhRRRRRR/# )r   r_   r   rd   rc   r   r   r   )r   s   "r   r    r    ÷   s'   € ÷ gñ g¨Xð gÀð gÐSVñ gr!   c           
     óB   € \        V! R/ V P                  W4      B 4      # )a"  Invoke a hook while withholding additive fields from narrow legacy callbacks.

An ``async def`` callback returns a coroutine; resolve it the way plugin slash commands
are (loop-safe), otherwise the bare coroutine object is appended to the results and the
plugin's body never runs (#12449).
r   )rœ   r¶   )Úclsr_   rd   s   &&&r   Ú_invoke_hook_callbackÚ)PluginDispatchMixin._invoke_hook_callbackö   s#   € ô -©XÑ-e¸×8QÑ8QÐRZÓ8dÑ-eÓfÐfr!   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r   r   rj   r   r   ú	list[Any]r   )r   s   "r   r    r       s!   € ÷ &ñ & Sð &°Cð &¸Iñ &r!   c           	     óŒ  € ^ RI Hp V! 4       '       d   . # ^ RIHp VR8w  d   VP	                  R\
        4       . pV! 4       p\        W4      pV\        9   pV P                  P                  V. 4       Ft  p	 V'       dA   V P                  WW&4      p
V
\        J d$   V'       d   VP                  RRR\        /4       KK  MV P                  W’4      p
V
e   VP                  V
4       Kt  Kv  	  V#   \        \         3 dG   pT P#                  YY+4       T'       d"   TP                  \%        YT4      4        Rp?KÆ   Rp?KÌ  Rp?ii ; i)	a  Call all callbacks for *hook_name*; return their non-``None`` results.

Payloads evolve additively: ``**kwargs`` callbacks get everything, narrow signatures only
what they declare. Each callback is isolated. Bounded hooks and ``pre_tool_call`` run under
``plugins.hook_callback_timeout`` (worker abandoned, never joined); ``pre_tool_call`` fails
closed with a block directive, others skip. ``_HOOK_CALLER_THREAD_HOOKS`` always run on the
caller thread. ``pre_llm_call`` may return ``{"context": "..."}`` (or a str) to inject.
©Úsafe_worker_enabled©Ú_resolve_hook_callback_timeoutÚgateway_platform_eventÚtelemetry_schema_versionr$   r%   r&   N)Úagent.safe_worker_policyrÂ   Úhermes_cli.pluginsrÄ   Ú
setdefaultr   rv   r   Ú_hooksro   Ú_run_hook_callback_boundedÚ_HOOK_SKIPPEDÚappendÚ$_PRE_TOOL_CALL_TIMEOUT_BLOCK_MESSAGEr»   Ú	ExceptionÚ
SystemExitÚ_report_hook_failurer-   )Úselfr   rj   rÂ   rÄ   Úresultsrs   Úuse_timeoutÚfail_closedr   Úretr   s   &&,         r   Úinvoke_hookÚPluginDispatchMixin.invoke_hook   s-  € õ 	Aá× Ò ØˆIÝEð Ð0Ô0Ø×ÑÐ8Ô:QÔRØˆÙ0Ó2ˆÜ1°)ÓEˆØÔ#BÑBˆØ—+‘+—/‘/ )¨RÖ0ˆBðVßØ×9Ñ9¸)ÈÓY�CØœmÓ+ß&Ø#ŸN™N¨H°g¸yÔJnÐ+oÔpÙ ð ,ð
 ×4Ñ4°RÓ@�CØ’?Ø—N‘N 3Ö'ñ #ñ 1ð  ˆøô	 œzÐ*ô VØ×)Ñ)¨)¸ÔEßØ—N‘NÔ#@ÀÐPSÓ#T×UÒUõ ûðVús$   Á6+C,Â"C,Â='C,Ã,EÃ=5D>Ä>EÚsurfaceÚHookc               ó0   € V ^8„  d   QhRRRRRRRRR	RR
R/# )r   r   r   r   r   rj   rc   r   r   rÙ   r   r|   r   )r   s   "r   r    r    (  sD   € ÷ oñ oØðoØ"*ðoØ4BðoØIVðoØdgðoà	ñor!   c               óÌ  € \        VR\        V4      4      pV\        VRR4      \        VRV4      \        V4      P                  \	        V4      R,          3pWpP
                  9   d   \        P                  RWQWd4       R# V P
                  P                  V4       \        P                  RYQYdVP                  4       R	P                  \        V4      4      ;'       g    R
4       R# )u¢  One WARNING per distinct (hook, callback, error); identical repeats at DEBUG.

A callback whose signature names a parameter the hook never sends (``tool_data`` instead
of ``tool_name``/``args``) fails identically on every tool call â€” ~1700 WARNING lines an
hour that bury real signals (#111922). The first report names the fields the hook does
provide so the plugin author can fix the signature. The key names the callback by
module/qualname (not ``id()``, which CPython recycles across plugin reloads) and
truncates the message so a hook that embeds tool args in its error cannot grow the set
per call; the set is cleared on unload alongside the timeout-suppression map.
r#   rT   rB   rU   r'   z$%s '%s' callback %s raised again: %sNzd%s '%s' callback %s raised: %s (%s provides: %s; identical failures are logged at DEBUG from now on)z, z	no fields)r)   r*   r+   r#   r   Ú_hook_failures_reportedÚloggerÚdebugÚaddÚwarningÚlowerrF   Úsorted)rÒ   r   r   rj   r   rÙ   r,   Úkeys   &&&&&$  r   rÑ   Ú(PluginDispatchMixin._report_hook_failure(  s¹   € ô    J´°R³Ó9ˆØœ' " l°BÓ7¼ÀÀ^ÐUbÓ9cÜ�C‹y×!Ñ!¤3 s£8¨D¥>ð3ˆà×.Ñ.Ô.Ü�L‰LÐ?ÀÐUbÔhÙØ×$Ñ$×(Ñ(¨Ô-Ü�‰ØrØ °G·M±M³OÀTÇYÁYÌvÐV\Ë~ÓE^×EmÐEmÐbmö	or!   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r   r   r   r   rj   rc   rs   rt   r   r   r   )r   s   "r   r    r    @  s;   € ÷ V$ñ V$ØðV$Ø"*ðV$Ø4BðV$ØMRðV$à	ñV$r!   c                ó¤  a aaaaaaaaaa€ \        SR\        S4      4      pV\        S4      3o. SO\        SV4      N5o\	        4       oS P
                  ;_uu_ 4        S P                  P                  S4      pSS P                  9   g   VeA   V\        P                  ! 4       8”  d'   \        P                  RW4       \        uuRRR4       # S P                  P                  S4      pV'       dQ   \        V4      \         8¼  d=   \        P                  RW\        SRR4      \        V4      4       \        uuRRR4       # Ve   S P                  P#                  SR4       SS P                  S&   RRR4       \$        P&                  ! 4       o\(        P*                  ! 4       o/ o/ oR VV VV3R lloR	 VVVVVVVV 3R
 llp\(        P,                  ! VRV 2R,          RR7      p	 V	P/                  4        SP3                  TR7      '       gÀ   S P
                  ;_uu_ 4        \        P                  ! 4       S P4                  ,           S P                  S&   S P                  P                  S4      SJ d4   S P                  P7                  S\9        4       4      P;                  S4       RRR4       \        P                  RYT4       \        # RS9   d
   SR,          hSP                  R4      #   + '       g   i     EL‡; i  \0         d/   p
S! 4        \        P                  RYT
4       \        u Rp
?
# Rp
?
ii ; i  + '       g   i     Lž; i)a  Run one callback on a daemon worker with a wall-clock cap; ``_HOOK_SKIPPED`` when
suppressed, still running for this call id, over the abandoned-worker cap, timed out
(worker abandoned, never joined), or the worker could not be started. Exceptions
propagate.r#   NzKHook '%s' callback %s skipped after previous timeout or while still runningu“   Hook '%s' callback %s (%s) skipped: %d abandoned worker(s) still running â€” the plugin is hung; fix or disable it (retried when a worker finishes)rT   zunknown pluginc               ó   € V ^8„  d   QhRR/# r{   r   )r   s   "r   r    ÚDPluginDispatchMixin._run_hook_callback_bounded.<locals>.__annotate__k  s   € ÷ 	Lñ 	L ñ 	Lr!   c                 óˆ  <€ SP                   ;_uu_ 4        SP                  P                  S4      SJ dq   SP                  P                  SR 4       SP                  P                  S4      p V e6   V P                  S4       V '       g   SP                  P                  SR 4       R R R 4       R #   + '       g   i     R # ; ir£   )Ú_hook_timeout_lockÚ_hook_running_callbacksro   ÚpopÚ_hook_abandonedÚdiscard)Ú	abandonedÚgate_keyrÒ   Úsuppression_keyÚtokens    €€€€r   Ú_release_tokenÚFPluginDispatchMixin._run_hook_callback_bounded.<locals>._release_tokenk  s�   ø€ Ø×(×(Ó(Ø×/Ñ/×3Ñ3°HÓ=ÀÓFØ×0Ñ0×4Ñ4°X¸tÔDØ $× 4Ñ 4× 8Ñ 8¸Ó I�IØ Ò,Ø!×)Ñ)¨(Ô3ß(Ø ×0Ñ0×4Ñ4°_ÀdÔK÷ )×(×(Ò(ús   –A3B0Â
B0Â0C	c               ó   € V ^8„  d   QhRR/# r{   r   )r   s   "r   r    ré   u  s   € ÷ 	ñ 	˜ñ 	r!   c                 óê   <€  SP                  SP                  SS4      SR &   S! 4        SP                  4        R#   \         d   p T SR&    Rp ? L.Rp ? ii ; i  S! 4        SP                  4        i ; ir   )r�   r»   r   r‚   )	r   rô   r   rh   rƒ   r„   rj   r…   rÒ   s	    €€€€€€€€r   r†   Ú?PluginDispatchMixin._run_hook_callback_bounded.<locals>._runneru  sc   ø€ ðØ#*§;¡;¨t×/IÑ/IÈ2ÈvÓ#V�˜Ñ ñ Ô Ø—‘–
øô	 !ô %Ø!$�˜–ûð%ûñ Ô Ø—‘•
ús'   ƒ < ¼AÁAÁA ÁAÁA ÁA2zhermes-hook-:Né(   NT)r‰   r‹   rŒ   u=   Hook '%s' callback %s worker failed to start: %s â€” skippingr�   u6   Hook '%s' callback %s timed out after %gs â€” skippingr   r0   )r)   r*   rD   rq   Úobjectrë   Ú_hook_timeout_suppressed_untilro   rì   ÚtimeÚ	monotonicrÞ   rá   rÌ   rî   r<   Ú_HOOK_MAX_ABANDONED_WORKERSrí   r–   r—   r“   r”   r•   r˜   r’   r™   Ú!_hook_timeout_suppression_secondsrÉ   r‚   rà   )rÒ   r   r   rj   rs   r,   Úsuppressed_untilrð   r†   Úthreadr   rô   rh   rƒ   r„   rñ   r…   rò   ró   s   f&ff&      @@@@@@@@r   rË   Ú.PluginDispatchMixin._run_hook_callback_bounded@  sÀ  ÿú€ ô    J´°R³Ó9ˆð %¤b¨£fÐ-ˆØM�_ÐMÔ&9¸&À)Ó&LÑMˆÜ“ˆØ×$×$Ó$Ø#×BÑB×FÑFÀÓWÐØ˜D×8Ñ8Ô8Ø(Ò4Ð9IÌDÏNÊNÓL\Ô9\Ü—‘ð5Ø6?ôPô %÷ %Ò$ð ×,Ñ,×0Ñ0°ÓAˆIßœS ›^Ô/JÔJÜ—‘ð]à¬g°b¸,ÐHXÓ.YÔ[^Ð_hÓ[iôkô %÷) %Ò$ð*  Ò+Ø×3Ñ3×7Ñ7¸ÈÔNØ5:ˆD×(Ñ(¨Ñ2÷/ %ô2 ×*Ò*Ó,ˆÜ�ŠÓ ˆØ"$ˆØ,.ˆ÷	Ló 	L÷	÷ 	ô ×!Ò!¨¸ÀmÀ_Ð7UÐVYÕ7ZÐcgÔhˆð	!Ø�L‰LŒNð �y‰y ˆy×)Ò)Ø×(×(Ó(ô —N’NÓ$ t×'MÑ'MÕMð ×3Ñ3°OÑDð
 ×/Ñ/×3Ñ3°HÓ=ÀÓFØ×(Ñ(×3Ñ3°OÄSÃUÓK×OÑOÐPXÔY÷ )ô �N‰NØHÈ)Ðdkômä Ð Ø�GÔØ˜%•.Ð Ø�{‰{˜7Ó#Ð#÷S %×$Ð$ûôh ô 	!ÙÔÜ�N‰NØOØ¨#ô/ô !Õ ûð	!ú÷ )×(úsK   ÁA&K/Ã"K/Ã2AK/Å/K/Ç'L È#BL?Ë/L 	ÌL<Ì#L7Ì1L<Ì7L<Ì?M	c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r^   r   rb   r_   r   r   r|   r   )r   s   "r   r    r    ˜  s.   € ÷ bñ b cð b°#ð bÀð bÈdñ br!   c                ó  € \        V4      '       g   \        R4      hV P                  ;_uu_ 4        V P                  P	                  V. 4      P                  \        W4      4       RRR4       R#   + '       g   i     R# ; i)z=Add an owner-tagged event subscription in registration order.z*Event subscriber callback must be callableN)Úcallabler­   Ú_event_lockÚ_subscriptionsrÉ   rÍ   r]   )rÒ   r^   rb   r_   s   &&&&r   Ú_subscribe_eventÚ$PluginDispatchMixin._subscribe_event˜  s\   € ä˜×!Ò!ÜÐHÓIÐIØ××ÓØ×Ñ×*Ñ*¨5°"Ó5×<Ñ<Ô=OÐPUÓ=`Ôa÷ ××Òús   ±5A0Á0B	c               ó    € V ^8„  d   QhRRRR/# )r   r^   r   r   rP   r   )r   s   "r   r    r    Ÿ  s   € ÷ ñ °#ð ¸#ñ r!   c                ó¨  € ^ pV P                   ;_uu_ 4        \        V P                  4       F€  pV P                  V,          pV Uu. uF  qUP                  V8w  g   K  VNK  	  ppV\	        V4      \	        V4      ,
          ,          pV'       d   W`P                  V&   Ks  V P                  V K‚  	  RRR4       V# u upi   + '       g   i     T# ; i)aµ  Remove every subscription owned by *owner*; return the count. Queued envelopes re-check
membership per callback, so this also cancels already-snapshotted deliveries.

TODO(#64229): when the central plugin ownership ledger / registration handles land, route this
owner-tagged bookkeeping through that ledger so per-plugin unload cancels event subscriptions
alongside every other registration surface. This method is the integration seam.
N)r  r@   r  r^   r<   )rÒ   r^   Úremovedrb   ÚentriesÚentryÚretaineds   &&     r   Ú_remove_plugin_subscriptionsÚ0PluginDispatchMixin._remove_plugin_subscriptionsŸ  s±   € ð ˆØ××ÓÜ˜d×1Ñ1Ö2�Ø×-Ñ-¨eÕ4�Ù/6ÓO©w e¿+¹+ÈÑ:NŸE˜E©w�ÐOØœ3˜w›<¬#¨h«-Õ7Õ7�ßØ19×'Ñ'¨Ó.à×+Ñ+¨EÒ2ñ 3÷ ð ˆùò P÷ Öð ˆús$   —0C ÁB;
ÁB;
Á$AC Â;C Ã C	c               ó   € V ^8„  d   QhRR/# r{   r   )r   s   "r   r    r    ³  s   € ÷ 	ñ 	¨Tñ 	r!   c                	óà   € V P                   pVe   VP                  4       '       d   R # \        P                  ! V P                  V P
                  3RRR7      pWn         VP                  4        R # )Nzhermes-plugin-eventsTrˆ   )Ú_event_workerÚis_aliver“   r•   Ú_event_worker_loopÚ_event_queuer˜   )rÒ   Úworkers   & r   Ú_ensure_event_worker_lockedÚ/PluginDispatchMixin._ensure_event_worker_locked³  s]   € Ø×#Ñ#ˆØÒ &§/¡/×"3Ò"3ÙÜ×!Ò!Ø×*Ñ*°$×2CÑ2CÐ1EÐLbØô
ˆð $ÔØ�‰Žr!   c               ó    € V ^8„  d   QhRRRR/# )r   Údispatch_queuezqueue.Queue[Any]r   r|   r   )r   s   "r   r    r    ¾  s   € ÷ 
+ñ 
+Ð1Að 
+Àdñ 
+r!   c                	ó®  €  VP                  4       p V\        J d9    V\        Jd   V P                  VP                  4       VP	                  4        R# V P                  V4       V\        Jd   V P                  VP                  4       VP	                  4        Kœ    T\        Jd   T P                  TP                  4       TP	                  4        i ; i)TN)ro   Ú_EVENT_WORKER_STOPÚ_mark_event_donerg   Ú	task_doneÚ_deliver_event)rÒ   r  rH   s   && r   r  Ú&PluginDispatchMixin._event_worker_loop¾  s¯   € ØØ!×%Ñ%Ó'ˆDð+ØÔ-Ó-Øð Ô1Ó1Ø×)Ñ)¨$¯/©/Ô:Ø×(Ñ(Ö*ð	 ×#Ñ# DÔ)àÔ1Ó1Ø×)Ñ)¨$¯/©/Ô:Ø×(Ñ(Ö*øð Ô1Ó1Ø×)Ñ)¨$¯/©/Ô:Ø×(Ñ(Õ*ús   “
B ÁB Â7Cc               ó    € V ^8„  d   QhRRRR/# )r   rg   rP   r   r|   r   )r   s   "r   r    r    Ê  s   € ÷ *ñ *¨3ð *°4ñ *r!   c                	ó  € V P                   ;_uu_ 4        V P                  P                  V^ 4      pV^ 8”  d   V^,
          V P                  V&   V P                   P                  4        RRR4       R#   + '       g   i     R# ; i)é    N)Ú_event_idleÚ_event_pending_by_generationro   Ú
notify_all)rÒ   rg   Úpendings   && r   r  Ú$PluginDispatchMixin._mark_event_doneÊ  sb   € Ø××ÓØ×7Ñ7×;Ñ;¸JÈÓJˆGØ˜Œ{Ø@GÈ!Å�×1Ñ1°*Ñ=Ø×Ñ×'Ñ'Ô)÷	 ××Òús   •AA3Á3B	c               ó    € V ^8„  d   QhRRRR/# )r   rH   ra   r   r|   r   )r   s   "r   r    r    Ñ  s   € ÷ 4ñ 4Ð#5ð 4¸$ñ 4r!   c           
     ó¸  a€ V P                   ;_uu_ 4        VP                  V P                  8w  d    RRR4       R#  RRR4       \        V P                  R^ 4      pVP
                  V P                  n         VP                   EF;  oV P                   ;_uu_ 4        VP                  V P                  8w  d    RRR4        EM \        ;QJ dC    V3R lV P                  P                  VP                  . 4       4       F  '       g   K   RM8	  RM4! V3R lV P                  P                  VP                  . 4       4       4      '       g    RRR4       KÓ   RRR4       SP                  p \        VP                  P                  4       P                   ! V3/ \        P"                  ! VP$                  4      B 4       EK>  	  W P                  n        R#   + '       g   i     EL¢; i  + '       g   i     Lš; i  \&        \(        3 d6   pT P+                  TP                  Y1P$                  TRR7        Rp?EKº  Rp?ii ; i  Y P                  n        i ; i)z9Deliver one queued event on the host-owned worker thread.Nr0   c              3  ó*   <"  € T F  qSJ x € K
  	  R # 5ir£   r   )r§   ÚcurÚsubscriptions   & €r   r©   Ú5PluginDispatchMixin._deliver_event.<locals>.<genexpr>Þ  s   øé € ÐfÑ>e°s lÕ2Ó>eùs   ƒTFr”   ©rÙ   )r  rg   Ú_event_generationr)   Ú_emit_depthrf   r0   re   r°   r  ro   rb   r_   rœ   rh   Úcopyr�   Údeepcopyrd   rÏ   rÐ   rÑ   )rÒ   rH   Úprevious_depthr_   r   r/  s   &&   @r   r!  Ú"PluginDispatchMixin._deliver_eventÑ  sÀ  ø€ à××ÓØ�‰ $×"8Ñ"8Ô8Ø÷ ÑØ8÷ ô ! ×!1Ñ!1°7¸AÓ>ˆØ!%§¡ˆ×ÑÔð	4Ø $× 2Õ 2�Ø×%×%Ó%Ø—‘¨$×*@Ñ*@Ô@Ø÷ &Ò%÷ ›3Ôf¸d×>QÑ>Q×>UÑ>UÐVZ×V`ÑV`ÐbdÔ>eÓfŸ3Ÿ3š3Ôf¸d×>QÑ>Q×>UÑ>UÐVZ×V`ÑV`ÐbdÔ>eÓf×fÒfØ ÷ &Ñ%ð g÷	 &ð (×0Ñ0�ðhä1ØŸ™×)Ñ)Ó+×/Ò/°ÑX¼D¿MºMÈ$Ï,É,Ó<WÑX÷Zñ !3ð  &4×ÑÖ"÷- ×Ðú÷ &×%ûô "¤:Ð.ô hà×-Ñ-¨d¯j©j¸(ÇLÁLÐRUÐ_fÐ-×gÓgûðhûð &4×ÑÕ"ús   –GÁ9$I ÂG+Â:I Ã
G+Ã8G+ÄAG+ÅG+Å
I ÅI Å.AG>Ç I ÇG(	Ç+G;Ç6I Ç>IÈ)H?È8I È?IÉI ÉIc               ó    € V ^8„  d   QhRRRR/# )r   rs   rt   r   r1   r   )r   s   "r   r    r    ë  s   € ÷ dñ d°ð dÀñ dr!   c                óÈ   a a€ S P                   ;_uu_ 4        S P                  oS P                   P                  VV 3R lVR7      uuRRR4       #   + '       g   i     R# ; i)zCWait for the current event generation to become idle (test helper).c                 óB   <€ SP                   P                  S ^ 4      ^ 8H  # )r%  )r'  ro   )rg   rÒ   s   €€r   Ú<lambda>Ú>PluginDispatchMixin._wait_for_event_dispatch.<locals>.<lambda>ð  s   ø€ ˜×9Ñ9×=Ñ=¸jÈ!ÓLÐPQÒQr!   r�   N)r&  r2  Úwait_for)rÒ   rs   rg   s   f&@r   Ú_wait_for_event_dispatchÚ,PluginDispatchMixin._wait_for_event_dispatchë  sI   ù€ à××ÓØ×/Ñ/ˆJØ×#Ñ#×,Ñ,ÝQÐ[bð -ó d÷ ××Óús   —.AÁA!	c               ó$   € V ^8„  d   QhRRRRRR/# )r   rb   r   rd   rc   r   rP   r   )r   s   "r   r    r    ò  s!   € ÷ &ñ & Sð &°>ð &Àcñ &r!   c                óŠ  € \        V P                  R^ 4      pV\        8¼  d   \        P	                  R\        V4       ^ # RpV P
                  ;_uu_ 4        \        V P                  P                  V. 4      4      pV'       g    RRR4       ^ # V P                  pV P                  P                  V^ 4      pV\        8¼  d'   \        P	                  V\        V4        RRR4       ^ # \        V\        V4      WS^,           V\        P                  ! 4       R7      p V P                   P#                  V4       T^,           T P                  T&   T P)                  4        \+        T4      uuRRR4       #   \$        P&                   d(    \        P	                  T\        T4        RRR4       ^ # i ; i  + '       g   i     R# ; i)z­Queue *event* without blocking; return the subscriber count scheduled. Pending work is
bounded per generation so a blocking subscriber costs one worker and later emits drop.r0   uo   Event bus recursion cap (%d) exceeded while dispatching '%s' â€” dropping this emit to prevent an infinite loopuU   Event bus pending budget (%d) exhausted while dispatching '%s' â€” dropping this emitN)rb   rd   re   rf   rg   rh   )r)   r3  Ú_EVENT_EMIT_DEPTH_CAPrÞ   rá   r  Útupler  ro   r2  r'  Ú_EVENT_PENDING_CAPra   r¯   r–   r—   r  Ú
put_nowaitÚqueueÚFullr  r<   )	rÒ   rb   rd   rf   Ú
budget_msgre   rg   r)  rH   s	   &&&      r   Ú_dispatch_eventÚ#PluginDispatchMixin._dispatch_eventò  sz  € ô ˜×(Ñ(¨'°1Ó5ˆØÔ)Ô)Ü�N‰NðEÜF[Ð]bôdñ Ølˆ
Ø××ÓÜ! $×"5Ñ"5×"9Ñ"9¸%ÀÓ"DÓEˆMß Ø÷ Ñð ×/Ñ/ˆJØ×7Ñ7×;Ñ;¸JÈÓJˆGØÔ,Ô,Ü—‘˜zÔ+=¸uÔEØ÷ Ñô &Ø¤T¨'£]À-Ð_`ÕW`Ø%¬{×/GÒ/GÓ/IôKˆDðØ×!Ñ!×,Ñ,¨TÔ2ð =DÀa½KˆD×-Ñ-¨jÑ9Ø×,Ñ,Ô.Ü�}Ó%÷' Òøô —:‘:ô Ü—‘˜zÔ+=¸uÔEØ÷! Ñðú÷ ×Ðús=   Á/F1ÂAF1Ã(3F1ÄE2Ä70F1Å20F.Æ"F1Æ-F.Æ.F1Æ1G	c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r1   r   )r   s   "r   r    r      s   € ÷ 0ñ 0 #ð 0¨$ñ 0r!   c                ót   € ^ RI Hp V! 4       '       d   R# \        V P                  P	                  V4      4      # )z@Return True when at least one callback is registered for a hook.rÁ   F)rÇ   rÂ   r1   rÊ   ro   ©rÒ   r   rÂ   s   && r   Úhas_hookÚPluginDispatchMixin.has_hook  s)   € å@á× Ò ÙÜ�D—K‘K—O‘O IÓ.Ó/Ð/r!   c               ó$   € V ^8„  d   QhRRRRRR/# r¾   r   )r   s   "r   r    r      s!   € ÷ $ñ $¨Cð $¸3ð $À9ñ $r!   c           	   ‹  ó2  "  € ^ RI Hp VR8w  d   VP                  R\        4       . pV! 4       p\	        W4      pV\
        9   pV P                  P                  V. 4       FŒ  p\        VR\        V4      4      p	 V! R
/ V P                  W‚4      B p
\        P                  ! V
4      '       d)   V'       d   \        P                  ! W¥4      MT
G Rj  x€L
 p
V
e   VP                  V
4       KŒ  KŽ  	  V#  L!  \          d@    \"        P%                  RYT4       T'       d   TP                  RRR	\&        /4        KÚ   KÝ  \(        \*        3 dI   pT P-                  YY+4       T'       d#   TP                  \/        YT4      4        Rp?EK)   Rp?EK0  Rp?ii ; i5i)u©  :meth:`invoke_hook` for callers that are already on an event loop.

Same payload narrowing, per-callback isolation and result contract. The difference is
where an ``async def`` callback runs: here it is awaited on the caller's own loop, so a
callback that awaits anything scheduled on that loop can make progress. Through the
sync path it runs on a helper thread while the caller blocks in ``done.wait()`` â€” on the
gateway that stalls the whole event loop for the callback's duration. Sync callbacks
run inline. Bounded hooks keep ``plugins.hook_callback_timeout`` via ``asyncio.wait_for``
(the coroutine is cancelled, not abandoned); a timed-out ``pre_tool_call`` fails closed.
rÃ   rÅ   rÆ   r#   Nz+Hook '%s' callback %s timed out after %.0fsr$   r%   r&   r   )rÈ   rÄ   rÉ   r   rv   r   rÊ   ro   r)   r*   r¶   r�   r�   r€   r=  rÍ   r›   rÞ   rá   rÎ   rÏ   rÐ   rÑ   r-   )rÒ   r   rj   rÄ   rÓ   rs   rÔ   rÕ   r   r,   rÖ   r   s   &&,         r   Úainvoke_hookÚ PluginDispatchMixin.ainvoke_hook  s`  é € õ 	FØÐ0Ô0Ø×ÑÐ8Ô:QÔRØˆÙ0Ó2ˆÜ1°)ÓEˆØÔ#BÑBˆØ—+‘+—/‘/ )¨RÖ0ˆBÜ# B¨
´D¸³HÓ=ˆMðVÙÑB˜4×5Ñ5°bÓAÑB�Ü×&Ò& s×+Ò+ßCN¤×!1Ò!1°#Ô!?ÐTW×X�CØ’?Ø—N‘N 3Ö'ñ #ñ 1ð$ ˆñ Yøô  ô iÜ—‘ÐLÈiÐhoÔpßØ—N‘N H¨g°yÔBfÐ#g×hò äœzÐ*ô Vð ×)Ñ)¨)¸ÔEßØ—N‘NÔ#@ÀÐPSÓ#T×UÓUö ûð	Vüs[   ‚A6FÁ9:C3Â4C3ÃC1ÃC3Ã)FÃ1C3Ã3AFÄ6FÄ<FÅFÅ5FÆFÆFÆFc               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   ztuple[Callable, ...]r   )r   s   "r   r    r    ?  s   € ÷ 5ñ 5¨Sð 5Ð5Iñ 5r!   c                óv   € ^ RI Hp V! 4       '       d   R# \        V P                  P	                  VR4      4      # )z<Return a stable snapshot of callbacks registered for a hook.rÁ   r   )rÇ   rÂ   rC  rÊ   ro   rM  s   && r   Úiter_hook_callbacksÚ'PluginDispatchMixin.iter_hook_callbacks?  s-   € å@á× Ò ØˆIÜ�T—[‘[—_‘_ Y°Ó3Ó4Ð4r!   c               ó    € V ^8„  d   QhRRRR/# )r   Úsession_infoúMapping[str, Any]r   z'list[RenderedPluginSystemPromptSection]r   )r   s   "r   r    r    G  s   € ÷ $ñ $Ø-ð$à	0ñ$r!   c           
     ó²  € ^ RI Hp V! 4       '       d   . # \        P                  ! \	        V4      4      p. p\        \        4      \        \        4      ,           ^,           p\        V P                  P                  4       4       EFN  w  rg\        V4      \        8¼  d(   \        P                  RVP                  \        4       KA  V P                  Ws4      pVf   KX  \        \!        VP                  V4      4      p	V'       d
   V	^,          p	WY,           \"        8”  d3   \        P                  RVP                  VP$                  \"        4       KË  VP'                  \)        VP                  W‡P*                  VP$                  R7      4       WY,          p\        P-                  RVP                  VP$                  VP*                  \        V4      4       EKQ  	  V# )z?Render all registered sections deterministically and fail open.rÁ   zVPlugin system prompt section %s exceeded the section-count budget (%d) and was skippedzePlugin system prompt section %s (%s) exceeded the aggregate session budget (%d chars) and was skipped)rD   r9   rO   rR   zCSession plugin prompt section: id=%s plugin=%s position=%s chars=%d)rÇ   rÂ   ÚtypesÚMappingProxyTyper¯   r<   rE   rG   rã   Ú_system_prompt_sectionsr´   ÚMAX_SYSTEM_PROMPT_SECTIONSrÞ   rá   rD   Ú_render_prompt_section_textr=   Ú&MAX_SYSTEM_PROMPT_SECTIONS_TOTAL_CHARSrR   rÍ   r[   rO   Úinfo)
rÒ   rY  rÂ   Úfrozen_infoÚrenderedÚtotal_charsÚ_section_idÚsectionÚtextÚrendered_charss
   &&        r   Úrender_system_prompt_sectionsÚ1PluginDispatchMixin.render_system_prompt_sectionsG  su  € õ 	Aá× Ò ØˆIÜ×,Ò,¬T°,Ó-?Ó@ˆØ<>ˆÜÔ/Ó0´3Ô7JÓ3KÕKÈaÕOˆÜ$*¨4×+GÑ+G×+MÑ+MÓ+O×$PÑ ˆKÜ�8‹}Ô :Ô:Ü—‘ð2Ø3:·:±:Ô?Yô[ñ Ø×3Ñ3°GÓIˆDØŠ|ÙÜ Ô!=¸g¿j¹jÈ$Ó!OÓPˆNßØ !Õ#�ØÕ+Ô.TÔTÜ—‘ð@ØAHÇÁÈWÏ^É^Ü:ô<ñ Ø�O‰OÜ1Ø—z‘z¨4×:JÑ:JÐSZ×SaÑSaôcôdð Õ)ˆKÜ�K‰KØUÐW^×WaÑWaØ—‘ × 0Ñ 0´#°d³)÷=ñ- %Qð2 ˆr!   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rg  rN   rc  rZ  r   rk   r   )r   s   "r   r    r    n  s$   € ÷ ñ Ø*ðØ9Jðà	ñr!   c                ó*  a € R V 3R llp \        S P                  4      '       d   S P                  V4      MS P                  p\	        T\
        4      '       g   T! R\        T4      P                  4       R# TP                  4       pT'       g   R# \        T9   g   \        T9   d   T! R4       R# \        T4      S P                  8”  d    T! R\        T4      S P                  4       R# T#   \        \        3 d   pT! RT4        Rp?R# Rp?ii ; i)zUEvaluate one section; return its stripped text or None (with a warning) when skipped.c               ó$   € V ^8„  d   QhRRRRRR/# )r   Údetailr   rŠ   r   r   r|   r   )r   s   "r   r    ÚEPluginDispatchMixin._render_prompt_section_text.<locals>.__annotate__r  s&   € ÷ 	eñ 	e˜#ð 	e cð 	e¨dñ 	er!   c                ór   <€ \         P                  ! R V ,           SP                  SP                  .VO5!   R# )z%Plugin system prompt section %s (%s) N)rÞ   rá   rD   rR   )ro  rŠ   rg  s   &*€r   Ú_skipÚ>PluginDispatchMixin._render_prompt_section_text.<locals>._skipr  s-   ø€ Ü�NŠNØ7¸&Õ@À'Ç*Á*ÈgÏnÉnðeØ_cöer!   zraised and was skipped: %sNzreturned %s, not str; skippedz7contained a reserved persistence marker and was skippedz,exceeded max_chars (%d > %d) and was skipped)r  r9   rÏ   rÐ   r3   r   r+   r#   ÚstriprE   rG   r<   rQ   )rg  rc  rr  r0   r   rh  s   f&    r   r`  Ú/PluginDispatchMixin._render_prompt_section_textm  sã   ø€ ÷
	eð 	eð	Ü4<¸W¿_¹_×4MÒ4M�G—O‘O KÔ0ÐSZ×SbÑSbˆEô ˜%¤×%Ò%ÙÐ1´4¸³;×3GÑ3GÔHÙØ�{‰{‹}ˆßÙÜ  DÔ(Ô,?À4Ô,GÙÐKÔLÙÜˆt‹9�w×(Ñ(Ô(ÙÐ@Ä#ÀdÃ)ÈW×M^ÑM^Ô_ÙØˆøô œ:Ð&ô 	ÙÐ.°Ô4Ýûð	ús   ŒC- §C- Ã-DÃ>	DÄDc               ó    € V ^8„  d   QhRRRR/# )r   r¤   r   r   r1   r   )r   s   "r   r    r    ‰  s   € ÷ 0ñ 0 3ð 0¨4ñ 0r!   c                ót   € ^ RI Hp V! 4       '       d   R# \        V P                  P	                  V4      4      # )zDReturn True when at least one callback is registered for middleware.rÁ   F)rÇ   rÂ   r1   Ú_middlewarero   )rÒ   r¤   rÂ   s   && r   Úhas_middlewareÚ"PluginDispatchMixin.has_middleware‰  s-   € å@á× Ò ÙÜ�D×$Ñ$×(Ñ(¨Ó.Ó/Ð/r!   Ú_payload_keyNc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r¤   r   r{  rk   rj   r   r   r¿   r   )r   s   "r   r    r    ‘  s,   € ÷ ñ ØðØ*7ðØJMðà	ñr!   c          
     ó8  € ^ RI Hp ^ RIHp V! 4       '       d   . # . pV P                  P                  V. 4       F©  pTpV'       d*   RV,           p	/ VCW%! W2,          4      W•! W9,          4      /Cp V! R/ VB p
V
eg   VP                  V
4       V'       dL   \        V
\        4      '       d4   \        V
P                  V4      \        4      '       d   W¢,          W2&   K£  K¥  K§  K©  K«  	  V#   \        \        3 d    pT P                  YY;RR7        Rp?KÚ  Rp?ii ; i)aH  Call middleware callbacks for *kind* (each isolated); return non-``None`` results.

Request middleware passes ``_payload_key``: a dict returned under it becomes the payload the
next callback sees, so rewrites compose, and each callback gets its own copy of the payload and
of ``original_<key>`` so an in-place edit cannot leak.
rÁ   )Ú
_safe_copyÚ	original_NÚ
Middlewarer1  r   )rÇ   rÂ   Úhermes_cli.middlewarer~  rx  ro   rÍ   r3   r¯   rÏ   rÐ   rÑ   )rÒ   r¤   r{  rj   rÂ   r~  rÓ   r   Úcall_kwargsÚoriginal_keyrÖ   r   s   &&$,        r   Úinvoke_middlewareÚ%PluginDispatchMixin.invoke_middleware‘  s  € õ 	AÝ4á× Ò ØˆIØˆØ×"Ñ"×&Ñ& t¨RÖ0ˆBØ ˆKßØ*¨\Õ9�ðO ð O¨°zÀ&ÕBVÓ7WØ+¨Z¸Õ8LÓ-MñO�ðWÙÑ'˜;Ñ'�Ø’?Ø—N‘N 3Ô'ß#¬
°3¼×(=Ò(=Ä*ÈSÏWÉWÐUaÓMbÔdh×BiÒBiØ/2Õ/@˜Ó,ñ CjÑ(=‘|ñ #ñ 1ð ˆøô œzÐ*ô Wà×)Ñ)¨$°FÈÐ)×VÒVûðWús   Á1$C)ÂAC)Ã)DÃ:DÄD)r  )g       @)r#   rT   rU   rV   Ústaticmethodr¶   Úclassmethodr»   r×   rÑ   rË   r  r  r  r  r  r!  r>  rI  rN  rR  rV  rj  r`  ry  r„  rY   r   r!   r   rž   rž   å   s±   † Øô
ó ð
ð ôgó ðgõ&ðPoØjp÷oõ0V$õpbõõ(	õ
+õ*õ4÷4dõ&õ>0õ$õL5õ$ðL ôó ðõ60ðØ:>÷ó r!   rž   >   Ú
pre_verifyr   Úpre_llm_callÚpost_llm_callÚon_session_endÚpost_tool_callr   Úpre_api_requestÚon_session_startÚpost_api_requestÚapi_request_errorÚpre_auxiliary_callÚpost_auxiliary_callÚtransform_llm_outputÚtransform_tool_resultÚpost_gateway_admissionÚtransform_terminal_output)Úsession_key)Ú
session_id)rB   )EÚ__conditional_annotations__rW   Ú
__future__r   r€   r–   r4  r�   ÚloggingrF  Úrer“   rü   r\  Údataclassesr   Útypingr   r   r   r   r   r	   r
   r   r�  r   Ú	getLoggerrÞ   r   rX   r   r   r   Ú!_HOOK_TIMEOUT_SUPPRESSION_SECONDSrþ   rÎ   r-   Ú	frozensetÚSYSTEM_PROMPT_SECTION_POSITIONSÚ'DEFAULT_SYSTEM_PROMPT_SECTION_MAX_CHARSÚMAX_SYSTEM_PROMPT_SECTION_CHARSr_  ra  Úcompiler4   r;   rE   rG   r6   r=   rJ   ÚHERMES_EVENT_NAMESPACErB  rD  rú   r  rN   r[   r]   ra   Ú_HOOK_CALLBACK_TIMEOUT_SECSÚ_MAX_HOOK_CALLBACK_TIMEOUT_SECSrÌ   rq   rv   rš   rœ   rž   )r™  s   @r   Ú<module>r©     sÚ  øðôõ #ã Û Û Û Û Û Û 	Û Û Û Ý !ß K× KÓ Kå 9à	×	Ò	Ð/Ó	0€ò$
)Ð ˜Xó 
ð Ð#Ð%6¸ð:Ð Ð6ó ð
 .=Ð,=Ð  Ó =à'6Ð&7Ð ˜8Ó 7à$(Ð !àÐ Ø'dÐ $õuñ #,¨^Ð,<Ó"=Ð Ø*/Ð 'Ø"'Ð ØÐ Ø).Ð &Ø!ŸzšzÐ*IÓJÐ Ø(=Ð %Ø?Ð Ø;Ð õZõ
Mõ[ð "Ð àÐ àÐ Ù“XÐ ñ �$Ô÷ð ó ðñ �$Ô÷ð ó ðñ �$Ô÷ð ó ðñ �$Ô÷
!ð 
!ó ð
!ð #Ð Ø"'Ð Ù“€÷õ dð &*Ð "õ ÷DJó Jr!   