+
    jHàj¹!  ã                  ó`  € R t ^ RIHt ^ RIt^ RIHtHt ]! 0 R$m4      t]	! ]
! R ] 4       4      4      tRt]! RR04      t]! ]0]m4      t]! ]0]m4      t^@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 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# )&z¨Gateway response filtering helpers.

These decide whether a completed agent turn should be delivered to the chat,
not what should be persisted in conversation history.
)ÚannotationsN)ÚAnyÚOptionalc              #  óV   "  € T F  qP                  R 4      '       g   K  Vx € K!  	  R# 5i)Ú[N©Ú
startswith)Ú.0Úms   & Ú=/home/ubuntu/.hermes/hermes-agent/gateway/response_filters.pyÚ	<genexpr>r      s   é € Ð
GÑ1�·\±\À#×5F�1Š1Ó1ùs   ‚)Ÿ
)Úinternal_notificationÚprocess_completeÚasync_delegation_completec               ó    € V ^8„  d   QhRRRR/# ©é   ÚtextÚstrÚreturn© )Úformats   "r   Ú__annotate__r   /   s   € ÷ 2ñ 2 sð 2¨sñ 2ó    c                óx   € R P                  V P                  4       P                  4       P                  4       4      # )Ú )ÚjoinÚstripÚupperÚsplit©r   s   &r   Ú_canonical_silence_candidater!   /   s)   € Ø�8‰8�D—J‘J“L×&Ñ&Ó(×.Ñ.Ó0Ó1Ð1r   c               ó    € V ^8„  d   QhRRRR/# )r   Úchr   r   Úboolr   )r   s   "r   r   r   3   s   € ÷ Gñ G˜Sð G Tñ Gr   c                óf   € V R 9  ;'       d&    \         P                  ! V 4      P                  R4      # )z[]ÚP)ÚunicodedataÚcategoryr   )r#   s   &r   Ú_is_edge_punctuationr)   3   s*   € à�T‰>×FÐFœk×2Ò2°2Ó6×AÑAÀ#ÓFÐFr   c               ó    € V ^8„  d   QhRRRR/# r   r   )r   s   "r   r   r   8   s   € ÷ #ñ #¨#ð #°#ñ #r   c                óì   € ^ \        V 4      r!W8  d#   \        W,          4      '       d   V^,          pK(  W!8”  d*   \        W^,
          ,          4      '       d   V^,          pK/  WV P                  4       # )z^Strip stray edge punctuation (``.NO_REPLY``, ``*NO_REPLY*``) without erasing marker structure.)Úlenr)   r   )r   ÚstartÚends   &  r   Ú_strip_edge_silence_punctuationr/   8   sZ   € à”C˜“Iˆ3Ø
Œ+Ô.¨t­{×;Ò;Ø��
ŠØ
Œ+Ô.¨t¸!µG­}×=Ò=Øˆq�ŠØ�cˆ?× Ñ Ó"Ð"r   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   ztuple[str, ...]r   )r   s   "r   r   r   B   s   € ÷ Añ A¨ð A°ñ Ar   c                ó  € \        V \        4      '       d   V P                  4       MRp^ \        V4      u;8  d   \        8:  g    R#  R# \        V4      pW!8X  d   V3MW3p\        ;QJ d    . R V 4       F  NK  	  5# ! R V 4       4      # )zUCanonical forms of a short marker-sized response; ``()`` when not a candidate at all.Ú c              3  ó8   "  € T F  p\        V4      x € K  	  R # 5i©N)r!   )r	   Úfs   & r   r   Ú0_canonical_silence_candidates.<locals>.<genexpr>I   s   é € Ð@¹%°QÔ-¨a×0Ð0»%ùó   ‚r   )Ú
isinstancer   r   r,   Ú_MARKER_LENGTH_CAPr/   Útuple)r   ÚstrippedÚdepunctuatedÚformss   &   r   Ú_canonical_silence_candidatesr>   B   sy   € ä)¨$´×4Ò4ˆt�z‰zŒ|¸"€HØŒs�8‹}Ö2Ô 2Õ2Øˆ	ð 3Øˆ	Ü2°8Ó<€LØ'Ô3ˆX‰K¸(Ð9Q€EßŒ5Ñ@¹%Ó@�5Ð@ˆ5Ñ@¹%Ó@Ó@Ð@r   c               ó    € V ^8„  d   QhRRRR/# ©r   Úresponser   r   r$   r   )r   s   "r   r   r   L   s   € ÷ bñ b¨cð b°dñ br   c                óŽ   € \         ;QJ d%    R \        V 4       4       F  '       g   K   R# 	  R# ! R \        V 4       4       4      # )uÒ   True only when ``response`` is exactly a silence marker.

Prose that merely mentions ``NO_REPLY`` must be delivered normally. A blank
response is not silence either â€” that is the empty-response failure path.
c              3  ó2   "  € T F  q\         9   x € K  	  R # 5ir4   )ÚLIVE_GATEWAY_SILENT_MARKERS©r	   Úcs   & r   r   Ú2is_intentional_silence_response.<locals>.<genexpr>R   s   é € ÐaÑ9`°AÔ/Ö/Ó9`ùs   ‚TF©Úanyr>   )rA   s   &r   Úis_intentional_silence_responserJ   L   s;   € ÷ ‹3ÑaÔ9VÐW_Ô9`Óa�3Œ3ÐaŠ3Ðaˆ3ÑaÔ9VÐW_Ô9`ÓaÓaÐar   c               ó    € V ^8„  d   QhRRRR/# r@   r   )r   s   "r   r   r   U   s   € ÷ ñ ¨Sð °Tñ r   c                óÚ  € \        V \        4      '       d   V P                  4       MRpV'       g   R# VP                  4        Uu. uF  q"P                  4       '       g   K  VNK  	  ppVP	                  4       P                  \        4      ;'       gU    \        ;QJ d,    R W^ ,          VR,          3 4       F  '       g   K   R# 	  R# ! R W^ ,          VR,          3 4       4      # u upi )a¨  Loose silence matcher for autonomous lanes (cron, webhook).

Models reliably bracket ``[SILENT]`` with a short note, so unlike the
interactive EXACT rule this also suppresses when a marker sits on its own
first/last line or the bracketed sentinel opens the response (``[SILENT] No
changes detected``).  A token buried mid-sentence is still delivered.
Shares :data:`LIVE_GATEWAY_SILENT_MARKERS` so the two sets cannot drift.
r2   Fc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ir4   )rJ   rE   s   & r   r   Ú1is_autonomous_silence_response.<locals>.<genexpr>e   s   é € ð JÙ4S¨qÔ'¨×*Ð*Ó4Sùr7   Téÿÿÿÿ)r8   r   r   Ú
splitlinesr   r   Ú_BRACKETED_SILENCE_MARKERSrI   )rA   r;   ÚlnÚliness   &   r   Úis_autonomous_silence_responserT   U   sË   € ô $.¨h¼×#<Ò#<ˆx�~‰~ÔÀ"€HßÙØ"×-Ñ-Ô/Ó>Ñ/�B·8±8·:�RˆRÑ/€EÐ>ð �>‰>Ó×&Ñ&Ô'AÓB÷ ð ÇcÃcñ JØ5=ÀQ½xÈÈrÍÑ4SóJÇcÄcð Âcð Àcñ JØ5=ÀQ½xÈÈrÍÑ4SóJó Gð ùò	 ?s   ÁC(Á!C(c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úagent_resultzdict | NonerA   r   r   r$   r   )r   s   "r   r   r   j   s'   € ÷ {ñ {°kð {ÈSð {ÐUYñ {r   c                ó„   € \        V \        4      ;'       d*    V P                  R4      '       * ;'       d    \        V4      # )zBSilence markers suppress delivery only for successful agent turns.Úfailed)r8   ÚdictÚgetrJ   )rV   rA   s   &&r   Ú#is_intentional_silence_agent_resultr[   j   s4   € ä�l¤DÓ)×zÐz°,×2BÑ2BÀ8Ó2LÔ.L×zÐzÔQpÐqyÓQzÐzr   c               ó    € V ^8„  d   QhRRRR/# )r   Úeventr   r   z
str | Noner   )r   s   "r   r   r   o   s   € ÷ ñ  #ð ¨*ñ r   c                ó  € ^ RI Hp V! V 4      P                  R4      ;p'       d   V# \        V RR4      '       d%   \	        V 4      '       d   V P
                  R,          # \        V RR4      '       g   \        V RR4      '       d   \        # R# )aS  The persisted user-row kind for a gateway turn: only self-injected events are machinery.

A scheduled heartbeat prompt is self-injected too (``_heartbeat_session_id`` is stamped only
by the gateway poller, never inferred from inbound text), but it deliberately stays
non-internal so authorization and the emergency stop still apply to it.
©Úadmission_displayÚkindÚinternalFÚdisplay_kindÚ_heartbeat_session_idN)Úgateway.session_displayr`   rZ   ÚgetattrÚ_producer_cardÚmetadataÚ"INTERNAL_NOTIFICATION_DISPLAY_KIND)r]   r`   ra   s   &  r   Údisplay_kind_for_eventrj   o   sw   € õ :Ù  Ó'×+Ñ+¨FÓ3Ð3€tÖ3àˆÜˆu�j %×(Ò(¬^¸E×-BÒ-BØ�~‰~˜nÕ-Ð-Üˆu�j %×(Ò(¬G°EÐ;RÐTX×,YÒ,YÜ1Ð1Ùr   c               ó    € V ^8„  d   QhRRRR/# ©r   r]   r   r   rY   r   )r   s   "r   r   r   �   s   € ÷ ñ ˜#ð  $ñ r   c                ó  € \        V R R4      ;'       g    / pVP                  R4      p\        V RR4      '       dK   VP                  R4      \        9   d1   \        V\        4      '       d   VP                  4       '       d   RV/# / # )rh   NÚdisplay_textrb   Frc   )rf   rZ   ÚPRODUCER_NOTICE_DISPLAY_KINDSr8   r   r   )r]   rh   r   s   &  r   rg   rg   �   sm   € Ü�u˜j¨$Ó/×5Ð5°2€HØ�<‰<˜Ó'€DÜ��z 5×)Ò)¨h¯l©l¸>Ó.JÔNkÔ.kÜ˜4¤×%Ò%¨$¯*©*¯,ª,Ø Ð%Ð%Ø€Ir   c               ó    € V ^8„  d   QhRRRR/# rl   r   )r   s   "r   r   r   Š   s   € ÷ Xñ X cð X¨dñ Xr   c                ót   € ^ RI Hp V! V 4      P                  R4      p/ \        V 4      CV'       d   RV/C# / C# )z¹``{"display_text": ...}`` for an internal event whose producer named an async-result card, plus the
``title_preview`` (titler-only) a canonical admission committed for this exact event.r_   Útitle_preview)re   r`   rZ   rg   )r]   r`   Úpreviews   &  r   Údisplay_metadata_for_eventrt   Š   sA   € õ :Ù Ó&×*Ñ*¨?Ó;€GØWŒn˜UÓ#ÐWÇg¨¸'Ð(BÐWÐWÐSUÐWÐWr   c               ó    € V ^8„  d   QhRRRR/# )r   rc   r   r   r$   r   )r   s   "r   r   r   ’   s   € ÷ 3ñ 3¨Cð 3°Dñ 3r   c                ó   € V \         9   # )a@  Only a machinery turn may vanish on a bare silence marker; a human turn gets a visible fallback.

The caller passes the current turn's persisted display kind instead of inferring it from the
transcript: the inbound user row is not persisted yet, and a previous internal row must never
authorize silence on a human turn.
)ÚMACHINERY_DISPLAY_KINDS)rc   s   &r   Úis_machinery_display_kindrx   ’   s   € ð Ô2Ñ2Ð2r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rc   r   Úreply_expectedúOptional[bool]r   r$   r   )r   s   "r   r   r   œ   s'   € ÷ Nñ N #ð N°~ð NÐQUñ Nr   c                ó0   € \        V 4      ;'       g    VRJ # )zIWhether a successful bare silence marker may remain silent for this turn.F)rx   )rc   rz   s   &&r   Úsilence_allowedr}   œ   s   € ä$ \Ó2×MÐM°nÈÐ6MÐMr   c               ó    € V ^8„  d   QhRRRR/# )r   rz   r{   r   rY   r   )r   s   "r   r   r   ¡   s   € ÷ Pñ P¨Nð P¸tñ Pr   c                ó   € V f   / # RV /# )z™The persisted user row's ``reply_expected`` key, only when the adapter knew; crash recovery
reads it back to judge a silence marker as the live turn did.rz   r   )rz   s   &r   Úreply_expected_metadatar€   ¡   s   € ð  Ò'ˆ2ÐOÐ.>ÀÐ-OÐOr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   r$   r   )r   s   "r   r   r   §   s   € ÷ ñ  Cð ¨Dñ r   c                óŽ   € \         ;QJ d%    R \        V 4       4       F  '       g   K   R# 	  R# ! R \        V 4       4       4      # )au  True while streamed ``text`` could still resolve to a silence marker.

A buffer whose canonical form is a non-empty *prefix* of a marker (``"NO"`` on
the way to ``"NO_REPLY"``, or an exact marker not yet terminated by stream-end)
is held back so a raw marker is never shown and then retracted.  Divergence
from every marker, or exceeding the cap, resumes normal streaming.
c              3  ó¼   a"  € T FQ  oS;'       dC    \         ;QJ d#    V3R  l\         4       F  '       g   K   RM	  RM! V3R  l\         4       4      x € KS  	  R# 5i)c              3  óD   <"  € T F  qP                  S4      x € K  	  R # 5ir4   r   )r	   ÚmarkerrF   s   & €r   r   Ú6is_partial_silence_marker.<locals>.<genexpr>.<genexpr>°   s   øé € ÐQÑ5P¨6×#Ñ# A×&Ð&Ó5Pùs   ƒ TFN)rI   rD   rE   s   &@r   r   Ú,is_partial_silence_marker.<locals>.<genexpr>¯   s@   øé € ð á4ˆAð 	
×QÐQ�c‹cÔQÕ5PÓQ�c�cŠcÔQÕ5PÓQÓQÔQÛ4ùs   ƒA‘A�A¸$ATFrH   r    s   &r   Úis_partial_silence_markerrˆ   §   sI   € ÷ ‹3ñ ä.¨tÔ4ó�3Œ3ð Š3ð ˆ3ñ ä.¨tÔ4óó ð r   >   ÚSILENTÚNO_REPLYõ   æ²‰é»˜õ   é�™é»˜õ   [æ²‰é»˜]õ   [é�™é»˜]úNO REPLYú[SILENT]r4   )Ú__doc__Ú
__future__r   r'   Útypingr   r   Ú	frozensetrD   r:   ÚsortedrQ   ri   ro   rw   ÚPRODUCER_CARD_KINDSr9   r!   r)   r/   r>   rJ   rT   r[   rj   rg   rt   rx   r}   r€   rˆ   r   r   r   Ú<module>r—      sà   ðñõ #ã ß  ñ (ò )ó Ð ñ #Ù
Ñ
GÑ1Ó
GÓGóÐ ð &=Ð "ñ !*Ð+=Ð?ZÐ*[Ó \Ð Ù#Ð%GÐ$hÐJgÐ$hÓiÐ ñ  Ð!CÐ dÐFcÐ dÓeÐ ð Ð õ2õGõ
#õAõbõõ*{õ
õ$õXõ3÷Nõ
P÷r   