§
    øžyjÂy  ã                  ó  — U d Z ddlmZ ddlZddlmZ ddlmZmZ ddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZmZmZmZ 	 ddlmZ dZn# e$ r d	ZdZY nw xY wddlZdd
lm Z! ej"         #                    d e$ e!e%¦  «         &                    ¦   «         j'        d         ¦  «        ¦  «         ddl(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2  e
j3        e4¦  «        Z5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?h d£Z@ ejA        d¦  «        ZBdZCh d£ZD ejE        ¦   «         ZFdeGd<    ejH        ¦   «         ZI ejH        ¦   «         ZJ eK¦   «         ZLdeGd<    eK¦   «         ZMdeGd <    eK¦   «         ZNdeGd!<   d[d$„ZOd\d(„ZPd]d)„ZQd\d*„ZRd^d_d,„ZSd`d-„ZTdad/„ZUdbd1„ZVd2dddddd3œdcd=„ZWddd>„ZX G d?„ d@¦  «        ZYd^dedC„ZZd^d	dDœdfdF„Z[dgdH„Z\dhdJ„Z]didK„Z^didL„Z_didM„Z`didN„ZadidO„ZbdidP„ZcdidQ„Zd G dR„ dSe,¦  «        ZedjdV„ZfdkdX„ZgdldY„ZhdldZ„ZidS )ma‘  Raft channel platform adapter.

Starts a local wake endpoint, spawns ``raft agent bridge`` as a child process,
and injects content-free wake hints into Hermes' normal gateway session pipeline.
Token and port are auto-generated when not provided via env/config.
The bridge remains responsible for Raft message cursors and body materialization;
the agent uses the Raft CLI according to the Raft manual.
é    )ÚannotationsN)Údeque)ÚdatetimeÚtimezone)ÚAnyÚDequeÚDictÚListÚOptional)ÚwebTF)ÚPathé   )ÚPlatformÚPlatformConfig)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚ
SendResultÚmerge_pending_message_event)Úbuild_session_keyú	127.0.0.1z/wakeÚdefaulti @  iô  i   zraft-activity.v1zraft-activity-drain.v1zx-raft-bridge-token>   ÚbodyÚtextÚcontentÚmessageÚpreviewÚsnippetÚmessagesz^[a-zA-Z0-9._:@/ -]+$éx   >   ÚschemaÚstatusÚeventIdÚtoolNameÚ	sessionIdÚ	toolInputÚ	truncatedÚ
durationMsÚ
errorClassÚ
occurredAtÚ
toolOutputÚhookEventNameÚtoolInputTruncatedÚtoolOutputTruncatedz'weakref.WeakSet[RaftAdapter]'Ú_ACTIVE_ADAPTERSzset[str]Ú_RAFT_SESSION_IDSÚ_RAFT_TURN_IDSÚ_RAFT_PROMPT_TURN_IDSÚreturnÚboolc                 óD   — t           sdS t          j        d¦  «        sdS dS )ui  Check if Raft channel dependencies are available.

    Intentionally silent on failure â€” this is a passive probe registered as
    the platform's ``check_fn``. It is called on every
    ``load_gateway_config()`` (message handling, display lookups, agent
    turns), so logging here floods the logs for every user without the
    ``raft`` CLI installed. The caller (``gateway/platform_registry.py``
    ``create_adapter()``) emits its own warning when requirements are not met
    and an adapter is actually requested. This matches the convention used by
    other platform adapters (e.g. ``teams/adapter.py``).
    FÚraftT)ÚAIOHTTP_AVAILABLEÚshutilÚwhich© ó    úD/home/ragecks/.hermes/hermes-agent/plugins/platforms/raft/adapter.pyÚcheck_raft_requirementsr=   d   s-   € õ ð ØˆuÝŒ<˜ÑÔð ØˆuØˆ4r;   Úvaluer   Ústrc                ó˜   — t          | pt          ¦  «                             ¦   «         pt          }|                     d¦  «        sd|› �}|S )Nú/)r?   ÚDEFAULT_PATHÚstripÚ
startswith)r>   Úpaths     r<   Ú_path_valuerF   w   sI   € ÝˆuÐ$�Ñ%Ô%×+Ò+Ñ-Ô-Ð=µ€DØ�?Š?˜3ÑÔð Ø�4ˆzˆzˆØ€Kr;   c                ó`  — t          | t          ¦  «        rj|                      ¦   «         D ]T\  }}t          |¦  «                             ¦   «                              ¦   «         t          v r dS t          |¦  «        r dS ŒUn.t          | t          ¦  «        rt          d„ | D ¦   «         ¦  «        S dS )NTc              3  ó4   K  — | ]}t          |¦  «        V — Œd S ©N)Ú_has_content_field)Ú.0Úitems     r<   ú	<genexpr>z%_has_content_field.<locals>.<genexpr>†   s+   è è € Ð>Ð>°Õ% dÑ+Ô+Ð>Ð>Ð>Ð>Ð>Ð>r;   F)
Ú
isinstanceÚdictÚitemsr?   rC   ÚlowerÚ_CONTENT_FIELD_NAMESrJ   ÚlistÚany)r>   ÚkeyÚnesteds      r<   rJ   rJ   ~   sµ   € Ý�%�ÑÔð ?Ø Ÿ;š;™=œ=ð 	ð 	‰KˆC�Ý�3‰xŒx�~Š~ÑÔ×%Ò%Ñ'Ô'Õ+?Ð?Ð?Ø�t�tÝ! &Ñ)Ô)ð Ø�t�tðð	õ
 
�E�4Ñ	 Ô	 ð ?ÝÐ>Ð>¸Ð>Ñ>Ô>Ñ>Ô>Ð>Øˆ5r;   c                óB   — t          t          | d| ¦  «        pd¦  «        S )Nr>   Ú )r?   Úgetattr)r>   s    r<   Ú_platform_valuerZ   Š   s!   € Ý�w�u˜g uÑ-Ô-Ð3°Ñ4Ô4Ð4r;   úOptional[str]c                ó¤   — t          | t          ¦  «        s|S | rt          | ¦  «        t          k    r|S t                               | ¦  «        s|S | S rI   )rN   r?   ÚlenÚ_MAX_SCALAR_LENGTHÚ_SAFE_SCALAR_REÚmatch)r>   r   s     r<   Ú_safe_scalarra   Ž   sW   € Ý�e�SÑ!Ô!ð ØˆØð •C˜‘J”JÕ!3Ò3Ð3ØˆÝ× Ò  Ñ'Ô'ð ØˆØ€Lr;   c                 óŠ   — t          j        t          j        ¦  «                             ¦   «                              dd¦  «        S )Nz+00:00ÚZ)r   Únowr   ÚutcÚ	isoformatÚreplacer:   r;   r<   Ú_now_isorh   ˜   s0   € ÝŒ<�œÑ%Ô%×/Ò/Ñ1Ô1×9Ò9¸(ÀCÑHÔHÐHr;   úOptional[tuple[str, bool]]c                óð   — | €d S t          | t          ¦  «        r| }n*	 t          j        | dd¬¦  «        }n# t          $ r Y d S w xY w|sd S t          |¦  «        t          k    r|d t          …         dfS |dfS )NFT)Úensure_asciiÚ	sort_keys)rN   r?   ÚjsonÚdumpsÚ	Exceptionr]   ÚACTIVITY_CONTENT_CAP)r>   r   s     r<   Ú_content_stringrq   œ   s¤   € Ø€}ØˆtÝ�%�ÑÔð Øˆˆð	Ý”:˜e°%À4ÐHÑHÔHˆDˆDøÝð 	ð 	ð 	Ø�4�4ð	øøøàð ØˆtÝ
ˆ4�y„yÕ'Ò'Ð'ØÐ)Õ)Ð)Ô*¨DÐ0Ð0Ø�ˆ;Ðs   ž6 ¶
AÁAúOptional[int]c                óš   — t          | t          t          f¦  «        rt          | t          ¦  «        rd S t          | ¦  «        }|dk     rd S |S )Nr   )rN   ÚintÚfloatr4   )r>   Údurations     r<   Ú_duration_msrw   ­   sL   € Ý�e�c¥5˜\Ñ*Ô*ð ­j¸ÅÑ.EÔ.Eð ØˆtÝ�5‰zŒz€HØ�!‚|€|ØˆtØ€Or;   Úok)r"   Ú	tool_nameÚ
tool_inputÚtool_outputÚerror_classÚduration_msÚhook_event_nameÚ
session_idr"   ry   rz   r{   r|   r}   úDict[str, Any]c                ó°  — t           dt          j        ¦   «         › �t          |d¦  «        pd| |dk    rdndt	          ¦   «         dœ}t          |¦  «        }	|	r|	|d<   t          |¦  «        }
|
r|
|d<   t          |¦  «        }|�||d<   d	}t          |¦  «        }|r|\  |d
<   }|rd|d<   d}t          |¦  «        }|r|\  |d<   }|rd|d<   d}|rd|d<   |S )Nzhermes-ÚunknownÚerrorrx   )r!   r#   r%   r,   r"   r*   r$   r)   r(   Fr&   Tr-   r+   r.   r'   )ÚACTIVITY_EVENT_SCHEMAÚuuidÚuuid4ra   rh   rw   rq   )r~   r   r"   ry   rz   r{   r|   r}   ÚeventÚsafe_tool_nameÚsafe_error_classÚsafe_duration_msr'   Úinput_valueÚinput_truncatedÚoutput_valueÚoutput_truncateds                    r<   Ú_make_activity_eventr�   ¶   sE  € õ (Ø+�TœZ™\œ\Ð+Ð+Ý! *¨iÑ8Ô8ÐE¸IØ(Ø# wÒ.Ð.�'�'°DÝ‘j”jðð €Eõ " )Ñ,Ô,€NØð +Ø*ˆˆjÑÝ# KÑ0Ô0ÐØð /Ø.ˆˆlÑÝ# KÑ0Ô0ÐØÐ#Ø.ˆˆlÑà€IÝ! *Ñ-Ô-€KØð Ø.9Ñ+ˆˆkÑ˜OØð 	Ø*.ˆEÐ&Ñ'ØˆIÝ" ;Ñ/Ô/€LØð Ø0<Ñ-ˆˆlÑÐ-Øð 	Ø+/ˆEÐ'Ñ(ØˆIØð "Ø!ˆˆkÑØ€Lr;   c                ó¤  — t          | t          ¦  «        st          d¦  «        ‚|                      d¦  «        t          k    rt          d¦  «        ‚t          | ¦  «        t          z
  }|r&t          dt          |¦  «        d         › d�¦  «        ‚dD ]7}t          |                      |¦  «        ¦  «        st          d|› d	�¦  «        ‚Œ8|                      d
¦  «        dvrt          d¦  «        ‚|                      d¦  «        �1t          |                      d¦  «        ¦  «        st          d¦  «        ‚|                      d¦  «        �1t          |                      d¦  «        ¦  «        st          d¦  «        ‚|                      d¦  «        �1t          |                      d¦  «        ¦  «        €t          d¦  «        ‚dD ]R}|                      |¦  «        �;t          |                      |¦  «        t          ¦  «        st          d|› d�¦  «        ‚ŒSt          | ¦  «        }|                     d¦  «        �t          |d         ¦  «        |d<   dD ]y}|                     |¦  «        }|€Œt          |t          ¦  «        st          d|› d�¦  «        ‚t          |¦  «        t          k    r|d t          …         ||<   d|d<   d||› d�<   Œz|S )Nz activity event must be an objectr!   z!unsupported activity event schemazactivity event field r   z is not allowed)r#   r%   r,   r*   zactivity event z  must be a safe non-empty stringr"   >   rx   rƒ   z&activity event status must be ok|errorr$   z-activity event toolName must be a safe stringr)   z/activity event errorClass must be a safe stringr(   z7activity event durationMs must be a non-negative number)r'   r-   r.   z must be a boolean)r&   r+   z must be a stringTr'   Ú	Truncated)rN   rO   Ú
ValueErrorÚgetr„   ÚsetÚ_ACTIVITY_ALLOWED_FIELDSÚsortedra   rw   r4   r?   r]   rp   )r>   r‚   rU   r‡   r   s        r<   Ú_validate_activity_eventr—   å   sÏ  € Ý�e�TÑ"Ô"ð =ÝÐ;Ñ<Ô<Ð<Ø‡y‚y�ÑÔÕ3Ò3Ð3ÝÐ<Ñ=Ô=Ð=Ý�%‰jŒjÕ3Ñ3€GØð VÝÐTµ¸±´ÀÔ1CÐTÐTÐTÑUÔUÐUØFð Vð VˆÝ˜EŸIšI c™NœNÑ+Ô+ð 	VÝÐT¨sÐTÐTÐTÑUÔUÐUð	Và‡y‚y�ÑÔ /Ð1Ð1ÝÐAÑBÔBÐBØ‡y‚y�ÑÔÐ(µ¸e¿iºiÈ
Ñ>SÔ>SÑ1TÔ1TÐ(ÝÐHÑIÔIÐIØ‡y‚y�ÑÔÐ*µ<ÀÇ	Â	È,Ñ@WÔ@WÑ3XÔ3XÐ*ÝÐJÑKÔKÐKØ‡y‚y�ÑÔÐ*­|¸E¿IºIÀlÑ<SÔ<SÑ/TÔ/TÐ/\ÝÐRÑSÔSÐSØIð Hð HˆØ�9Š9�S‰>Œ>Ð%­j¸¿ºÀ3¹¼ÍÑ.NÔ.NÐ%ÝÐF¨sÐFÐFÐFÑGÔGÐGøå�‰KŒK€EØ‡y‚y�ÑÔÐ*Ý*¨5°Ô+>Ñ?Ô?ˆˆlÑØ*ð 	,ð 	,ˆØ—)’)˜C‘.”.ˆØˆ?ØÝ˜'¥3Ñ'Ô'ð 	GÝÐE¨sÐEÐEÐEÑFÔFÐFÝˆw‰<Œ<Õ.Ò.Ð.Ø Ð!6Õ"6Ð!6Ô7ˆE�#‰JØ!%ˆE�+ÑØ'+ˆE�SÐ#Ð#Ð#Ñ$øØ€Lr;   c                  óH   — e Zd ZdZefdd„Zdd	„Zddd„Zedd„¦   «         Z	dS )ÚActivityQueuez@Bounded at-most-once queue for Raft external activity telemetry.Úcaprt   c                ó¼   — t          dt          |pt          ¦  «        ¦  «        | _        t	          ¦   «         | _        d| _        t          j        ¦   «         | _	        d S )Né   r   )
Úmaxrt   ÚDEFAULT_ACTIVITY_QUEUE_CAPÚ_capr   Ú_eventsÚ_dropped_since_drainÚ	threadingÚLockÚ_lock)Úselfrš   s     r<   Ú__init__zActivityQueue.__init__  sG   € Ý˜�3˜sÐ@Õ&@ÑAÔAÑBÔBˆŒ	Ý.3©g¬gˆŒØ$%ˆÔ!Ý”^Ñ%Ô%ˆŒ
ˆ
ˆ
r;   r‡   r€   r3   ÚNonec                ó^  — t          |¦  «        }| j        5  | j                             |¦  «         t	          | j        ¦  «        | j        k    rF| j                             ¦   «          | xj        dz  c_        t	          | j        ¦  «        | j        k    °Fd d d ¦  «         d S # 1 swxY w Y   d S )Nrœ   )r—   r¤   r    Úappendr]   rŸ   Úpopleftr¡   )r¥   r‡   Ú	validateds      r<   ÚpushzActivityQueue.push  sé   € Ý,¨UÑ3Ô3ˆ	ØŒZð 	/ð 	/ØŒL×Ò 	Ñ*Ô*Ð*Ý�d”lÑ#Ô# d¤iÒ/Ð/Ø”×$Ò$Ñ&Ô&Ð&ØÐ)Ô)¨QÑ.Ð)Ô)õ �d”lÑ#Ô# d¤iÒ/Ð/ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/ð 	/ð 	/s   —A>B"Â"B&Â)B&éÈ   Ú
max_eventsc                ót  — t          dt          |pd¦  «        ¦  «        }| j        5  g }| j        rYt	          |¦  «        |k     rF|                     | j                             ¦   «         ¦  «         | j        rt	          |¦  «        |k     °F| j        }d| _        d d d ¦  «         n# 1 swxY w Y   t          ||dœS )Nrœ   r­   r   )r!   ÚeventsÚdropped)	r�   rt   r¤   r    r]   r©   rª   r¡   ÚACTIVITY_DRAIN_SCHEMA)r¥   r®   Úlimitr°   r±   s        r<   ÚdrainzActivityQueue.drain  sø   € Ý�A•s˜:Ð,¨Ñ-Ô-Ñ.Ô.ˆØŒZð 	*ð 	*Ø+-ˆFØ”,ð 6¥3 v¡;¤;°Ò#6Ð#6Ø—’˜dœl×2Ò2Ñ4Ô4Ñ5Ô5Ð5ð ”,ð 6¥3 v¡;¤;°Ò#6Ð#6àÔ/ˆGØ()ˆDÔ%ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*õ 0¸6ÈgÐVÐVÐVs   §A1B$Â$B(Â+B(c                ól   — | j         5  t          | j        ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S rI   )r¤   r]   r    ©r¥   s    r<   ÚsizezActivityQueue.size'  s{   € àŒZð 	%ð 	%Ý�t”|Ñ$Ô$ð	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%s   ˆ)©-°-N)rš   rt   ©r‡   r€   r3   r§   )r­   )r®   rt   r3   r€   )r3   rt   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rž   r¦   r¬   r´   Úpropertyr·   r:   r;   r<   r™   r™     sˆ   € € € € € ØJÐJà"<ð &ð &ð &ð &ð &ð/ð /ð /ð /ðWð Wð Wð Wð Wð ð%ð %ð %ñ „Xð%ð %ð %r;   r™   Úturn_idr§   c                óò   — t          | ¦  «        }t          |¦  «        }t          5  |rt                               |¦  «         |rt                               |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S rI   )ra   Ú_RAFT_CONTEXT_LOCKr0   Úaddr1   )r   r¾   Úsafe_session_idÚsafe_turn_ids       r<   Ú_remember_raft_contextrÄ   -  s¾   € Ý" :Ñ.Ô.€OÝ Ñ(Ô(€LÝ	ð -ð -Øð 	3Ý×!Ò! /Ñ2Ô2Ð2Øð 	-Ý×Ò˜|Ñ,Ô,Ð,ð	-ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð -s   ¦9A,Á,A0Á3A0©Úforget_sessionrÆ   c               ó*  — t          | ¦  «        }t          |¦  «        }t          5  |r4t                               |¦  «         t                               |¦  «         |r|rt
                               |¦  «         d d d ¦  «         d S # 1 swxY w Y   d S rI   )ra   rÀ   r1   Údiscardr2   r0   )r   r¾   rÆ   rÂ   rÃ   s        r<   Ú_forget_raft_contextrÉ   7  sÙ   € Ý" :Ñ.Ô.€OÝ Ñ(Ô(€LÝ	ð 7ð 7Øð 	8Ý×"Ò" <Ñ0Ô0Ð0Ý!×)Ò)¨,Ñ7Ô7Ð7Øð 	7˜oð 	7Ý×%Ò% oÑ6Ô6Ð6ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð 7ð 7s   ¦ABÂBÂBÚkwargsc                 óÎ  — t          |                      d¦  «        ¦  «        dk    r8t          |                      d¦  «        |                      d¦  «        ¦  «         dS t          |                      d¦  «        ¦  «        }t          |                      d¦  «        ¦  «        }t          5  t          |r	|t          v p
|o|t          v ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )NÚplatformr6   r   r¾   T)rZ   r“   rÄ   ra   rÀ   r4   r1   r0   )rÊ   rÂ   rÃ   s      r<   Ú_is_raft_contextrÍ   B  s  € Ý�v—z’z *Ñ-Ô-Ñ.Ô.°&Ò8Ð8Ý˜vŸzšz¨,Ñ7Ô7¸¿ºÀIÑ9NÔ9NÑOÔOÐOØˆtÝ" 6§:¢:¨lÑ#;Ô#;Ñ<Ô<€OÝ §
¢
¨9Ñ 5Ô 5Ñ6Ô6€LÝ	ð 
ð 
ÝØÐ<˜l­nÐ<ð JØÐH OÕ7HÐ$Hñ
ô 
ð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
s   Â*#CÃCÃ!Cr‡   c                ó    — t           5  t          t          ¦  «        }d d d ¦  «         n# 1 swxY w Y   |D ]}|                     | ¦  «         Œd S rI   )Ú_ACTIVE_ADAPTERS_LOCKrS   r/   Úreport_activity)r‡   ÚadaptersÚadapters      r<   Ú_report_activityrÓ   O  s›   € Ý	ð *ð *ÝÕ(Ñ)Ô)ˆð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *àð 'ð 'ˆØ×Ò Ñ&Ô&Ð&Ð&ð'ð 's   ˆ)©-°-c                 ó  — t          d
i | ¤Žsd S 	 ddlm}  |dg¦  «         n,# t          $ r t                               dd¬¦  «         Y nw xY wt          t          d|                      d¦  «        ¬	¦  «        ¦  «         d S )Nr   )Úregister_env_passthroughÚRAFT_PROFILEz6[raft] failed to register RAFT_PROFILE env passthroughT©Úexc_infoÚSessionStartr   ©r~   r   r:   )	rÍ   Útools.env_passthroughrÕ   ro   ÚloggerÚdebugrÓ   r�   r“   )rÊ   rÕ   s     r<   Ú_on_session_startrÞ   V  sÉ   € ÝÐ%Ð%˜fÐ%Ð%ð Øˆð^ØBÐBÐBÐBÐBÐBà Ð  .Ð!1Ñ2Ô2Ð2Ð2øÝð ^ð ^ð ^Ý�ŠÐMÐX\ˆÑ]Ô]Ð]Ð]Ð]ð^øøøåÝØ*Ø—z’z ,Ñ/Ô/ð	
ñ 	
ô 	
ñô ð ð ð s   �# £&AÁAc                 ól  — t          di | ¤Žsd S t          |                      d¦  «        ¦  «        }|rPt          5  |t          v r	 d d d ¦  «         d S t                               |¦  «         d d d ¦  «         n# 1 swxY w Y   t          t          d|                      d¦  «        ¬¦  «        ¦  «         d S )Nr¾   ÚUserPromptSubmitr   rÚ   r:   )rÍ   ra   r“   rÀ   r2   rÁ   rÓ   r�   )rÊ   rÃ   s     r<   Ú_on_pre_llm_callrá   g  s(  € ÝÐ%Ð%˜fÐ%Ð%ð ØˆÝ §
¢
¨9Ñ 5Ô 5Ñ6Ô6€LØð 4Ýð 	4ð 	4ØÕ4Ð4Ð4Øð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4õ "×%Ò% lÑ3Ô3Ð3ð	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4õ ÝØ.Ø—z’z ,Ñ/Ô/ð	
ñ 	
ô 	
ñô ð ð ð s   ºA8ÁA8Á8A<Á?A<c            
     óÔ   — t          di | ¤Žsd S t          t          d|                      d¦  «        |                      d¦  «        |                      d¦  «        ¬¦  «        ¦  «         d S )NÚ
PreToolUser   ry   Úargs)r~   r   ry   rz   r:   ©rÍ   rÓ   r�   r“   ©rÊ   s    r<   Ú_on_pre_tool_callrç   x  s{   € ÝÐ%Ð%˜fÐ%Ð%ð ØˆÝÝØ(Ø—z’z ,Ñ/Ô/Ø—j’j Ñ-Ô-Ø—z’z &Ñ)Ô)ð		
ñ 	
ô 	
ñô ð ð ð r;   c                 ó   — t          di | ¤Žsd S |                      d¦  «        dv s|                      d¦  «        rdnd}|dk    rdnd}t          t          ||                      d¦  «        ||                      d	¦  «        |                      d
¦  «        |                      d¦  «        p|                      d¦  «        |                      d¦  «        p	|dk    rdnd |                      d¦  «        ¬¦  «        ¦  «         d S )Nr"   >   rƒ   ÚblockedÚ
error_typerƒ   rx   ÚPostToolUseFailureÚPostToolUser   ry   rä   Úerror_messageÚresultÚtool_failurer}   )r~   r   r"   ry   rz   r{   r|   r}   r:   )rÍ   r“   rÓ   r�   )rÊ   r"   Ú	hook_names      r<   Ú_on_post_tool_callrñ   …  s  € ÝÐ%Ð%˜fÐ%Ð%ð ØˆØŸ
š
 8Ñ,Ô,Ð0DÐDÐDÈÏ
Ê
ÐS_ÑH`ÔH`ÐDˆWˆWÐfj€FØ(.°'Ò(9Ð(9Ð$Ð$¸}€IÝÝØ%Ø—z’z ,Ñ/Ô/ØØ—j’j Ñ-Ô-Ø—z’z &Ñ)Ô)ØŸ
š
 ?Ñ3Ô3ÐK°v·z²zÀ(Ñ7KÔ7KØŸ
š
 <Ñ0Ô0ÐcÀvÐQXÒGXÐGX°^°^Ð^bØŸ
š
 =Ñ1Ô1ð		
ñ 		
ô 		
ñô ð ð ð r;   c                 ó„   — t          di | ¤Žsd S t          t          d|                      d¦  «        ¬¦  «        ¦  «         d S )NÚStopr   rÚ   r:   rå   ræ   s    r<   Ú_on_post_llm_callrô   ˜  s]   € ÝÐ%Ð%˜fÐ%Ð%ð ØˆÝÝØ"Ø—z’z ,Ñ/Ô/ð	
ñ 	
ô 	
ñô ð ð ð r;   c            
     óz  — t          d
i | ¤Žsd S |                      d¦  «        s|                      d¦  «        du rJt          t          d|                      d¦  «        d|                      d¦  «        rdnd¬¦  «        ¦  «         t	          |                      d¦  «        |                      d	¦  «        ¦  «         d S )NÚinterruptedÚ	completedFró   r   rƒ   Ú
incomplete)r~   r   r"   r|   r¾   r:   )rÍ   r“   rÓ   r�   rÉ   ræ   s    r<   Ú_on_session_endrù   £  sÈ   € ÝÐ%Ð%˜fÐ%Ð%ð ØˆØ‡z‚z�-Ñ Ô ð 
 F§J¢J¨{Ñ$;Ô$;¸uÐ$DÐ$DÝÝ Ø &Ø!Ÿ:š: lÑ3Ô3ØØ-3¯ZªZ¸Ñ-FÔ-FÐX˜M˜MÈLð	ñ ô ñ	
ô 	
ð 	
õ ˜Ÿš LÑ1Ô1°6·:²:¸iÑ3HÔ3HÑIÔIÐIÐIÐIr;   c                 óô   — t          di | ¤Žsd S t          t          d|                      d¦  «        ¬¦  «        ¦  «         t	          |                      d¦  «        |                      d¦  «        d¬¦  «         d S )NÚ
SessionEndr   rÚ   r¾   TrÅ   r:   )rÍ   rÓ   r�   r“   rÉ   ræ   s    r<   Ú_on_session_finalizerü   ²  s‰   € ÝÐ%Ð%˜fÐ%Ð%ð ØˆÝÝØ(Ø—z’z ,Ñ/Ô/ð	
ñ 	
ô 	
ñô ð õ ˜Ÿš LÑ1Ô1°6·:²:¸iÑ3HÔ3HÐY]Ð^Ñ^Ô^Ð^Ð^Ð^r;   c                  óÔ   ‡ — e Zd ZdZd.ˆ fd„Zed/d„¦   «         Zdd	œd0d„Zd1d„Zd2d„Z	d1d„Z
	 	 d3d4d„Zd5d„Zd6d!„Zd6d"„Zd6d#„Zd6d$„Zd7d&„Zd8d(„Zd9ˆ fd+„Zed/d,„¦   «         Zd:d-„Zˆ xZS );ÚRaftAdapterz5Local HTTP endpoint for Raft channel bridge delivery.Úconfigr   c                óÚ  •— t          ¦   «                              |t          d¦  «        ¦  «         |j        pi }t	          |                     dt          ¦  «        ¦  «        | _        t          |                     dt          ¦  «        ¦  «        | _
        t          |                     dt          ¦  «        ¦  «        | _        t	          |                     dd¦  «        ¦  «        | _        t	          |                     dt          ¦  «        pt          ¦  «        | _        t          |                     dt"          ¦  «        ¦  «        | _        d | _        d | _        t+          ¦   «         | _        d S )	Nr6   ÚhostÚportrE   Úbridge_tokenrX   Úruntime_sessionÚmax_body_bytes)Úsuperr¦   r   Úextrar?   r“   ÚDEFAULT_HOSTÚ_hostrt   ÚDEFAULT_PORTÚ_portrF   rB   Ú_pathÚ_bridge_tokenÚDEFAULT_RUNTIME_SESSIONÚ_runtime_sessionÚDEFAULT_MAX_BODY_BYTESÚ_max_body_bytesÚ_runnerÚ_bridge_processr™   Ú_activity_queue)r¥   rÿ   r  Ú	__class__s      €r<   r¦   zRaftAdapter.__init__Á  s  ø€ Ý‰Œ×Ò˜¥¨&Ñ!1Ô!1Ñ2Ô2Ð2Ø”Ð" ˆÝ˜eŸiši¨µÑ=Ô=Ñ>Ô>ˆŒ
Ý˜eŸiši¨µÑ=Ô=Ñ>Ô>ˆŒ
Ý% e§i¢i°½Ñ&EÔ&EÑFÔFˆŒ
Ý"% e§i¢i°ÀÑ&CÔ&CÑ"DÔ"DˆÔÝ%(Ø�IŠIÐ'Õ)@ÑAÔAð 'Ý&ñ&
ô &
ˆÔõ %(Ø�IŠIÐ&Õ(>Ñ?Ô?ñ%
ô %
ˆÔð ˆŒØ;?ˆÔÝ,™œˆÔÐÐr;   r3   r?   c                ó   — | j         S rI   )r  r¶   s    r<   r  zRaftAdapter.runtime_sessionÓ  s   € àÔ$Ð$r;   F)Úis_reconnectr  r4   c             ƒ  ó´  K  — | j         s3t          j        d¦  «        | _         t                               d¦  «         t          j        | j        ¬¦  «        }|j         	                    d| j
        ¦  «         |j                             | j        | j        ¦  «         |j                             d| j        ¦  «         |j         	                    d| j        ¦  «         | j        dk    r§dd l}	 |                     |j        |j        ¦  «        5 }|                     d¦  «         |                     d	| j        f¦  «         d d d ¦  «         n# 1 swxY w Y   t                               d
| j        ¦  «         dS # t.          t0          f$ r Y nw xY wt          j        |¦  «        | _        | j                             ¦   «         ƒ d {V —† t          j        | j        | j        | j        ¦  «        }|                     ¦   «         ƒ d {V —† | j        }|dk    r=|j        r6|j        j         r*|j        j         d          !                    ¦   «         d         }|  "                    ¦   «          tF          5  tH           %                    | ¦  «         d d d ¦  «         n# 1 swxY w Y   t                               d| j        || j        ¦  «         |  &                    |¦  «         dS )Né    z"[raft] Auto-generated bridge token)Úclient_max_sizez/healthú	/activityú/activity/drainr   rœ   r   zF[raft] Port %d already in use. Set platforms.raft.extra.port in configFz([raft] Raft channel listening on %s:%d%sT)'r  ÚsecretsÚ	token_hexrÜ   Úinfor   ÚApplicationr  ÚrouterÚadd_getÚ_handle_healthÚadd_postr  Ú_handle_wakeÚ_handle_activityÚ_handle_activity_drainr  ÚsocketÚAF_INETÚSOCK_STREAMÚ
settimeoutÚconnectrƒ   ÚConnectionRefusedErrorÚOSErrorÚ	AppRunnerr  ÚsetupÚTCPSiter	  ÚstartÚ_serverÚsocketsÚgetsocknameÚ_mark_connectedrÏ   r/   rÁ   Ú_spawn_bridge)r¥   r  ÚappÚ_socketÚsockÚsiteÚ
bound_ports          r<   r,  zRaftAdapter.connect×  s%  è è € ØÔ!ð 	>Ý!(Ô!2°2Ñ!6Ô!6ˆDÔÝ�KŠKÐ<Ñ=Ô=Ð=õ Œo¨dÔ.BÐCÑCÔCˆØŒ
×Ò˜9 dÔ&9Ñ:Ô:Ð:ØŒ
×Ò˜DœJ¨Ô(9Ñ:Ô:Ð:ØŒ
×Ò˜K¨Ô)>Ñ?Ô?Ð?ØŒ
×ÒÐ,¨dÔ.IÑJÔJÐJàŒ:˜Š?ˆ?Ø$Ð$Ð$Ð$ð
Ø—^’^ G¤O°WÔ5HÑIÔIð <ÈTØ—O’O AÑ&Ô&Ð&Ø—L’L +¨t¬zÐ!:Ñ;Ô;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <õ —’Ø\Ø”Jñô ð ð �uøÝ*­GÐ4ð ð ð Ø�ðøøøõ ”} SÑ)Ô)ˆŒØŒl× Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ÝŒ{˜4œ<¨¬°T´ZÑ@Ô@ˆØ�jŠj‰lŒlÐÐÐÐÐÐÐà”Zˆ
Ø˜Š?ˆ?˜tœ|ˆ?°´Ô0Dˆ?ØœÔ-¨aÔ0×<Ò<Ñ>Ô>¸qÔAˆJà×ÒÑÔÐÝ"ð 	'ð 	'Ý× Ò  Ñ&Ô&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'å�ŠÐ>ÀÄ
ÈJÐX\ÔXbÑcÔcÐcà×Ò˜:Ñ&Ô&Ð&ØˆtsH   Ã, E7 Ä2E
Ä>E7 Å
EÅE7 ÅEÅ#E7 Å7FÆ
FÉ*JÊJÊJr§   c              ƒ  óZ  K  — |                       ¦   «          | j        r&| j                             ¦   «         ƒ d {V —† d | _        t          5  t                               | ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      ¦   «          t                               d¦  «         d S )Nz[raft] Disconnected)	Ú_stop_bridger  ÚcleanuprÏ   r/   rÈ   Ú_mark_disconnectedrÜ   r  r¶   s    r<   Ú
disconnectzRaftAdapter.disconnect  sé   è è € Ø×ÒÑÔÐØŒ<ð 	 Ø”,×&Ò&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØˆDŒLÝ"ð 	+ð 	+Ý×$Ò$ TÑ*Ô*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+à×ÒÑ!Ô!Ð!Ý�ŠÐ)Ñ*Ô*Ð*Ð*Ð*s   ÁA2Á2A6Á9A6r  rt   c           	     óD  — t          j        d¦  «        }|st                               d¦  «         d S t          j                             dd¦  «        }|st                               d¦  «         d S d| j        › d|› | j        › �}|d|d	d
ddd|g	}i t          j        ¥d| j	        i¥}	 t          j        ||t          j        ¬¦  «        | _        t                               d| j        j        ||¦  «         d S # t           $ r t                               d¦  «         Y d S w xY w)Nr6   uP   [raft] raft CLI not found in PATH; bridge not spawned â€” wake-only polling moderÖ   rX   z/[raft] RAFT_PROFILE not set; bridge not spawnedzhttp://ú:z	--profileÚagentÚbridgez--wake-adapterzwake-channelz--wake-channel-endpointÚRAFT_CHANNEL_TOKEN)ÚenvÚstdinz3[raft] Spawned bridge pid=%d profile=%s endpoint=%sz[raft] Failed to spawn bridge)r8   r9   rÜ   ÚwarningÚosÚenvironr“   r	  r  r  Ú
subprocessÚPopenÚDEVNULLr  r  Úpidro   Ú	exception)r¥   r  Úraft_binÚprofileÚendpointÚcmdrG  s          r<   r7  zRaftAdapter._spawn_bridge  sI  € Ý”< Ñ'Ô'ˆØð 	Ý�NŠNÐmÑnÔnÐnØˆFå”*—.’. °Ñ4Ô4ˆØð 	Ý�NŠNÐLÑMÔMÐMØˆFà<˜TœZÐ<Ð<¨$Ð<°´
Ð<Ð<ˆà�k 7Ø�XØ˜nØ% xð	
ˆð G•”ÐFÐ1°4Ô3EÐFÐFˆð	>Ý#-Ô#3Ø˜¥JÔ$6ð$ñ $ô $ˆDÔ õ �KŠKÐMÈtÔOcÔOgÐipÐrzÑ{Ô{Ð{Ð{Ð{øÝð 	>ð 	>ð 	>Ý×ÒÐ<Ñ=Ô=Ð=Ð=Ð=Ð=ð	>øøøs   Â(AC7 Ã7$DÄDc                ó   — | j         }|€d S d | _         	 |                     ¦   «          |                     d¬¦  «         t                               d|j        ¦  «         d S # t          j        $ r8 |                     ¦   «          t           	                    d|j        ¦  «         Y d S t          $ r t                               d¦  «         Y d S w xY w)Né   )Útimeoutz)[raft] Bridge process terminated (pid=%d)z3[raft] Bridge process killed after timeout (pid=%d)z[raft] Error stopping bridge)r  Ú	terminateÚwaitrÜ   r  rO  rL  ÚTimeoutExpiredÚkillrI  ro   rP  )r¥   Úprocs     r<   r>  zRaftAdapter._stop_bridge+  sâ   € ØÔ#ˆØˆ<ØˆFØ#ˆÔð	=Ø�NŠNÑÔÐØ�IŠI˜aˆIÑ Ô Ð Ý�KŠKÐCÀTÄXÑNÔNÐNÐNÐNøÝÔ(ð 	\ð 	\ð 	\Ø�IŠI‰KŒKˆKÝ�NŠNÐPÐRVÔRZÑ[Ô[Ð[Ð[Ð[Ð[Ýð 	=ð 	=ð 	=Ý×ÒÐ;Ñ<Ô<Ð<Ð<Ð<Ð<ð	=øøøs   ”A
A  Á ACÂ&#CÃCNÚchat_idr   Úreply_tor[   ÚmetadataúOptional[Dict[str, Any]]r   c              ƒ  óZ   K  — t                                d¦  «         t          d¬¦  «        S )Nz;[raft] adapter send is a no-op; agent delivers via raft CLIT)Úsuccess)rÜ   rÝ   r   )r¥   r]  r   r^  r_  s        r<   ÚsendzRaftAdapter.send:  s,   è è € õ 	�ŠÐRÑSÔSÐSÝ $Ð'Ñ'Ô'Ð'r;   r€   c              ƒ  ó   K  — d|› �ddœS )Nzraft/r6   )ÚnameÚtyper:   )r¥   r]  s     r<   Úget_chat_infozRaftAdapter.get_chat_infoD  s   è è € Ø) Ð)Ð)°6Ð:Ð:Ð:r;   Úrequestú'web.Request'ú'web.Response'c           	   ƒ  ó^   K  — t          j        dd| j        | j        j        dddœdœ¦  «        S )Nrx   r6   r  r  )Ú	queueSizerS  ÚdrainEndpoint)r"   rÌ   ÚruntimeSessionÚactivity)r   Újson_responser  r  r·   )r¥   rh  s     r<   r#  zRaftAdapter._handle_healthG  sJ   è è € ÝÔ àØ"Ø"&Ô"7à!%Ô!5Ô!:Ø +Ø%6ðð ð		ð 	ñ
ô 
ð 	
r;   c              ƒ  óN  K  — |                       |j                             t          d¦  «        ¦  «        st	          j        dddœd¬¦  «        S |j        pd}|| j        k    rt	          j        dddœd	¬¦  «        S 	 |                     ¦   «         ƒ d {V —†}nR# t          j	        $ r t	          j        dddœd	¬¦  «        cY S t          $ r t	          j        dd
dœd¬¦  «        cY S w xY wt          |¦  «        | j        k    rt	          j        dddœd	¬¦  «        S i }|                     ¦   «         rt	 t          j        |¦  «        }n.# t          j        $ r t	          j        dddœd¬¦  «        cY S w xY wt!          |t"          ¦  «        st	          j        dddœd¬¦  «        S |}t%          |¦  «        rt	          j        dddœd¬¦  «        S |                      |¦  «        ƒ d {V —†}|st	          j        dd| j        dœd¬¦  «        S t	          j        d| j        dœd¬¦  «        S )NrX   FÚunauthorized©rx   rƒ   é‘  ©r"   r   Úpayload_too_largeé�  Úbad_requesté�  Úinvalid_jsonÚinvalid_payloadÚcontent_not_allowedÚ	not_ready)rx   rƒ   rn  i÷  T)rx   rn  éÊ   )Ú_validate_bridge_tokenÚheadersr“   ÚBRIDGE_TOKEN_HEADERr   rp  Úcontent_lengthr  ÚreadÚHTTPRequestEntityTooLargero   r]   rC   rm   ÚloadsÚJSONDecodeErrorrN   rO   rJ   Ú_accept_waker  )r¥   rh  r‚  Úraw_bodyÚpayloadÚparsedÚaccepteds          r<   r%  zRaftAdapter._handle_wakeU  sâ  è è € Ø×*Ò*¨7¬?×+>Ò+>Õ?RÐTVÑ+WÔ+WÑXÔXð 	YÝÔ$¨E¸NÐ%KÐ%KÐTWÐXÑXÔXÐXà Ô/Ð4°1ˆØ˜DÔ0Ò0Ð0ÝÔ$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]ð	XØ$Ÿ\š\™^œ^Ð+Ð+Ð+Ð+Ð+Ð+ˆHˆHøÝÔ,ð 	^ð 	^ð 	^õ Ô$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]Ð]Ð]Ýð 	Xð 	Xð 	XÝÔ$¨E¸MÐ%JÐ%JÐSVÐWÑWÔWÐWÐWÐWð	Xøøøåˆx‰=Œ=˜4Ô/Ò/Ð/õ Ô$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]à"$ˆØ�>Š>ÑÔð 	ð]Ýœ HÑ-Ô-��øÝÔ'ð ]ð ]ð ]ÝÔ(°ÀÐ)OÐ)OÐX[Ð\Ñ\Ô\Ð\Ð\Ð\ð]øøøå˜f¥dÑ+Ô+ð `ÝÔ(°Ð@QÐ)RÐ)RÐ[^Ð_Ñ_Ô_Ð_ØˆGõ ˜gÑ&Ô&ð 	`ÝÔ$¨EÐ<QÐ%RÐ%RÐ[^Ð_Ñ_Ô_Ð_à×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆØð 	ÝÔ$àØ(Ø&*Ô&;ðð ð
 ðñ ô ð õ Ô àØ"&Ô"7ðð ð ð
ñ 
ô 
ð 	
s*   Á=B Â(C'Ã"C'Ã&C'Ä2E Å(E2Å1E2c              ƒ  óà  K  — |                       |j                             t          d¦  «        ¦  «        st	          j        dddœd¬¦  «        S |j        pd}|| j        k    rt	          j        dddœd	¬¦  «        S 	 |                     ¦   «         ƒ d {V —†}nf# t          j	        $ r t	          j        dddœd	¬¦  «        cY S t          $ r0}t	          j        dt          |¦  «        dœd
¬¦  «        cY d }~S d }~ww xY wt          |                     d¦  «        ¦  «        | j        k    rt	          j        dddœd	¬¦  «        S 	 t          j        |¦  «        }| j                             |¦  «         nf# t          j        $ r t	          j        dddœd
¬¦  «        cY S t          $ r0}t	          j        dt          |¦  «        dœd
¬¦  «        cY d }~S d }~ww xY wt	          j        ddid¬¦  «        S )NrX   Frr  rs  rt  ru  r   rv  rw  ry  zutf-8rz  rx   Tr~  )r  r€  r“   r�  r   rp  r‚  r  r   r„  ro   r?   r]   Úencoderm   r…  r  r¬   r†  )r¥   rh  r‚  Úraw_textÚexcr‰  s         r<   r&  zRaftAdapter._handle_activityŒ  sj  è è € Ø×*Ò*¨7¬?×+>Ò+>Õ?RÐTVÑ+WÔ+WÑXÔXð 	YÝÔ$¨E¸NÐ%KÐ%KÐTWÐXÑXÔXÐXà Ô/Ð4°1ˆØ˜DÔ0Ò0Ð0ÝÔ$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]ð	SØ$Ÿ\š\™^œ^Ð+Ð+Ð+Ð+Ð+Ð+ˆHˆHøÝÔ,ð 	^ð 	^ð 	^õ Ô$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]Ð]Ð]Ýð 	Sð 	Sð 	SÝÔ$¨E½CÀ¹H¼HÐ%EÐ%EÈcÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøåˆx�Š˜wÑ'Ô'Ñ(Ô(¨4Ô+?Ò?Ð?õ Ô$¨EÐ<OÐ%PÐ%PÐY\Ð]Ñ]Ô]Ð]ð	SÝ”j Ñ*Ô*ˆGØÔ ×%Ò% gÑ.Ô.Ð.Ð.øÝÔ#ð 	Yð 	Yð 	YÝÔ$¨E¸NÐ%KÐ%KÐTWÐXÑXÔXÐXÐXÐXÝð 	Sð 	Sð 	SÝÔ$¨E½CÀ¹H¼HÐ%EÐ%EÈcÐRÑRÔRÐRÐRÐRÐRÐRÐRøøøøð	Søøøõ Ô  $¨ °cÐ:Ñ:Ô:Ð:sH   Á=B Â(C;Ã	C;Ã%C6Ã0C;Ã6C;Å.E2 Å2(GÆ	GÆ%%GÇ
GÇGc              ƒ  ón  K  — |                       |j                             t          d¦  «        ¦  «        st	          j        dddœd¬¦  «        S 	 t          |j                             dd¦  «        ¦  «        }n# t          $ r d	}Y nw xY wt	          j        | j	         
                    |¦  «        ¦  «        S )
NrX   Frr  rs  rt  ru  r�   Ú200r­   )r  r€  r“   r�  r   rp  rt   Úqueryr’   r  r´   )r¥   rh  r®   s      r<   r'  z"RaftAdapter._handle_activity_drain«  s¼   è è € Ø×*Ò*¨7¬?×+>Ò+>Õ?RÐTVÑ+WÔ+WÑXÔXð 	YÝÔ$¨E¸NÐ%KÐ%KÐTWÐXÑXÔXÐXð	Ý˜Wœ]×.Ò.¨u°eÑ<Ô<Ñ=Ô=ˆJˆJøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøåÔ  Ô!5×!;Ò!;¸JÑ!GÔ!GÑHÔHÐHs   Á(A9 Á9BÂBÚtokenc                ó”   — | j         r|sdS t          j        |                     ¦   «         | j                              ¦   «         ¦  «        S )NF)r  ÚhmacÚcompare_digestr�  )r¥   r“  s     r<   r  z"RaftAdapter._validate_bridge_token´  sE   € ØÔ!ð 	¨ð 	Ø�5õ Ô" 5§<¢<¡>¤>°4Ô3E×3LÒ3LÑ3NÔ3NÑOÔOÐOr;   r‰  c              ƒ  óâ  K  — | j         st                               d¦  «         dS t          |                     d¦  «        pŽ|                     d¦  «        py|                     d¦  «        pd|                     d¦  «        pO|                     d¦  «        p:|                     d¦  «        p%d	t          t          j        ¦   «         d
z  ¦  «        › �¦  «        }|                      | j        dddd¬¦  «        }t          |  
                    ¦   «         t          j        |||d¬¦  «        }	 |                      |¦  «        ƒ d {V —† n+# t          $ r t                               d¦  «         Y dS w xY wdS )Nz@[raft] Wake received before gateway message handler was attachedFr#   Ú	attemptIdÚ	messageIdÚdelivery_idÚwake_idÚidz
raft-wake-iè  zRaft channelÚdmzraft-bridgezRaft Bridge)r]  Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_nameT)r   Úmessage_typeÚsourceÚraw_messageÚ
message_idÚinternalz"[raft] Failed to inject wake event)Ú_message_handlerrÜ   rI  r?   r“   rt   ÚtimeÚbuild_sourcer  r   Ú_wake_promptr   ÚTEXTÚhandle_messagero   rP  )r¥   r‰  rš  r£  r‡   s        r<   r‡  zRaftAdapter._accept_wake»  s§  è è € ØÔ$ð 	Ý�NŠNÐ]Ñ^Ô^Ð^Ø�5åØ�KŠK˜	Ñ"Ô"ð 6Ø�{Š{˜;Ñ'Ô'ð6à�{Š{˜;Ñ'Ô'ð6ð �{Š{˜=Ñ)Ô)ð6ð �{Š{˜9Ñ%Ô%ð	6ð
 �{Š{˜4Ñ Ô ð6ð 6�C¥¤	¡¤¨dÑ 2Ñ3Ô3Ð5Ð5ñ
ô 
ˆð ×"Ò"ØÔ)Ø$ØØ!Ø#ð #ñ 
ô 
ˆõ Ø×"Ò"Ñ$Ô$Ý$Ô)ØØØ"Øð
ñ 
ô 
ˆð	Ø×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð 	ð 	ð 	Ý×ÒÐAÑBÔBÐBØ�5�5ð	øøøð ˆts   Ä(E Å$E,Å+E,r‡   r   c              ƒ  óŠ  •K  — | j         sdS t          |j        | j        j                             dd¦  «        | j        j                             dd¦  «        ¬¦  «        }|| j        v r3t                               d|¦  «         t          | j
        ||¦  «         dS t          ¦   «                              |¦  «        ƒ d{V —† dS )zBAccept Raft wake hints without interrupting an active Hermes turn.NÚgroup_sessions_per_userTÚthread_sessions_per_userF)r®  r¯  z&[raft] Wake queued for busy session %s)r§  r   r£  rÿ   r  r“   Ú_active_sessionsrÜ   rÝ   r   Ú_pending_messagesr  r¬  )r¥   r‡   Úsession_keyr  s      €r<   r¬  zRaftAdapter.handle_messageß  sÓ   øè è € àÔ$ð 	ØˆFå'ØŒLØ$(¤KÔ$5×$9Ò$9Ð:SÐUYÑ$ZÔ$ZØ%)¤[Ô%6×%:Ò%:Ð;UÐW\Ñ%]Ô%]ð
ñ 
ô 
ˆð ˜$Ô/Ð/Ð/Ý�LŠLÐAÀ;ÑOÔOÐOÝ'¨Ô(>ÀÈUÑSÔSÐSØˆFå‰gŒg×$Ò$ UÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r;   c                 ó   — 	 dS )Nz´Raft wake hint received. New Raft messages may be pending. If you have not read the Raft manual in this session, run `raft manual get raft-cli-overview` before using Raft commands.r:   r:   r;   r<   rª  zRaftAdapter._wake_promptñ  s   € ðNð	
ð 	
r;   c                ó–   — 	 | j                              |¦  «         d S # t          $ r  t                               dd¬¦  «         Y d S w xY w)Nz/[raft] activity event dropped during validationTr×   )r  r¬   ro   rÜ   rÝ   )r¥   r‡   s     r<   rÐ   zRaftAdapter.report_activityù  se   € ð	[ØÔ ×%Ò% eÑ,Ô,Ð,Ð,Ð,øÝð 	[ð 	[ð 	[Ý�LŠLÐJÐUYˆLÑZÔZÐZÐZÐZÐZð	[øøøs   ‚ ž&AÁA)rÿ   r   ©r3   r?   )r  r4   r3   r4   ©r3   r§   )r  rt   r3   r§   )NN)
r]  r?   r   r?   r^  r[   r_  r`  r3   r   )r]  r?   r3   r€   )rh  ri  r3   rj  )r“  r?   r3   r4   )r‰  r€   r3   r4   )r‡   r   r3   r§   r¸   )r¹   rº   r»   r¼   r¦   r½   r  r,  rA  r7  r>  rc  rg  r#  r%  r&  r'  r  r‡  r¬  Ústaticmethodrª  rÐ   Ú__classcell__)r  s   @r<   rþ   rþ   ¾  sÔ  ø€ € € € € Ø?Ð?ð/ð /ð /ð /ð /ð /ð$ ð%ð %ð %ñ „Xð%ð 5:ð -ð -ð -ð -ð -ð -ð^+ð +ð +ð +ð>ð >ð >ð >ð6=ð =ð =ð =ð& #'Ø-1ð(ð (ð (ð (ð (ð;ð ;ð ;ð ;ð
ð 
ð 
ð 
ð5
ð 5
ð 5
ð 5
ðn;ð ;ð ;ð ;ð>Ið Ið Ið IðPð Pð Pð Pð"ð "ð "ð "ðH,ð ,ð ,ð ,ð ,ð ,ð$ ð
ð 
ð 
ñ „\ð
ð[ð [ð [ð [ð [ð [ð [ð [r;   rþ   rÿ   r   c                ó‚   — | j         pi }t          |                     d¦  «        p|                     d¦  «        ¦  «        S )NÚenabledr  )r  r4   r“   )rÿ   r  s     r<   Ú_is_connectedr»     s9   € ØŒLÐ˜B€EÝ�—	’	˜)Ñ$Ô$ÐA¨¯	ª	°.Ñ(AÔ(AÑBÔBÐBr;   úOptional[dict]c                 ó6   — t          j        d¦  «        sdS ddiS )z’Seed PlatformConfig.extra from env vars during gateway config load.

    Auto-enables when RAFT_PROFILE is set (the adapter needs it anyway).
    rÖ   Nrº  T)rJ  Úgetenvr:   r;   r<   Ú_env_enablementr¿    s&   € õ
 Œ9�^Ñ$Ô$ð Øˆtà�tÐÐr;   c                 óÜ  — ddl m} m}m}m}m}m} ddlm}m	}  | d¦  «          |d¦  «        }|r, |d|› d�¦  «          |dd	¦  «        s |d
|› d�¦  «         dS  |d¦  «          |d¦  «          |d¦  «         t          ¦   «           |d|pd¬¦  «        }	|	s |d¦  «         dS  |d|	                     ¦   «         ¦  «         t          ¦   «           |d¦  «          |d¦  «         dS )a$  Interactive ``hermes gateway setup`` flow for the Raft platform.

    Lazy-imports CLI helpers so the plugin stays importable in gateway runtime
    and test contexts. The flow persists ``RAFT_PROFILE`` to the Hermes env
    file so the Raft adapter auto-enables after a gateway restart.
    r   )Úprint_headerÚ
print_infoÚprint_successÚprint_warningÚpromptÚprompt_yes_no)Úget_env_valueÚsave_env_valueÚRaftrÖ   z#Raft: already configured (profile: ú)zReconfigure Raft?FzKeeping RAFT_PROFILE=ú.Nz,Connect Hermes to Raft as an external agent.z2Create the External Agent in Raft first, then run:zQ  raft agent login --server <server-url> --agent <agent-id> --profile-slug <slug>zRaft profile slugrX   )r   z2Raft profile slug is required; skipping Raft setupzRaft configuration savedzFRestart the gateway for changes to take effect: hermes gateway restart)Úhermes_cli.cli_outputrÁ  rÂ  rÃ  rÄ  rÅ  rÆ  Úhermes_cli.configrÇ  rÈ  ÚprintrC   )
rÁ  rÂ  rÃ  rÄ  rÅ  rÆ  rÇ  rÈ  Úexisting_profilerR  s
             r<   Úinteractive_setuprÐ    s©  € ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð @Ð?Ð?Ð?Ð?Ð?Ð?Ð?à€L�ÑÔÐØ$�} ^Ñ4Ô4ÐØð Øˆ
ÐLÐ9IÐLÐLÐLÑMÔMÐMØˆ}Ð0°%Ñ8Ô8ð 	ØˆJÐBÐ/?ÐBÐBÐBÑCÔCÐCØˆFà€JÐ=Ñ>Ô>Ð>Ø€JÐCÑDÔDÐDØ€JÐbÑcÔcÐcÝ	�G„G€GàˆfÐ(Ð2BÐ2HÀbÐIÑIÔI€GØð ØˆÐJÑKÔKÐKØˆà€N�> 7§=¢=¡?¤?Ñ3Ô3Ð3å	�G„G€GØ€MÐ,Ñ-Ô-Ð-Ø€JÐWÑXÔXÐXÐXÐXr;   c                óP  — |                       ddd„ t          t          dgdt          t          dd                     t          j                             dd¦  «        ¬	¦  «        ¬
¦  «         |  	                    dt          ¦  «         |  	                    dt          ¦  «         |  	                    dt          ¦  «         |  	                    dt          ¦  «         |  	                    dt          ¦  «         |  	                    dt          ¦  «         |  	                    dt           ¦  «         dS )u:   Plugin entry point â€” called by the Hermes plugin system.r6   rÉ  c                ó    — t          | ¦  «        S rI   )rþ   )Úcfgs    r<   ú<lambda>zregister.<locals>.<lambda>?  s   € ¥K°Ñ$4Ô$4€ r;   rÖ   z,Install the Raft CLI from https://raft.buildu   ðŸ””a&  You are connected to Raft via an external-agent channel. Run `raft --profile {profile} profile show` to confirm which agent profile is active. Run `raft --profile {profile} manual get raft-cli-overview` to learn available Raft commands. Always pass `--profile {profile}` to every raft CLI call.zyour-agent-profile)rR  )re  ÚlabelÚadapter_factoryÚcheck_fnÚis_connectedÚrequired_envÚinstall_hintÚsetup_fnÚenv_enablement_fnÚemojiÚplatform_hintÚon_session_startÚpre_llm_callÚpre_tool_callÚpost_tool_callÚpost_llm_callÚon_session_endÚon_session_finalizeN)Úregister_platformr=   r»  rÐ  r¿  ÚformatrJ  rK  r“   Úregister_hookrÞ   rá   rç   rñ   rô   rù   rü   )Úctxs    r<   Úregisterrê  :  s  € à×ÒØØØ4Ð4Ý(Ý"Ø$Ð%ØCÝ"Ý)ØðH÷ Š&�œŸš¨Ð8LÑMÔMˆ&Ñ
NÔ
Nð! ñ ô ð ð$ ×ÒÐ(Õ*;Ñ<Ô<Ð<Ø×Ò�nÕ&6Ñ7Ô7Ð7Ø×Ò�oÕ'8Ñ9Ô9Ð9Ø×ÒÐ&Õ(:Ñ;Ô;Ð;Ø×Ò�oÕ'8Ñ9Ô9Ð9Ø×ÒÐ&­Ñ8Ô8Ð8Ø×ÒÐ+Õ-AÑBÔBÐBÐBÐBr;   )r3   r4   )r>   r   r3   r?   )r>   r   r3   r4   rI   )r>   r   r   r[   r3   r[   rµ  )r>   r   r3   ri   )r>   r   r3   rr   )r~   r?   r   r   r"   r?   ry   r   rz   r   r{   r   r|   r   r}   r   r3   r€   )r>   r   r3   r€   )r   r   r¾   r   r3   r§   )r   r   r¾   r   rÆ   r4   r3   r§   )rÊ   r   r3   r4   r¸   )rÊ   r   r3   r§   )rÿ   r   r3   r4   )r3   r¼  r¶  )jr¼   Ú
__future__r   ÚasyncioÚcollectionsr   r   r   r•  rm   ÚloggingrJ  Úrer  r8   rL  r¢   r¨  r…   ÚweakrefÚtypingr   r   r	   r
   r   Úaiohttpr   r7   ÚImportErrorÚsysÚpathlibr   Ú_PathrE   Úinsertr?   Ú__file__ÚresolveÚparentsÚgateway.configr   r   Úgateway.platforms.baser   r   r   r   r   Úgateway.sessionr   Ú	getLoggerr¹   rÜ   r  r
  rB   r  r  rž   rp   r„   r²   r�  rR   Úcompiler_   r^   r•   ÚWeakSetr/   Ú__annotations__r£   rÏ   rÀ   r”   r0   r1   r2   r=   rF   rJ   rZ   ra   rh   rq   rw   r�   r—   r™   rÄ   rÉ   rÍ   rÓ   rÞ   rá   rç   rñ   rô   rù   rü   rþ   r»  r¿  rÐ  rê  r:   r;   r<   ú<module>r     sÕ  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðØÐÐÐÐÐàÐÐøØð ð ð ØÐØ
€C€C€Cðøøøð €
€
€
Ø !Ð !Ð !Ð !Ð !Ð !Ø „‡‚��3�3�u�u˜X‘”×.Ò.Ñ0Ô0Ô8¸Ô;Ñ<Ô<Ñ =Ô =Ð =à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -à	ˆÔ	˜8Ñ	$Ô	$€à€Ø€Ø€Ø#Ð ØÐ Ø Ð ØÐ Ø*Ð Ø0Ð Ø+Ð ðð ð Ð ð �"”*Ð5Ñ6Ô6€ØÐ ðð ð Ð ð  4C°7´?Ñ3DÔ3DÐ Ð DÐ DÐ DÑ DØ&˜	œÑ(Ô(Ð Ø#�Y”^Ñ%Ô%Ð Ø!˜c™eœeÐ Ð #Ð #Ð #Ñ #Ø˜3™5œ5€Ð  Ð  Ð  Ñ  Ø"% #¡%¤%Ð Ð 'Ð 'Ð 'Ñ 'ðð ð ð ð&ð ð ð ð	ð 	ð 	ð 	ð5ð 5ð 5ð 5ðð ð ð ð ðIð Ið Ið Iðð ð ð ð"ð ð ð ð ØØØØØð,ð ,ð ,ð ,ð ,ð ,ð^$ð $ð $ð $ðN%ð %ð %ð %ð %ñ %ô %ð %ðB-ð -ð -ð -ð -ð7ÐY^ð 7ð 7ð 7ð 7ð 7ð 7ð

ð 

ð 

ð 

ð'ð 'ð 'ð 'ðð ð ð ð"ð ð ð ð"
ð 
ð 
ð 
ðð ð ð ð&ð ð ð ðJð Jð Jð Jð	_ð 	_ð 	_ð 	_ð[ð [ð [ð [ð [Ð%ñ [ô [ð [ðD
Cð Cð Cð Cð
ð ð ð ð'Yð 'Yð 'Yð 'YðTCð Cð Cð Cð Cð Cs   ÁA$ Á$	A0Á/A0