+
    lHàj#Ä  ã                  óÊ  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI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 ]P*                  ! ]4      tRtRt]R,           tRtR_tR	tR`t]P>                  ! R
4      t ]P>                  ! R4      t!R R lt"R R lt#R R lt$R R lt%RaR R llt&RRRR/R R llt'RbR R llt(R R lt)R R lt*]R ,          3R!R/R" R# lllt+R$ R% lt,R& R' lt-R( R) lt.R* R+ lt/R, R- lt0 ! R. R/]14      t2 ! R0 R1]24      t3R2 R3 lt4R4 R5 lt5R6 R7 lt6RaR8 R9 llt7R:R/R; R< llt8R= R> lt9R? R@ lt:RA RB lt;RCRRDR/RE RF llt<RCRRDR/RG RH llt=RCRRDR/RI RJ llt>R:RRKR/RL RM llt?RN RO lt@RP RQ ltARR RS ltBRT RU ltCRV RW ltD]RX8X  dˆ   ]PŠ                  P�                  ^ ]G! ]! ]H4      P“                  4       P”                  P”                  4      4       ]P–                  RY,          RZ.8X  d    ^ RILtL]N! ]B! ]P–                  R],          4      4      hR#   ]M]N3 d¨   tO]P! ]OR[R\4      ;'       g#    ]Q! ]O]N4      ;'       d    ]OP¤                  '       * tS];! ]P–                  R],          4      tT]S'       gM   ]T'       dE   ]PŠ                  P«                  ]/! ]T^,          4      4      '       d   ]V! ]:! ]T^,          R^4      4       h RtOAOii ; i)cu�  Bot Mode agent-to-agent DM tool â€” ``message_agent``.

Lets a Bot Mode agent message a teammate (a profile on this install, an agent on
a registered peer gateway, or one on another Desktop-connected machine): the
target is validated against the live roster, the attribution prefix is applied
server-side, and the reply arrives later via the background-process completion
notification (fire-and-forget). Containment: the schema is injected ONLY into a
bot's canonical "Bot Chat" session on a Bot-Mode-managed install (same gate as
``tools/bot_mode_probe.py``; never in the registry or any toolset), and dispatch
re-checks that gate so a forged call returns a structured error. Transports:
local â†’ ``hermes -p <name> chat --in ~ -c "Bot Chat" --create-if-missing -Q
--query-file <tmp>``; peer â†’ ``hermes peer dm <peer>[/<name>] < <tmp>``; both via
``terminal_tool(background=True, notify_on_complete=True)``.
)ÚannotationsN)ÚPath)ÚAnyÚOptionalÚmessage_agenti€>  iÐ  z	hermes-dmi,  z=^([a-z0-9][a-z0-9_-]{0,63})/([a-zA-Z0-9][a-zA-Z0-9_-]{0,63})$z ^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$c               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚstr© )Úformats   "Ú6/home/ubuntu/.hermes/hermes-agent/tools/bot_mode_dm.pyÚ__annotate__r   >   s   € ÷ *ñ *�sñ *ó    c                 ó.   € ^ RI Hp  \        V ! 4       4      # )é    ©Úget_process_hermes_home)Úhermes_constantsr   r   r   s    r   Ú_default_homer   >   s   € Ý8ÜÑ&Ó(Ó)Ð)r   c               ó   € V ^8„  d   QhRR/# )r	   r
   Údictr   )r   s   "r   r   r   C   s   € ÷ 5ñ 5 4ñ 5r   c                 óZ   € RRRR\         RRRRRRR	RR
RR/RRR
RR\         R2//RR	R.///# )zFOpenAI-format schema for ``message_agent`` (injected, not registered).ÚtypeÚfunctionÚnameÚdescriptionuF  Send a message to ANOTHER agent (teammate) on this install, or to an agent on a registered peer gateway. This is FIRE-AND-FORGET and asynchronous, like texting: it validates the target against the live roster, delivers your message into that agent's own Bot Chat with your attribution automatically prefixed, and returns immediately with a dispatch acknowledgement â€” status queued plus a delivery_id (the hand-off to a background delivery process, not a delivery receipt). It does NOT return their reply and you must not wait or poll for one â€” send it, finish your turn, and that process's completion notification wakes you with the outcome: their reply, or the delivery failure â€” unless the ack returns reply_delivery="poll", in which case follow its process(action="wait") instruction before ending the turn. COMPOSE the message yourself: write what YOU want to say to that agent (lead with the point; include the concrete ask or result). Never paste the user's words verbatim â€” paraphrase the actionable substance, and keep private 1:1 chat content private. Message one clearly relevant teammate when it genuinely helps the user's goal; don't fan out to several agents unless the user explicitly asked. Use the teammate roster in your system prompt (names + roles) to pick the right recipient; targets: a teammate name (e.g. 'researcher'), '<peer>/<agent>' for an agent on a registered peer gateway (e.g. 'spark/researcher', or just '<peer>' for the peer's main agent), or an agent on another connected machine from your roster (use '<handle>@<connection>' if the same handle exists on several).Ú
parametersÚobjectÚ
propertiesÚtargetÚstringz¦Who to message: a teammate profile name from your roster ('researcher', 'hermes' for the default agent), or '<peer>' / '<peer>/<agent>' for a registered peer gateway.Úmessagez-The message YOU composed for that agent (max uT    chars). Do not include the 'Message from â€¦' prefix â€” it is added automatically.Úrequired)ÚMESSAGE_AGENT_TOOL_NAMEÚMESSAGE_MAX_CHARSr   r   r   Úmessage_agent_tool_schemar'   C   sŠ   € ð 	�
ØØÔ+ØðQð. Ø˜ØØØ Ø%ðYðð Ø Ø%ØKÜ0Ð1ð 2WðWð ðð$ ˜X yÐ1ð)ð50
ð3ð 3r   c               ó    € V ^8„  d   QhRRRR/# ©r	   Úagentr   r
   Úboolr   )r   s   "r   r   r   {   s   € ÷ ñ  Cð ¨Dñ r   c                óÞ   €  \        V RR4      '       g   R# ^ RIHpHp \	        V 4      V8H  ;'       d    V! \        V 4      4      #   \         d    \        P                  RRR7        R# i ; i)zÔThe ``message_agent`` gate: a protocol-enabled agent whose session is a managed
Bot-Mode canonical Bot Chat. Session-stable, so it is prompt-cache safe to re-evaluate
on every tool-snapshot rebuild. Never raises.Ú_bot_mode_protocolTF)ÚBOT_CHAT_TITLEÚis_bot_mode_managedzmessage_agent_authorized failed©Úexc_info)	ÚgetattrÚtools.bot_mode_prober.   r/   Ú_session_titleÚ_agent_homeÚ	ExceptionÚloggerÚdebug)r*   r.   r/   s   &  r   Úmessage_agent_authorizedr9   {   sf   € ð
Ü�uÐ2°D×9Ò9ÙßLô ˜eÓ$¨Ñ6×bÐbÑ;NÌ{Ð[`ÓOaÓ;bÐbøÜô Ü�‰Ð6ÀˆÔFÚðús   ‚A —A ´A Á"A,Á+A,c               ó    € V ^8„  d   QhRRRR/# r)   r   )r   s   "r   r   r   Œ   s   € ÷ ñ  Sð ¨Tñ r   c                óB  €  \        V RR4      '       g   R# \        V RR4      p\        V4      ;'       d5    \        ;QJ d    R V 4       F  '       g   K   RM	  RM! R V 4       4      pV'       gL   \        V 4      '       g   R# V P                  f   . V n        V P                  P                  \        4       4       \        V RR4      p\        V\        4      '       d   VP                  \        4       R#   \         d    \        P                  RRR	7        R# i ; i)
u	  Inject the ``message_agent`` schema into a Bot Chat agent's tool list (once per turn).
Idempotent and deterministic for the session's life (the gate is stable from the
first turn), so the tool list is byte-identical across turns â€” prompt-cache safe. Never raises.r-   TFÚtoolsNc              3  ó¢   "  € T FE  p\        V\        4      ;'       d)    VP                  R / 4      P                  R4      \        8H  x € KG  	  R# 5i)r   r   N)Ú
isinstancer   Úgetr%   )Ú.0Úts   & r   Ú	<genexpr>Ú,ensure_message_agent_tool.<locals>.<genexpr>”   sE   é € ð &
á�ô �qœ$Ó×`Ð` A§E¡E¨*°bÓ$9×$=Ñ$=¸fÓ$EÔI`Ñ$`Ô`Ûùs
   ‚Až1AÚvalid_tool_namesz ensure_message_agent_tool failedr0   )r2   r+   Úanyr9   r<   Úappendr'   r>   ÚsetÚaddr%   r6   r7   r8   )r*   r<   ÚpresentÚvalids   &   r   Úensure_message_agent_toolrK   Œ   sï   € ðÜ�uÐ2°D×9Ò9ÙÜ˜˜w¨Ó-ˆÜ�u“+÷ 
ð 
§#£#ñ &
áó&
§#§#¢#ñ &
áó&
ó #
ˆ÷ Ü+¨E×2Ò2ÙØ�{‰{Ò"Ø �”Ø�K‰K×ÑÔ8Ó:Ô;ô ˜Ð1°4Ó8ˆÜ�eœS×!Ò!Ø�I‰IÔ-Ô.ÙøÜô Ü�‰Ð7À$ˆÔGÚðús4   ‚C8 —C8 ¶C8 ÁC8 ÁC8 Á3C8 ÂA0C8 Ã8"DÄDc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r	   r!   r   Úrosterú	list[str]ÚrootúPath | Noner
   úOptional[str]r   )r   s   "r   r   r   ª   s)   € ÷ 8ñ 8 ð 8¨Yð 8¸kð 8ÐUbñ 8r   c                ó†  aa€ V P                  4       P                  4       oS'       g   R# SR8X  d   RV9   d   R# R# \        V3R lV 4       R4      pVf   Vf   V# ^ RIHpHp V! V4      o\        4       P                  ! V3R lV! S4      S0,           4       !  p\        V4      ^8X  d   \        \        V4      4      # R# )uh  Map a target to a local profile FOLDER id: 'hermes' â†’ 'default'; an exact folder id
(case-insensitive); else â€” when ``root`` is given â€” a friendly name or its Desktop @-slug
(profile.yaml ``display_name`` / Bot Mode title: 'Scribe', '@scribe', 'Dr. Foo' â†’ 'foo').
Ambiguous friendly names resolve to None so a DM never lands on the wrong bot (#100671).NÚhermesÚdefaultc              3  óT   <"  € T F  qP                  4       S8X  g   K  Vx € K  	  R # 5i©N)Úlower)r@   r   Úwants   & €r   rB   Ú&_resolve_local_name.<locals>.<genexpr>´   s   øé € ÐB¡6˜4¯Z©Z«\¸TÑ-A—$’$£6ùs   ƒ(ž
()Úalias_formsÚlocal_alias_mapc              3  óX   <"  € T F  pSP                  V\        4       4      x € K!  	  R # 5irV   )r?   rG   )r@   ÚformÚaliasess   & €r   rB   rY   º   s#   øé € ÐYÑ>X°d˜Ÿ™ T¬3«5×1Ð1Ó>Xùs   ƒ'*)
ÚstriprW   Únextr3   rZ   r[   rG   ÚunionÚlenÚiter)	r!   rM   rO   ÚexactrZ   r[   Úhitsr^   rX   s	   &&&    @@r   Ú_resolve_local_namerf   ª   s©   ù€ ð
 �<‰<‹>×ÑÓ!€DßÙØˆxÔØ%¨Ô/ˆyÐ9°TÐ9ÜÔB¡6ÓBÀDÓI€EØÒ˜DšLØˆßAá˜dÓ#€GÜ‹5�;Š;ÔY¹kÈ$Ó>OÐSWÐRXÖ>XÓYÑZ€DÜ" 4›y¨Aœ~Œ4”�T“
ÓÐ7°4Ð7r   rM   Úpeersc               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r#   r   rM   zlist[str] | Nonerg   r
   r   )r   s   "r   r   r   ¾   s+   € ÷ ñ �#ð Ð"2ð ÐBRð Ð^añ r   c               ór   € ^ RI Hp RV RV! V 4      /pVe   WR&   Ve   W$R&   \        P                  ! V4      # )r   )Úclassify_agent_errorÚerrorÚreasonÚ	teammatesrg   )Útools.bot_failure_reasonsrj   ÚjsonÚdumps)r#   rM   rg   rj   Úpayloads   &$$  r   Ú_errrr   ¾   sE   € Ý>à&¨°Ñ;OÐPWÓ;XÐY€GØÒØ%�ÑØÒØ �ÑÜ�:Š:�gÓÐr   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r	   r!   r   r#   Útask_idrQ   r*   r   r
   r   )r   s   "r   r   r   É   s?   € ÷ `mñ `m˜sð `m°#ð `mÀ]ð `mÐbeð `mÐqtñ `mr   c           
     ó¤  a%a&€ \        V4      p ^ RIHpHpHpHpHp	Hp
HpH	p ^ RI
Hp \        V4      V8w  d   \        R4      # V! V4      '       g   \        R4      #  ^ RIHp T! RTR	7       T! \#        T4      4      T
! \#        T4      4      pp\%        T! T4      4      p\'        T4      pT	! T4      o%T Uu. uF  pTT8w  g   K  T! T4      NK  	  upo&R
 T%T&3R llp\)        T;'       g    R4      P+                  4       pT'       g   \        R4      # \-        T4      \.        8”  d    \        R\-        T4       R\.         R24      # \)        T ;'       g    R4      P+                  4       P1                  R4      pT'       g	   T! R4      # RT! TTP3                  T\#        T4      4      4       RT! T4       R2T,           p\%        Y#R7      pRRT 2RT! T4      RR/p\4        P7                  T4      pT'       g   TP9                  4       S%9   d¢   T'       d   TP;                  4       MTP9                  4       R3w  ppTS%9  d   T! RT R24      # T'       d   T RT 2MTp^ RIHpH p  / TCRT! TT ! 4       4      /Cp!\C        T! 4       R T
! T4      R!R"T.TRT;'       g    T R#T R$23R%RR&T!/TB # RTP+                  4       P1                  R4      9   d   \E        TTTT3/ TB p"T"e   T"# \G        TTT4      p#\I        \J        P7                  T4      4      p$T#f   T$'       g   RT9  d   T! R'T: R(24      # T#e   T#T8X  d=   \E        \#        T4      TTT3/ TB p"T"e   T"# T#T8X  d   \        R)4      # T! R*T R+24      # \C        T! 4       R T#.TRT! T#4       23R%R,R-TT#,          R&T/TB #   \         d   p\        RT 24      u Rp?# Rp?ii ; iu upi ).uœ   Deliver ``message`` to ``target``'s Bot Chat. Returns a JSON ack/error.
``agent`` is the calling AIAgent â€” used for the Bot Chat gate and sender identity.)r.   Ú_display_nameÚ_handleÚ_hermes_rootÚ_peersÚ_profile_nameÚ_rosterr/   )Ú_hermes_clizhmessage_agent is only available in a Bot Mode 'Bot Chat' session. This session is not one; do not retry.zaThis install is not Bot-Mode-managed (no bot roster); message_agent is unavailable. Do not retry.zBot Mode gate check failed: N)Úrecord_feature_usedÚbot_mode)Úhermes_homec               ó    € V ^8„  d   QhRRRR/# )r	   Úmsgr   r
   r   )r   s   "r   r   Ú(message_agent_tool.<locals>.__annotate__å   s   € ÷ 8ñ 8˜ð 8 ñ 8r   c                ó    <€ \        V SSR 7      # ))rM   rg   )rr   )r�   rg   rm   s   &€€r   Ú_roster_errÚ'message_agent_tool.<locals>._roster_errå   s   ø€ Ü�C 	°Ô7Ð7r   Ú uC   message is required â€” compose what you want to say to that agent.zmessage too long (z	 chars > zC). Send the essentials; share large content as a file path instead.Ú@ztarget is required.u   Message from ðŸ¤– z (@z): ©rt   r*   Úidzbot:r   Úis_botTzNo registered peer named 'z'.Ú/)Úbot_author_idÚlocal_originú-pÚpeerÚdmz
 on peer 'Ú'Ú
stdin_fileÚauthorzInvalid target: Ú.z<You can't message yourself. Pick a teammate from the roster.zNo teammate named 'z‰' on this install, on a connected machine, or on a registered peer. Pick a name from the roster (roles are listed in your system prompt).FÚprofile_home)&r5   r3   r.   rv   rw   rx   ry   rz   r{   r/   Útools.bot_relayr|   r4   rr   r6   Ú/hermes_cli.observability.shared_metrics_signalsr}   r   r   Úlistr   r_   rb   r&   Úlstripr?   Ú_PEER_TARGET_REÚmatchrW   ÚgroupsÚagent.turn_authorrŒ   r�   Ú_start_deliveryÚ_try_relay_deliveryrf   r+   Ú_LOCAL_TARGET_RE)'r!   r#   rt   r*   Úhomer.   rv   rw   rx   ry   Ú_self_profile_namer{   r/   r|   Úexcr}   rO   ÚmeÚroster_homesrM   Únr„   ÚbodyÚ
raw_targetÚcontentÚdeliveryr“   Ú
peer_matchÚ	peer_nameÚpeer_profileÚ	dm_targetrŒ   r�   Úpeer_authorÚrelayedÚresolvedÚis_local_shaperg   rm   s'   &&&&                                 @@r   Úmessage_agent_toolr³   É   sJ  ù€ ô �uÓ€Dð:÷	
÷ 	
ó 	
õ 	0ä˜%Ó  NÔ2Üð Aó Bð Bá" 4×(Ò(Üð Fó Gð Gð )õ
 TÙ˜
°Õ5áœD ›JÓ'Ñ);¼DÀ»JÓ)Gˆ"€DÜ™ ›Ó&€LÜ�,Ó€FÙ�4‹L€EÙ%+Ó7¡V ¨q°B©w”‘˜–¡VÑ7€I÷8ñ 8ô ˆw�}ˆ}˜"Ó×#Ñ#Ó%€DßÜÐYÓZÐZÜ
ˆ4ƒyÔ$Ô$ÜÐ(¬¨T«¨°9Ô=NÐ<Oð PWð Wó Xð 	Xô �V—\�\˜rÓ"×(Ñ(Ó*×1Ñ1°#Ó6€JßÙÐ0Ó1Ð1à"¡=°°\×5EÑ5EÀbÌ$ÈtË*Ó5UÓ#VÐ"WÐWZÑ[bÐceÓ[fÐZgÐgjÐkÐnrÕr€GÜ˜GÔ1€Hà�d˜2˜$�K ©°«°hÀÐE€Fô !×&Ñ& zÓ2€Jß�Z×%Ñ%Ó'¨5Ô0ß9C *×"3Ñ"3Ô"5È*×JZÑJZÓJ\Ð^bÐIcÑˆ	�<Ø˜EÔ!ÙÐ!;¸I¸;ÀbÐIÓJÐJß5A�y�k  < .Ñ1Àyˆ	çAØI˜ÐI ¡}°R¹»Ó'HÑIˆô ¡£¨tÑ5GÈÓ5MÈvÐW[Ð]fÐgÐipØ!" <×#<Ð#<°9Ð"=¸ZÈ	À{ÐRSÐTñ?Øaeð?à&1ð?à5=ñ?ð 	?ð ˆj×ÑÓ ×'Ñ'¨Ó,Ô,Ü% d¨J¸ÀÑPÀxÑPˆØÒØˆNä" :¨v°tÓ<€HÜÔ*×0Ñ0°Ó<Ó=€NØÒ§°3¸jÔ3HÙÐ-¨j©^¸1Ð=Ó>Ð>ØÒ˜8 rœ>ô &¤d¨4£j°*¸gÀrÑVÈXÑVˆØÒØˆNØ�rŒ>ÜÐVÓWÐWÙÐ0°°ð =Gð Gó Hð 	Hô
 ™K›M¨4°Ð:¸GÀqÉÐQYÓIZÐH[ÐE\ñ mØ&+ðmØ:FÀxÕ:PðmØY_ðmØckñmð møô] ô :ÜÐ2°3°%Ð8Ó9Õ9ûð:üò 8s5   �4N' ÁN' Á
N' Â8	OÃOÎ'O
Î2OÎ?O
ÏO
c               ó4   € V ^8„  d   QhRRRRRRRRRRR	R
RR/# )r	   rO   r   r¨   r   r©   r¤   rt   rQ   r*   r   r
   r   )r   s   "r   r   r   ,  s@   € ÷ -ñ -˜dð -°ð -¸cð -Àsð -Ø!.ð-Ø7:ð-Ø?Lñ-r   c               óÊ  aa€  ^ RI HpHp ^ RIHpHoHp	Hp
HpH	pH
p V
! V 4      pV'       d	   V! W4      MRpVf   R# VR8X  d‡   VP                  4       P                  R4      P                  R4      ^ ,          P                  4       oRP                  VV3R l\!        Wë! Wç! V 4      4      4       4       4      p\#        RV R	V R
24      #  V	! WW#V! V4      R7      pRTR,           RTR,          ;'       g
    TR,           2p\-        T! T T4      TTR,          YER7      p\$        P.                  ! T4      P1                  R4      pT'       g   T# \$        P&                  ! RRRTR,          RTRTRRT R2/4      #   T d8   p\$        P&                  ! R\)        T4      RTP*                  /4      u Rp?# Rp?ii ; i  \2         d    \4        P7                  RRR7        R# i ; i)a,  Cross-connection delivery via the Desktop relay; None when the target doesn't
resolve against the relay roster. The envelope is queued on disk for the Desktop
to drain; a background waiter is spawned immediately so the relayed reply wakes
the sender through the standard completion-notification path.)rw   Úlocal_taken_forms)ÚEnvelopeRefusedErrorÚ_target_aliasesÚenqueue_envelopeÚread_remote_rosterÚremote_target_formsÚresolve_remote_targetÚwaiter_commandNÚ	ambiguousr‡   z, c              3  óJ   <"  € T F  w  rSS! V4      9   g   K  Vx € K  	  R # 5irV   r   )r@   Úrr]   r¸   rX   s   &  €€r   rB   Ú&_try_relay_delivery.<locals>.<genexpr>?  s)   øé € ð =Ñ2s¡w qØ!%©¸Ó);Ñ!;÷ #šdÓ2sùs   ƒ#™
#r‘   uE   ' exists on several connected machines â€” disambiguate with one of: r”   )r!   r#   Úsender_profileÚsender_handlerk   rl   Úhandlez on Úconnection_labelÚconnection_idr‰   )Údelivery_idrt   r*   ÚstatusÚqueuedrÇ   ÚtoÚnotification_errorÚdetailúMessage queued for zv; the relay delivers it on its own, but the reply waiter did not start, so the reply will NOT wake you. Do NOT resend.zrelay delivery attempt failedTr0   )r3   rw   r¶   r–   r·   r¸   r¹   rº   r»   r¼   r½   r_   r™   Ú	partitionrW   ÚjoinÚziprr   ro   rp   r   rl   Ú_spawn_deliveryÚloadsr?   r6   r7   r8   )rO   r¨   r©   r¤   rt   r*   rw   r¶   r·   r¹   rº   r»   r¼   r½   rM   r›   ÚformsÚenveloper£   ÚlabelÚrawÚwaiter_errorr¸   rX   s   &&&&$$                @@r   rŸ   rŸ   ,  sì  ù€ ð'ßC÷	
÷ 	
ñ 	
ñ
 $ DÓ)ˆß=CÑ% jÔ9ÈˆØŠ=ÙØ�KÔØ×#Ñ#Ó%×,Ñ,¨SÓ1×;Ñ;¸CÓ@ÀÕC×IÑIÓKˆDØ—I‘Iõ =´#°fÐ>QÐRXÐZkÐlpÓZqÓ>rÔ2só =ó =ˆEä˜!˜J˜<Ð'lÐmrÐlsÐstÐuÓvÐvð	IÙ'¨ÀGÑnuÐvxÓnyÔzˆHð �E˜(•OÐ$ D¨Ð/AÕ)B×)\Ð)\ÀeÈOÕF\Ð(]Ð^ˆÜ™n¨T°8Ó<¸eÐQYÐZ^ÕQ_ÐipÔ~ˆÜ—z’z #“×*Ñ*¨7Ó3ˆßØˆJô
 �zŠzØ�h ¨x¸­~¸tÀUÐL`ÐbnØÐ,¨U¨Gð 4^ð ^ð
ó ð 	øð $ô 	Iô —:’:˜w¬¨C«°(¸C¿J¹JÐGÓHÕHûð		Iûô& ô Ü�‰Ð4¸tˆÔDÚðúsY   „)F< ®F< ¾BF< ÃE; ÃF< Ã8AF< Å*F< Å;F9Æ,F4Æ.F9Æ/F< Æ4F9Æ9F< Æ<"G"Ç!G"c               ó   € V ^8„  d   QhRR/# )r	   r
   r   r   )r   s   "r   r   r   \  s   € ÷ ñ �ñ r   c                 ó,  € \        \        R R4      p \        V 4      '       d   V ! 4       MRp\        \        P
                  ! 4       4      Ve   \         RV 2M\        ,          pVP                  RRR7       VP                  4       p\        P                  ! VP                  4      '       g   \        RV 24      hVe    VP                  V8w  d   \        RV 24      h\        P                  ! VP                  4      R8w  d   VP                  R4       V# )ÚgetuidNÚ-iÀ  T)ÚmodeÚexist_okz!DM temp path is not a directory: z,DM temp directory is owned by another user: )r2   ÚosÚcallabler   ÚtempfileÚ
gettempdirÚ_DM_DIR_NAMEÚmkdirÚlstatÚstatÚS_ISDIRÚst_modeÚPermissionErrorÚst_uidÚS_IMODEÚchmod)Ú
uid_getterÚuidÚpathÚinfos       r   Ú_dm_dirrð   \  sÙ   € Üœ˜X tÓ,€JÜ" :×.Ò.‰*Œ,°D€CÜ”×#Ò#Ó%Ó&ÀSÂ_¬\¨N¸!¸C¸5Ñ*AÔZfÕg€DØ‡J�J�E D€JÔ)ð �:‰:‹<€DÜ�<Š<˜Ÿ™×%Ò%ÜÐ AÀ$ÀÐHÓIÐIØ
‚˜4Ÿ;™;¨#Ô-ÜÐ LÈTÈFÐSÓTÐTÜ‡|‚|�D—L‘LÓ! UÔ*Ø�
‰
�5ÔØ€Kr   é  Únowc               ó$   € V ^8„  d   QhRRRRRR/# )r	   Úmax_age_hoursÚfloatrò   zfloat | Noner
   Úintr   )r   s   "r   r   r   m  s(   € ÷ Xñ X¨ð XÐR^ð XÐjmñ Xr   c               ó¸  aa€ Vf   \         P                   ! 4       MTV R,          ,
          o\        \        P                  ! 4       4      pVR3VR3.p\        P
                  ! \        4      ;_uu_ 4        \        4       pVP                  VR34       VP                  VR34       RRR4       ^ RI	H
o \        VV3R lV 4       4      #   + '       g   i     L,; i)	zûDelete orphaned DM payload files older than *max_age_hours*; returns count.
Same contract as the other ``cleanup_*_cache`` helpers (hourly gateway housekeeping);
legacy temp-root locations from versions predating the dedicated directory are swept too.Nrñ   zhermes-dm-*.txtzhermes-relay-dm-*.txtz*.txtz*.live.json)Úunlink_files_older_thanc              3  ó:   <"  € T F  w  rS! WS4      x € K  	  R # 5irV   r   )r@   ÚdÚpatternÚcutoffrø   s   &  €€r   rB   Ú'cleanup_bot_dm_cache.<locals>.<genexpr>}  s   øé € ÐWÉY¹z¸qÑ& q°6×:Ð:ËYùs   ƒ)Útimer   rà   rá   Ú
contextlibÚsuppressÚOSErrorrð   rF   r–   rø   Úsum)rô   rò   Ú	temp_rootÚ	locationsÚdm_dirrü   rø   s   &$   @@r   Úcleanup_bot_dm_cacher  m  s­   ù€ ð !š[Œd�iŠiŒk¨c°]ÀTÕ5IÕI€FÜ”X×(Ò(Ó*Ó+€IØÐ.Ð/°)Ð=TÐ1UÐV€IÜ	×	Ò	œW×	%Õ	%Ü“ˆØ×Ñ˜& 'Ð*Ô+ð 	×Ñ˜& -Ð0Ô1÷ 
&õ 8äÕWÉYÓWÓWÐW÷ 
&×	%ús   Á41C	Ã	C	c               ó    € V ^8„  d   QhRRRR/# )r	   rî   r   r
   ÚNoner   )r   s   "r   r   r   €  s   € ÷ ñ ˜#ð  $ñ r   c                ó°   € \         P                  ! \        4      ;_uu_ 4        \        P                  ! V 4       R R R 4       R #   + '       g   i     R # ; irV   )rÿ   r   r  rÞ   Úunlink)rî   s   &r   Ú_unlink_dm_filer  €  s-   € Ü	×	Ò	œW×	%Õ	%Ü
�	Š	�$Œ÷ 
&×	%×	%Ò	%ús   £AÁA	c               ó    € V ^8„  d   QhRRRR/# )r	   r©   r   r
   r   )r   s   "r   r   r   …  s   € ÷ ñ ˜Cð  Cñ r   c                óâ  € \        4        \        P                  ! RR\        4       RR7      w  r \        P
                  ! VRRR7      ;_uu_ 4       pVP                  V 4       RRR4       V#   + '       g   i     T# ; i  \         dc    \        P                  ! \        4      ;_uu_ 4        \        P                  ! T4       RRR4       M  + '       g   i     M; i\        T4       h i ; i)	u:   The message rides a temp file â€” never inline shell text.zdm-z.txtT)ÚprefixÚsuffixÚdirÚtextÚwúutf-8©ÚencodingN)r  rà   Úmkstemprð   rÞ   ÚfdopenÚwriteÚBaseExceptionrÿ   r   r  Úcloser  )r©   Úfdrî   Úfs   &   r   Ú_write_dm_filer  …  s«   € äÔÜ×Ò u°VÄÃÐQUÔV�H€BðÜ�YŠY�r˜3¨×1Õ1°QØ�G‰G�GÔ÷ 2ð €K÷ 2Ö1ð €Kûô ô ä× Ò ¤×)Õ)Ü�HŠH�RŒL÷ *×)×)Ð)úä˜ÔØðúsA   °!B ÁA-Á#B Á-A>	Á8B Á>B Â-C.Â.CÃ	C.ÃCÃC.c               ó    € V ^8„  d   QhRRRR/# )r	   ÚargvrN   r’   r+   r   )r   s   "r   r   r   •  s   € ÷ Kñ K˜ð K°4ñ Kr   c               ón  € V '       d
   V ^ ,          MRP                  R^4      R,          P                  R^4      R,          pV'       g&   \        V 4      ^8  g   VR9  g   V ^,          R8w  d   \        P                  ! 4       # ^ RIHp ^ RIHp V! V! \        \        4       4      4      V ^,          4      # )	a2  Per-profile turn lock for a LOCAL teammate delivery: local and relay deliveries
into one profile both run a Bot Chat turn here, so the turn window is serialized on
``tools.bot_relay``'s cross-process lock. Peer transports (stdin mode) are locked
on the remote gateway by its own deliver path.

See #93091.
r†   Ú\r‹   rŽ   )rx   )Úacquire_turn_lockéÿÿÿÿ©rS   z
hermes.exe)
Úrsplitrb   rÿ   Únullcontextr3   rx   r–   r"  r   r   )r  r’   Úclirx   r"  s   &$   r   Ú_delivery_lockr(  •  sˆ   € ÷ ˆ4�Ž7 ×
*Ñ
*¨4°Ó
3°BÕ
7×
>Ñ
>¸sÀAÓ
FÀrÕ
J€Cß”S˜“Y ”] cÐ1IÔ&IÈTÐRSÍWÐX\Ì_Ü×%Ò%Ó'Ð'Ý1Ý1á™\¬$¬}«Ó*?Ó@À$ÀqÅ'ÓJÐJr   c               ó    € V ^8„  d   QhRRRR/# ©r	   Údm_filezstr | os.PathLiker
   r   r   )r   s   "r   r   r   ©  s   € ÷ -ñ -Ð0ð -°Sñ -r   c                ó4   € \         P                  ! V 4       R2# )zYThe pinned live-delivery intent beside a DM file (the cache sweep globs ``*.live.json``).z
.live.json)rÞ   Úfspath©r+  s   &r   Ú_live_intent_filer/  ©  s   € ä�iŠi˜Ó Ð! Ð,Ð,r   c               ó    € V ^8„  d   QhRRRR/# r*  r   )r   s   "r   r   r   ®  s   € ÷ Mñ MÐ.ð M°3ñ Mr   c                ó¦   € \         P                  ! \        \        V 4      P	                  4       4      P                  4       4      P                  4       # )z£One delivery id per DM file: the dispatch ack, the live-owner intent and every retry
of the runner derive it the same way, so the sender can correlate all of them.)ÚhashlibÚsha256r   r   ÚresolveÚencodeÚ	hexdigestr.  s   &r   Ú_dm_delivery_idr7  ®  s7   € ô �>Š>œ#œd 7›m×3Ñ3Ó5Ó6×=Ñ=Ó?Ó@×JÑJÓLÐLr   c                  ó"   € ] tR tRtRtRtRtRtR# )ÚLiveTargetUnavailableErrori´  u  The canonical Bot Chat owner could not be reached with anything admitted â€” before the
intent was pinned, or on a dial that died before the deliver RPC went out: nothing was
sent, so this is a definite no-send the sender may retry, not the ambiguous
post-admission state.Úruntime_unavailablezonce the target is upr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rl   ÚresendÚ__static_attributes__r   r   r   r9  r9  ´  s   † ñð
 #€FØ$„Fr   r9  c                  ó4   € ] tR tRtRtRt]R R l4       tRtR# )ÚLiveTargetHeldErrori¾  a!  The owner refused because another session writer holds the Bot Chat, and settled this
delivery id as never sent (``bot_relay.settle``): every later attempt under the id gets that
disposition, so this is a definite no-send too. A refusal without that settlement stays the
ambiguous outcome.zafter that session closesc               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   Ú LiveTargetHeldError.__annotate__Ç  s   € ÷ ñ ˜ñ r   c                	ó   € ^ RI Hp V# )r   ©ÚHELD_NOT_SENT)rn   rH  )ÚselfrH  s   & r   rl   ÚLiveTargetHeldError.reasonÆ  s   € å;ØÐr   r   N)	r;  r<  r=  r>  r?  r@  Úpropertyrl   rA  r   r   r   rC  rC  ¾  s    † ñð
 )€Fàôó ôr   rC  c               ó$   € V ^8„  d   QhRRRRRR/# ©r	   r+  r   r£   r9  r
   r   )r   s   "r   r   r   Ì  s'   € ÷ lñ l #ð lÐ,Fð lÈ3ñ lr   c                ó€   € \         P                  ! R VP                  R\        V 4      RV RVP                   R2/4      # )rl   rÇ   rk   u4    â€” the message was NOT sent; it is safe to resend r”   )ro   rp   rl   r7  r@  )r+  r£   s   &&r   Ú_unavailable_payloadrO  Ì  sH   € Ü�:Š:�x §¡¨]¼OÈGÓ<TØ 3 %Ð'[Ð\_×\fÑ\fÐ[gÐghÐ iðkó lð lr   c               ó$   € V ^8„  d   QhRRRRRR/# rM  r   )r   s   "r   r   r   Ñ  s"   € ÷ .ñ .˜cð .Ð(Bð .Àsñ .r   c                ó  € . p\        V 4      V 3 FF  p\        V4       \        P                  P	                  V4      '       g   K5  VP                  V4       KH  	  V'       d   \        V RV^ ,           24      # \        W4      # )a  The answer to a definite no-send, for both the tool and its runner: first the payload and
any pinned intent go, so nothing local can rebuild or replay the delivery. A file that is still
there is not settlement: the answer is then the unknown outcome, never "safe to resend".zcould not remove )r/  r  rÞ   rî   ÚlexistsrF   Ú_live_outcome_unknownrO  )r+  r£   Úleftrî   s   &&  r   Ú_settled_no_sendrU  Ñ  sm   € ð €DÜ" 7Ó+¨WÓ5ˆÜ˜ÔÜ�7‰7�?‰?˜4× Ô Ø�K‰K˜Öñ 6÷ Ü$ WÐ0AÀ$ÀqÅ'ÀÐ.KÓLÐLÜ Ó-Ð-r   c               ó    € V ^8„  d   QhRRRR/# )r	   Úrecordúdict | Noner
   r+   r   )r   s   "r   r   r   ß  s   € ÷ dñ d˜kð d¨dñ dr   c                ó’   € ^ RI Hp \        V 4      ;'       d0    V P                  R4      RJ ;'       d    V P                  R4      V8H  # )zŽThe owner's terminal not-sent receipt for a delivery refused while another writer held the
chat (``gateway/session_bot.py:_not_sent_record``).rG  ÚrefusedTrl   )rn   rH  r+   r?   )rW  rH  s   & r   Ú_held_dispositionr[  ß  s>   € õ 8Ü�‹<×cÐc˜FŸJ™J yÓ1°TÐ9×cÐc¸f¿j¹jÈÓ>RÐVcÑ>cÐcr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r	   r•   rP   r+  r   r“   úOptional[dict]r
   rX  r   )r   s   "r   r   r   æ  s)   € ÷ <ñ < ð <°sð <ÀNð <Ð^iñ <r   c                ó–  € ^ RI HpHpHpHp ^ RIHp \        \        V4      4      pRp	VP                  4       '       d)   \        P                  ! VP                  RR7      4      p
EM6V f   Q h V! V 4      pTf   \        R	4      h\        RR
TR\        T4      P                  RR7      R\!        T4      /T'       d   RT/M/ B p
 \"        P$                  ! T\"        P&                  \"        P(                  ,          \"        P*                  ,          R4      p\"        P,                  ! TRRR7      ;_uu_ 4       p\        P.                  ! Y®4       TP1                  4        \"        P2                  ! TP5                  4       4       RRR4       T! TP6                  4       Rp	V
R
,          R,          pV! WúR,          4      pVe   V
R
,          P;                  R4      '       dO   ^ RIHp ^ RI H!p ^ RI H"p \        V
R,          V
P;                  R4      R7      p V! WúR
,          V
R,          3/ VB p\M        V4      '       d   \O        R4      hV#   \         d   p\        RT R24      ThRp?ii ; i  + '       g   i     Lô; i  \8         d+    \        P                  ! TP                  RR7      4      p
 ELi ; i  T dS   p\G        T4      T8w  g    TPH                  P;                  R4      RJd   h T! YúR
,          T
R,          3/ TB p Rp?LàRp?iT d3   pT	'       g   h \K        \        T4      4       \        RT R24      ThRp?ii ; i)zIPin intent before admission; retries may inspect, never change transport.)ÚPreDialErrorÚdeliver_to_live_ownerÚfind_canonical_live_ownerÚread_delivery_result)Úfsync_directoryFú	utf-8-sigr  Nz*canonical Bot Chat target is unavailable (Ú)z(canonical Bot Chat target is unavailableÚownerr#   rÇ   r“   i€  r  r  Tr•   Ú	canonical)ÚGatewayRPCErrorrG  )Úsettle_held_delivery)rÇ   r“   Úadmittedz-live authority dial failed before admission (z*Bot Chat is held by another session writerr   )(Útools.bot_live_deliveryr_  r`  ra  rb  Úutilsrc  r   r/  Úexistsro   rÒ   Ú	read_textr6   r9  r   r7  rÞ   ÚopenÚO_CREATÚO_EXCLÚO_WRONLYr  ÚdumpÚflushÚfsyncÚfilenoÚparentÚFileExistsErrorr?   Úhermes_cli.gateway_clientrh  rn   rH  ri  r   Údatar  r[  rC  )r•   r+  r“   r_  r`  ra  rb  rc  Úintent_pathÚ
pinned_nowÚintentrf  r£   r  Ústreamr¡   rW  rh  rH  ri  Úidentitys   &&&                  r   Ú_admit_live_dmr€  æ  sß  € ÷?ó ?å%ô Ô(¨Ó1Ó2€KØ€JØ×Ñ×ÒÜ—’˜K×1Ñ1¸;Ð1ÓGÓHŠàÒ'Ð'Ð'ð	kÙ-¨lÓ;ˆEð Š=Ü,Ð-WÓXÐXÜñ @˜Eð @¬4°«=×+BÑ+BÈKÐ+BÓ+Xð @Ü"1°'Ó":ð@ç/5˜( FÑ+¸2ñ@ˆð
	Ü—’˜¤b§j¡j´2·9±9Õ&<¼r¿{¹{Õ&JÈEÓRˆBô —’˜2˜s¨W×5Õ5¸Ü—	’	˜&Ô)Ø—‘”Ü—’˜Ÿ™›Ô)÷ 6ñ ˜K×.Ñ.Ô/ØˆJØ�'�?˜>Õ*€DÙ! $¨}Õ(=Ó>€FØ‚~˜ �×,Ñ,¨[×9Ò9Ý=Ý;Ý@ä F¨=Õ$9À&Ç*Á*ÈXÓBVÔWˆð	nÙ*¨4¸µÀ&ÈÕBSÑ`ÐW_Ñ`ˆFô ˜× Ò ä!Ð"NÓOÐOØ€Møô[ ô 	kä,Ð/YÐZ]ÐY^Ð^_Ð-`ÓaÐgjÐjûð	kú÷ 6×5ûô ô 	MÜ—Z’Z × 5Ñ 5¸{Ð 5Ó KÓL‹Fð	Mûð& ô 	`Ü�3‹x˜=Ô(¨C¯H©H¯L©L¸Ó,DÈEÓ,QØñ *¨$°wµÀÈ	ÕARÑ_ÐV^Ñ_�FûØô 	nßØô Ô-¨gÓ6Ô7Ü,Ð/\Ð]`Ð\aÐabÐ-cÓdÐjmÐmûð	núsc   Á.I
 ÃAJ  Ä6AI-ÈJ8 É
I*ÉI%É%I*É-I=	Ê 1J5Ê4J5Ê8MÊ?ALÌMÌMÌ-MÍMr+  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   r¡   r   rÇ   r+  zstr | os.PathLike | Noner
   rö   r   )r   s   "r   r   r   %  s0   € ÷ -Bñ -B˜ð -B¨#ð -BÐ;Sð -BÐ_bñ -Br   c               óæ  € ^ RI Hp ^ RIHpHpHp \        P                  ! 4       \        ,           p^ p V! W\        R\        \        V\        P                  ! 4       ,
          4      4      4      p	V	e)   V	R,          R9  g   \        P                  ! 4       V8¼  d   M^ V! W	4      p
V
'       d   ^ pK~  V
RJ d1   V	R,          R8X  d#   V! WRVR7      p	V	e   V	R,          R8w  d   M^ pK´  V^,          pV^8”  g   KÆ   V	'       d
   V	R,          MRpR Uu/ uF.  qÉ'       g   K  V	P                  V4      '       g   K%  WÉV,          bK0  	  ppVP!                  W±R7       VR9   d   RVR&   M3VR8X  d-   Ve)   \#        \%        V4      4       \#        \'        V4      4       \)        \*        P,                  ! V4      4       VR9   d   ^ # ^#   \         d    \        P                  R	RR
7       Rp
 ELEi ; iu upi )r   )ÚRUNTIME_OFFLINE)Úawait_deliveryÚcancel_queued_deliveryÚowner_holds_deliveryTg        NrÈ   rÉ   ÚclaimedzCould not check live DM ownerr0   Fz*Live Bot Chat owner is no longer available)rk   rl   r¾   )rÈ   rÇ   zWDelivery remains pending or its outcome is unknown. Do not resend; receipt is retained.rÌ   Úsettled)rÉ   r‡  )Úreplyrk   rl   )rÉ   r‡  r¾   )rˆ  rÉ   r‡  )rn   rƒ  rk  r„  r…  r†  rþ   Ú	monotonicÚ_LIVE_WAIT_MAX_SECONDSÚmaxÚminÚ_LIVE_WAIT_SECONDSr6   r7   r8   r?   Úupdater  r/  r   Úprintro   rp   )r¡   rÇ   r+  rƒ  r„  r…  r†  ÚdeadlineÚmissedrW  ÚheldrÈ   Úkeyrq   s   &&$           r   Ú_wait_live_dmr•  %  sÈ  € Ý9ßdÑdä�~Š~ÓÔ"8Õ8€HØ€FØ
Ù ´3°s¼CÔ@RÐT\Ô_c×_mÒ_mÓ_oÕToÓ<pÓ3qÓrˆØŠ>˜V HÕ-Ð5JÔJÌdÏnÊnÓN^ÐbjÔNjØð	Ù'¨Ó5ˆD÷ ØˆFÙØ�5‹=˜V HÕ-°Ô9ñ ,ØÐ)UØ&ô(ˆFð Š~ ¨Õ!1°YÔ!>ØØˆFÙð 	�!�ˆØ�AŽ:Øß!'ˆV�HÖ¨[€FÙ+GÓfÑ+G CË6ÔÐV\×V`ÑV`Ðad×VeÔˆs˜3•KÒÑ+G€GÐfØ‡N�N˜&€NÔ:ØÐ3Ô3Øuˆ�ÒØ	�9Ô	 Ò!4ô 	Ô)¨'Ó2Ô3Üœ˜G›Ô%Ü	Œ$�*Š*�WÓ
ÔØÐ:Ô:ˆ1ÐAÀÐAøôC ô 	Ü�L‰LÐ8À4ˆLÔHØ‹Dð	üò, gs$   ÂG Ä	G.ÄG.Ä8G.Ç$G+Ç*G+c               ó    € V ^8„  d   QhRRRR/# )r	   r  rN   r
   rP   r   )r   s   "r   r   r   U  s   € ÷ Kñ K˜yð K¨[ñ Kr   c           
     ó^  € V '       d
   V ^ ,          MRP                  R^4      R,          P                  R^4      R,          p\        V 4      ^8  g   VR9  g   V ^,          R8w  d   R# ^ RIHpHp \        V! V! \        \        4       4      4      4      4      P                  V ^,          4      # )	r   r†   r!  r‹   rŽ   N)rx   r{   r#  r$  )	r%  rb   r3   rx   r{   r   r   r   r?   )r  r'  rx   r{   s   &   r   Ú_local_delivery_homer˜  U  s�   € ßˆ4�Ž7 ×
*Ñ
*¨4°Ó
3°BÕ
7×
>Ñ
>¸sÀAÓ
FÀrÕ
J€CÜ
ˆ4ƒy�1„}˜Ð#;Ô;¸tÀA½wÈ$¼Ùß:ä‘™¤T¬-«/Ó%:Ó;Ó<Ó=×AÑAÀ$ÀqÅ'ÓJÐJr   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   r+  r   Úcauser   r
   r   )r   s   "r   r   r   ^  s!   € ÷ 2ñ 2 3ð 2¨vð 2¸#ñ 2r   c           
     óX   € \         P                  ! RRR\        V 4      RRV R2RV /4      # )zWThe runner's stdout when a live admission may have happened but its outcome is unknown.rÈ   r¾   rÇ   rk   z Live admission outcome unknown: ú. Do not resend.Úevidence_file)ro   rp   r7  )r+  rš  s   &&r   rS  rS  ^  s:   € ä�:Š:�x ¨m¼_ÈWÓ=UØÐ"BÀ5À'ÐIYÐ ZØ&¨ð1ó 2ð 2r   c               ó    € V ^8„  d   QhRRRR/# )r	   ÚargsrN   r
   z0tuple[Optional[str], str, str, list[str]] | Noner   )r   s   "r   r   r   e  s   € ÷ .ñ .�yð .Ð%Uñ .r   c                ó  € V R,          R.8w  d   R# V R,          Rr!VR,          R.8X  d$   \        V4      ^8  d   R# V^,          VR,          r\        V4      ^8  g   V^ ,          R9  d   R# W!^ ,          V^,          VR,          3# )uØ   Split ``--run-delivery [--author <json>] <mode> <dm_file> <argvâ€¦>`` into
``(author_json, mode, dm_file, argv)``; None when malformed. Stdlib only: the boot-failure
report runs it when no Hermes import is available.ºNé   Nú--run-deliveryNºr¢  NNú--authorºr	   NN)Ústdinú
query-file)rb   )rŸ  Úrestr“   s   &  r   Ú_runner_argvrª  e  s€   € ð ˆB…xÐ$Ð%Ô%ÙØ˜•8˜Tˆ&ØˆB…x�J�<ÔÜˆt‹9�qŒ=ÙØ˜A•w  R¥�Ü
ˆ4ƒy�1„}˜˜Q�Ð'>Ô>ÙØ˜•7˜D �G T¨"¥XÐ-Ð-r   r•   r“   c               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r	   r  rN   r+  r   r’   r+   r•   rP   r“   r]  r
   rö   r   )r   s   "r   r   r   u  s9   € ÷ &!ñ &!˜	ð &!¨Cð &!Àð &!Ø +ð&!Ø<Jð&!ØVYñ&!r   c               ó0  € V'       gu   T;'       g    \        V 4      pVf/   \        P                  P                  \	        V4      4      '       d.    \        WQV4      pTe   \        TR,          TR,          TR7      # V'       g&   \        \        P                  ! RRRR/4      4       ^#  ^ R	IHp T! YB'       g   TMR4      p	\%        WR
7      ;_uu_ 4        \'        VRRR7      ;_uu_ 4       p
\(        P*                  ! W
P-                  4       P/                  R4      RV	R7      P0                  uuRRR4       uuRRR4       \3        V4       #   \         d    p\        \        Y4      4        Rp?^# Rp?i\         d    p\        \        Y4      4        Rp?^# Rp?i\         d    p\        \        Y4      4        Rp?^# Rp?ii ; i  + '       g   i     M; i RRR4       M  + '       g   i     M; i\3        T4       R#   \3        T4       i ; i)zçAdmit local DMs only through the profile authority; retain uncertain intent.

The optional peer stdin transport remains an explicit remote route, never a
fallback after local admission. Background processes wait for delivery only.
Nr•   rÇ   r.  rl   r:  rk   z2No canonical Bot Chat authority; payload retained.)Údelivery_env)r’   rÀ   rd  r  r  F)ÚinputÚcheckÚenv)r˜  rÞ   rî   rm  r/  r€  rC  r�  rU  r9  rO  r6   rS  r•  ro   rp   r–   r­  r(  ro  Ú
subprocessÚrunÚreadr5  Ú
returncoder  )r  r+  r’   r•   r“   r¡   rW  r£   r­  r°  r~  s   &&$$$      r   Ú_run_deliveryrµ  u  s‹  € ÷ Ø×9Ð9Ô3°DÓ9ˆØÒœrŸw™wŸ~™~Ô.?ÀÓ.H×IÒIð
Ü'¨°vÓ>�ð Ò!Ü$ V¨NÕ%;¸VÀMÕ=RÐ\cÔdÐdßÜŒd�jŠj˜(Ð$9¸7ÐDxÐyÓzÔ{Ùð!Ý0á˜6¶z¡<ÀtÓLˆÜ˜D×8Ö8ô �g˜s¨[×9Õ9¸Vä!—~’~ d·+±+³-×2FÑ2FÀwÓ2OÐW\ÐbeÔf×qÑq÷ :Ñ9÷ 9Ñ8ô 	˜Õ øô3 'ô ÜÔ& wÓ4Ô5ÝûÜ-ô ÜÔ*¨7Ó8Ô9ÝûÜô ÜÔ+¨GÓ9Ô:Ýûðú÷ :×9úÐ9÷ 9×8×8Ð8úô 	˜Ö øŒ˜Õ ús   ÁE Â+,H ÃG(Ã.A G	Ä.
G(Ä8
H ÅGÅE3Å3GÆ GÆFÆGÆ(GÆ)GÇGÇGÇG(Ç	H Ç(G8	Ç3H ÈHc               ó0   € V ^8„  d   QhRRRRRRRRR	R
RR/# )r	   r  rN   r+  r   r’   r+   r•   rP   r“   r]  r
   r   )r   s   "r   r   r   ž  s9   € ÷ #ñ #˜Ið #°ð #ÀDð #Ø$/ð#Ø@Nð#ØZ]ñ#r   c               ó  € \         P                  \        \        \        4      P                  4       4      RV'       d   RMRV.pVe4   VP                  R\        \        V4      P                  4       4      .4       VP                  V 4       \         P                  R8X  d!   V Uu. uF  qfP                  RR4      NK  	  ppV'       d   R\        P                  ! VRR	7      .VR
&   \        P                  ! V4      # u upi )z�Build an argv-safe command for the cleanup-owning background runner:
``--run-delivery [--author <json>] <mode> <dm_file> [--profile-home <path>] <argv...>``.r£  r§  r¨  ú--profile-homeÚwin32r!  r‹   r¥  )Ú
separators:é   r»  N)Ú,Ú:)ÚsysÚ
executabler   r   Ú__file__r4  ÚextendÚplatformÚreplacero   rp   ÚshlexrÏ   )r  r+  r’   r•   r“   Úrunner_argvÚparts   &&$$$  r   Ú_delivery_commandrÇ  ž  sÌ   € ô —>‘>¤3¤t¬H£~×'=Ñ'=Ó'?Ó#@ÐBRß(‘7¨l¸GðE€KàÒØ×ÑÐ,¬c´$°|Ó2D×2LÑ2LÓ2NÓ.OÐPÔQØ×Ñ�tÔÜ
‡|�|�wÔñ <GÓG¹;°4—|‘| D¨#Ö.¹;ˆÐGßà&¬¯
ª
°6ÀjÔ(QÐRˆ�CÑÜ�:Š:�kÓ"Ð"ùò	 Hs   Â%C<c               ó<   € V ^8„  d   QhRRRRRRRRRR	R
RRRRRRR/	# )r	   r  rN   r©   r   rÕ   r’   r+   rt   rQ   r*   r   r•   rP   r“   r]  r
   r   )r   s   "r   r   r   ±  s[   € ÷ "Zñ "Z˜)ð "Z¨cð "Z¸#ð "ZÈdð "ZØ*ð"ZØ36ð"ZØFQð"Zà*ð"Zà69ñ"Zr   c               ó*  € \        V4      pVeí    \        WhV4      p	T	eÜ   \        YR	YgR
7      p\
        P                  ! \        Y²YER7      4      p\        T	R,          T	R,          TRR7      pTP                  R4      '       d   TR,          TR&   MUTP                  R4      '       d?   TR,          TR&   TP                  RR4      TR&   TR,          R8X  d   RTR,           2TR&   \
        P                  ! T4      #  \        WW6VR
7      p\        Y²Y„TR7      #   \         d   p
\        YŠ4      u Rp
?
# Rp
?
i\         d6   p
\
        P                  ! RRR\        T4      RRT
 R2RT/4      u Rp
?
# Rp
?
ii ; i  \         d    \        T4       h i ; i)zBCreate a DM file and transfer its cleanup ownership to the runner.NrÈ   r¾   rÇ   rk   z0Live delivery admission could not be confirmed: rœ  r�  F©r’   r•   r“   rˆ   zTDurably queued for the live Bot Chat owner. Do NOT wait or resend; finish your turn.)rÈ   rÇ   rÊ   rÌ   rË   Ú
process_idÚreply_deliveryÚnotificationÚpollz;Durably queued for the live Bot Chat owner. Do NOT resend. rÌ   )r+  rt   r*   )r  r€  r9  rU  r6   ro   rp   r7  rÇ  rÒ   rÑ   r   r?   r  r  )r  r©   rÕ   r’   rt   r*   r•   r“   r+  rW  r£   ÚcommandrÍ  Úresults   &&&$$$$$      r   rž   rž   ±  s£  € ô ˜WÓ%€GØÒð	+Ü# L¸6ÓBˆFð ÒÜ'¨À%ÐVbÔrˆGÜŸ:š:¤o°gÈgÔ&cÓdˆLÜ ¨Õ!1¸vÀmÕ?TÐY^Ø!wôyˆFà×Ñ ×(Ò(Ø/;¸GÕ/D�Ð+Ò,Ø×!Ñ! ,×/Ò/Ø'3°LÕ'A��|Ñ$Ø+7×+;Ñ+;Ð<LÈnÓ+]�Ð'Ñ(ØÐ*Õ+¨vÔ5ð *eÐeqÐrzÕe{Ðd|Ð'}�F˜8Ñ$Ü—:’:˜fÓ%Ð%ðÜ# D¸jÐlrÔsˆô ˜7°7ÐSXÔYÐYøô5 *ô 	2Ü# GÓ1Õ1ûÜô 	+Ü—:’:˜x¨°mÄ_ÐU\ÓE]ØÐKÈCÈ5ÐP`ÐaØ ð*ó +õ +ûð	+ûô* ô Ü˜Ô ØðúsA   ‘D Ã=E: ÄE7Ä$
D4Ä.E7Ä4E7ÅE7Å*E2Å,E7Å2E7Å:FrÇ   c               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )r	   rÏ  r   rÕ   r+  rQ   rÇ   rt   r*   r   r
   r   )r   s   "r   r   r   Ö  sJ   € ÷ @%ñ @%˜Sð @%¨ð @%¸-ð @%Ð]jð @%Ø*ð@%Ø36ð@%Ø;>ñ@%r   c               óŒ  € Rp ^ RI Hp V! V RRV\        \        \        4      P                  4       P                  P                  4      R\        R7      p \        P                  ! V4      p	V	P                  R4      ;'       g    Rp
V	P                  R4      '       d6   \        RV R	V	R,           24      V'       d   V'       g   \        V4       # # # V	P                  R
4      R8X  d>   \        RV R2V'       d   RMR,           4      V'       d   V'       g   \        V4       # # # V
'       g-   \        RV R24      V'       d   V'       g   \        V4       # # # RpV	P                  R4      RJ d%   RV RV
 R2p\        W¥4      '       d
   VR,          pMRV R2p\        P                   ! R
RRT;'       g    V'       d   \#        V4      MRRTRV	P                  R4      RJ d   RMRRVRV
R\%        \&        P&                  ! 4       4      /4      V'       d   V'       g   \        V4       # # #   \        \        3 d    / p	 ELÖi ; i  \(         dQ   p\*        P-                  R TRR!7       \        RT R"T 24      u R#p?T'       d   T'       g   \        T4       # # # R#p?ii ; i  T'       d   T'       g   \        T4       i i i ; i)$a…  Launch the cleanup-owning runner and transfer file ownership on ack. ``dm_file``
is None for relay deliveries (the waiter watches a reply file; envelope artifacts
are owned/swept by ``tools/bot_relay.py``), which pass the envelope id as ``delivery_id``
instead. The ack is ``queued`` + ``delivery_id`` like the live-owner branch: hand-off
to a background process, never a delivery receipt.F)Úterminal_toolT)Ú
backgroundÚnotify_on_completert   ÚworkdirÚ_host_localÚ_completion_output_charsÚ
session_idr†   rk   úDelivery to z failed to start: rÈ   Úpending_approvalzX failed to start: its command needs terminal approval that nobody in this turn can grantzR, so nothing was sent. Approve it (or add it to command_allowlist) and send again.r”   z( failed to start: no process id returnedrÕ  z4Message handed to a background delivery process for z», but THIS session cannot receive completion notifications, so the reply will NOT arrive on its own. Before ending your turn, retrieve the outcome with process(action='wait', session_id='uÐ   ') â€” its output is the reply (relay it, attributed to that agent) or the delivery failure (report it; the message was NOT delivered); if wait returns status=timeout, call wait again until the process exits.z� Its outcome is also saved into this session's transcript as a delivery row when the process exits, so it survives even if the turn ends first.rÍ   uH  : this acknowledges the hand-off to a background delivery process, not a delivery receipt â€” do NOT wait or poll. Finish your turn now; that process's completion notification carries the delivery outcome â€” the reply (relay it then, attributed to that agent) or the delivery failure (report it; the message was NOT delivered).rÉ   rÇ   rÊ   rÌ  rÎ  rÍ  rÌ   rË  Ú	queued_atz'message_agent delivery spawn failed: %sr0   z could not be started: N)Útools.terminal_toolrÓ  r   r   rÀ  r4  rw  ÚREPLY_COMPLETION_CHARSro   rÒ   Ú
ValueErrorÚ	TypeErrorr?   rr   r  Ú_persist_reply_when_donerp   r7  rö   rþ   r6   r7   rk   )rÏ  rÕ   r+  rÇ   rt   r*   ÚtransferredrÓ  rÖ   ÚparsedÚproc_idrÌ   r£   s   &&$$$$       r   rÑ   rÑ   Ö  s¸  € ð €Kð8%Ý5á˜G°ÈÐW^Ü$'¬¬X«×(>Ñ(>Ó(@×(GÑ(G×(NÑ(NÓ$OÐ]aÜ5KôMˆð	Ü—Z’Z “_ˆFð —*‘*˜\Ó*×0Ð0¨bˆØ�:‰:�g×ÒÜ˜, u gÐ-?ÀÀwÅÐ?PÐQÓR÷V Ÿ;Ü˜GÕ$ð 'ˆ7ðU �:‰:�hÓÐ#5Ô5ô ˜, u gð .1ð 1ç\cñ5YØilõnó o÷N Ÿ;Ü˜GÕ$ð 'ˆ7÷I Ü˜, u gÐ-UÐVÓW÷F Ÿ;Ü˜GÕ$ð 'ˆ7ðC ˆØ�:‰:Ð*Ó+¨uÓ4ð MÈUÈGð T%ð &- Ið .aðaˆFô (¨×7Ò7Øð aõ b�øð ,¨E¨7ð 3Yð YˆFô
 �zŠzØ�hØ˜;×WÐWÇw¬?¸7Ô+CÐTVØ�%Ø¨¯
©
Ð3GÓ(HÈEÓ(Q™fÐWeØ�fØ˜'ØœœTŸYšY›[Ó)ð
ó ÷ Ÿ;Ü˜GÕ$ð 'ˆ7øô_ œIÐ&ô 	Ø‹Fð	ûôV ô HÜ�‰Ð>ÀÈdˆÔSÜ�l 5 'Ð)@ÀÀÐFÓGÔGçŸ;Ü˜GÕ$ð 'ˆ7ûð	Hû÷ Ÿ;Ü˜GÕ$ð 'ˆ7úsŒ   „AI ÁH, Á,I ÂI ÂI Ã5I Ä&I Ä.I ÅAI Æ7I Ç AI È,IÈ?I ÉIÉI ÉJ!É(JÉ9J!É:J$ ÊJ!Ê!J$ Ê$KÊ5Kc               ó$   € V ^8„  d   QhRRRRRR/# )r	   rä  r   r*   r   r
   r+   r   )r   s   "r   r   r     s!   € ÷ !ñ ! cð !°#ð !¸$ñ !r   c                ó6  a aaaa€ ^ RI Ho \        VRR4      \        VRR4      uooSP                  S 4      oSe%   S'       d   \	        \        SRR4      4      '       g   R# R VVV VV3R llp\
        P                  ! VR	S  2R
R7      P                  4        R
# )ua  #101142 durable leg. A non-push sender (api_server, one-shot runner) gets no completion
notification, so once the tracked runner exits its stdout â€” the recipient's reply or the
delivery failure â€” is appended to the sender's session transcript as a DELIVERY row
(``display_kind="process_complete"``, the shape push surfaces persist for the same
completion; mirrors gateway.wake.persist_delegation_delivery). A sender that already read
the outcome via process(action='wait'/'log') is not told twice. Returns False (nothing
armed) when the sender has no session transcript or the process is not tracked here.)Úprocess_registryÚ_session_dbNrÙ  Úappend_messageFc               ó   € V ^8„  d   QhRR/# )r	   r
   r  r   )r   s   "r   r   Ú._persist_reply_when_done.<locals>.__annotate__(  s   € ÷ 5ñ 5�$ñ 5r   c            
     ó\  <€ ^ RI Hp Hp SP                  P	                  4        SP                  S4      '       d   R# RRRS/SP                  SR4      Cp SP                  SRV ! V4      RR	V! V.4      /R
7       R#   \         d$   p\        P                  RSST4        Rp?R# Rp?ii ; i)r   )Úformat_process_notificationÚprocess_completion_display_textNr   Ú
completionrÙ  ÚexitedÚuserÚprocess_completeÚdisplay_text)r©   Údisplay_kindÚdisplay_metadatazDmessage_agent: could not persist the reply of %s into session %s: %s)Ú$tools.process_registry_notificationsrí  rî  Ú_completion_eventÚwaitÚis_completion_consumedÚ_exit_snapshotré  r6   r7   Úwarning)	rí  rî  Úevtr£   ÚdbÚprocrä  rç  rÙ  s	       €€€€€r   Ú_runÚ&_persist_reply_when_done.<locals>._run(  s»   ø€ ÷	
ð 	×Ñ×#Ñ#Ô%Ø×2Ñ2°7×;Ò;ÙØ�| \°7ÐnÐ>N×>]Ñ>]Ð^bÐdlÓ>mÐnˆð	5Ø×Ñ˜j¨&Ñ:UÐVYÓ:ZØ+=Ø0>Ñ@_ÐadÐ`eÓ@fÐ/gð ö iøô ô 	5Ü�N‰NÐaØ" J°÷5ò 5ûð	5ús   Á%A= Á=B+ÂB&Â&B+zmessage-agent-reply-T)r!   r   Údaemon)Útools.process_registryrç  r2   r?   rß   Ú	threadingÚThreadÚstart)rä  r*   rÿ  rý  rþ  rç  rÙ  s   f& @@@@r   rá  rá    sˆ   ü€ õ 8ä˜U M°4Ó8¼'À%ÈÐW[Ó:\€N€Bˆ
Ø×Ñ Ó(€DØ‚|Ÿ:¬X´g¸bÐBRÐTXÓ6Y×-ZÒ-ZÙ÷5ô 5ô" ×Ò˜DÐ)=¸g¸YÐ'GÐPTÔU×[Ñ[Ô]Ùr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r	   Ú
reply_pathr   rÕ   Úbudget_secondsr
   rö   r   )r   s   "r   r   r   =  s(   € ÷ ñ  ð ¨Sð À#ð È#ñ r   c           	     ó0  €  \         P                   ! 4       \        V4      ,           p\         P                   ! 4       T8  Ed   \        P                  P                  T 4      '       dà   \        T RR7      ;_uu_ 4       p\        P                  ! T4      pRRR4       XP                  R4      '       d`   \        TP                  R4      ;'       g    R4      P                  4       pT'       d   RT R2MRp\        R	T R
T RTR,           24       ^# \        RT R24       \        TP                  R4      ;'       g    R4       ^ # \         P                  ! R4       EK8  \        RT RT R24       ^#   \         d     ^# i ; i  + '       g   i     Lú; i)ab  The relay reply waiter (``tools/bot_relay.waiter_command``): block until the sender-side
reply file exists, print it as the completion notification the sender wakes on, exit 1 on a
delivery error or when the budget runs out. Stdlib only: this runs as a background process
from any bot turn, and the sender's completion notification is exactly its stdout.rd  r  Nrk   rl   r†   z
 [reason: Ú]rÚ  z failedz: zReply from r½  r‰  z(empty reply)g      Ð?zNo reply from z within zYs. The message may still be delivered when the Desktop reconnects; do not resend blindly.)rþ   rõ   rß  rÞ   rî   rm  ro  ro   Úloadr?   r   r_   r�  Úsleep)r  rÕ   r  r‘  Úfhrú   ÚcodeÚtags   &&&     r   Ú_wait_reply_mainr  =  s=  € ð
Ü—9’9“;¤ ~Ó!6Õ6ˆô �)Š)‹+˜Õ
 Ü�7‰7�>‰>˜*×%Ò%Ü�j¨;×7Õ7¸2Ü—I’I˜b“M�÷ 8à�u‰u�W�~Š~ô ˜1Ÿ5™5 ›?×0Ð0¨bÓ1×7Ñ7Ó9�ß.2˜
 4 &¨Ñ*¸�Ü˜ U G¨7°3°%°r¸!¸G½*¸ÐFÔGÙÜ�K ˜w aÐ(Ô)Ü�!—%‘%˜“.×3Ð3 OÔ4Ùä�
Š
�4×Ü	ˆN˜5˜' ¨.Ð)9ð :;ð ;ô <áøô) ô Úðú÷ 8×7ús   ‚%E3 Á<FÅ3FÆFÆF	c               ó    € V ^8„  d   QhRRRR/# )r	   rŸ  rN   r
   rö   r   )r   s   "r   r   r   [  s   € ÷ ñ ˜ð  sñ r   c                óþ  € V R,          R.8X  d#   \        V 4      ^8X  d   \        V R,          !  # ^# \        V 4      pVf   ^# Vw  r#rERpVe   ^ RIHp V! V4      pVf   ^#  Rp\        V4      ^8¼  d)   V^ ,          R8X  d   \        V^,          4      VR,          rX\        WTVR8H  W†R	7      #   \         dD   p	^ R
IH	p
 \        \        P                  ! R\        T	4      RT
! T	4      /4      4        Rp	?	^# Rp	?	ii ; i)zŒRunner entry for the argv ``_delivery_command`` and ``bot_relay.waiter_command`` build.
Malformed argv exits 2 without touching the DM file.r¡  z--wait-replyr¤  N)Úparse_turn_authorr¸  r¦  r§  rÊ  )Údelivery_failure_reasonrk   rl   )rb   r  rª  r�   r  r   rµ  r6   rn   r  r�  ro   rp   r   )rŸ  rã  Úauthor_jsonrÜ   r+  r  r“   r  r•   r£   r  s   &          r   Ú_delivery_mainr  [  só   € ð ˆB…x�NÐ#Ô#Ü.1°$«i¸1¬nÔ  b¥Ñ*ÐCÀ!ÐCÜ˜$Ó€FØ‚~ÙØ'-Ñ$€K�wØ€FØÒÝ7á" ;Ó/ˆØŠ>ÙðØˆÜˆt‹9˜Œ>˜d 1�gÐ)9Ô9Ü!% d¨1¥g£°°Rµ˜$Ü˜T°t¸w±ÐUaÔqÐqøÜô õ 	FäŒd�jŠj˜'¤3 s£8¨XÑ7NÈsÓ7SÐTÓUÔVÝûðús   Á#A
B. Â.C<Â98C7Ã7C<c               ó    € V ^8„  d   QhRRRR/# ©r	   r*   r   r
   r   r   )r   s   "r   r   r   }  s   € ÷ ñ �sð ˜sñ r   c           	     ó6  € \         P                  ! \        4      ;_uu_ 4        \        \        V RR4      RR4      pV'       d)   \	        \        V4      P                  4      uuRRR4       #  RRR4       \        4       #   + '       g   i     \        4       # ; i)zCThe calling agent's OWN home (session-db derived), not ambient env.rè  NÚdb_path)rÿ   r   r6   r2   r   r   rw  r   )r*   r  s   & r   r5   r5   }  sl   € ä	×	Ò	œY×	'Õ	'Üœ' %¨¸Ó=¸yÈ$ÓOˆßÜ”t˜G“}×+Ñ+Ó,÷ 
(Ò	'à÷ 
(ô ‹?Ð÷	 
(Ö	'ô ‹?Ðús   £>A?Á?B	c               ó    € V ^8„  d   QhRRRR/# r  r   )r   s   "r   r   r   †  s   € ÷ ñ ˜#ð  #ñ r   c                ó¾  € \        \        V R R4      ;'       g    R4      P                  4       pV'       d   V# \        P                  ! \
        4      ;_uu_ 4        \        V RR4      \        V RR4      r2V'       dE   V'       d=   \        VP                  V4      ;'       g    R4      P                  4       uuRRR4       # RRR4       R#   + '       g   i     R# ; i)Ú_session_title_hintr†   rè  NrÙ  )r   r2   r_   rÿ   r   r6   Úget_session_title)r*   ÚtitleÚsdbÚsids   &   r   r4   r4   †  s¡   € Ü”˜Ð4°bÓ9×?Ð?¸RÓ@×FÑFÓH€EßØˆÜ	×	Ò	œY×	'Õ	'Ü˜5 -°Ó6¼ÀÀ|ÐUYÓ8ZˆSß—3Ü�s×,Ñ,¨SÓ1×7Ð7°RÓ8×>Ñ>Ó@÷ 
(×	'Ò	'ñ ÷	 
(Ö	'ñ ús   Á)CÂCÂ"CÃC	Ú__main__:r¢  r	   Nr£  Ú
relaunchedFr¤  zGthe delivery runner could not activate Hermes dependencies (see stderr)i€Q i  rV   )r†   r†   NN)Wr?  Ú
__future__r   rÿ   r2  ro   ÚloggingrÞ   ÚrerÄ  rå   r±  r¾  rà   r  rþ   Úpathlibr   Útypingr   r   Ú	getLoggerr;  r7   r%   r&   rÞ  râ   Ú_DM_STALE_SECONDSrŽ  r‹  Úcompilerš   r    r   r'   r9   rK   rf   rr   r³   rŸ   rð   r  r  r  r(  r/  r7  ÚRuntimeErrorr9  rC  rO  rU  r[  r€  r•  r˜  rS  rª  rµ  rÇ  rž   rÑ   rá  r  r  r5   r4   rî   Úinsertr   rÀ  r4  rw  r  Úhermes_bootstrapr6   Ú
SystemExitr£   r2   r>   r  Úbootedrã  rm  r�  r   r   r   Ú<module>r1     sþ  ðñõ #ã Û Û Û Û 	Û 	Û Û Û Û 
Û Û Û Ý ß  ð
 
×	Ò	˜8Ó	$€à)Ð ð Ð ð +¨TÕ1Ð ð €Ø Ð ØÐ ð !Ð ð —*’*Ð]Ó^€à—:’:ÐAÓBÐ õ*õ
5õpõ"÷<8ð(°Tð ÐUY÷ ÷`mõF-õ`ð" 1BÀDÕ0Hñ XÐae÷ Xð Xõ&õ
õ Kõ(-õ
Mô% ô %ôÐ4ô õlõ
.õd÷<ð~-BÐVZ÷ -Bõ`Kõ2õ.ð &!Ø.2ð&!ØMQ÷&!ðR#Ø26ð#ØQU÷#ð&"ZØTXð"Zà-1÷"ZðJ@%È$ð @%Ðmq÷ @%õF!õHõ<õDõð ˆzÔð ‡H�H‡O�O�A‘s™4 ›>×1Ñ1Ó3×:Ñ:×AÑAÓBÔCð ‡x�x�…}Ð)Ð*Ô*ð	Û#ñ ‘^ C§H¡H¨R¥LÓ1Ó
2Ð2ñ+ øð ˜:Ð&ô 
	ñ
 ˜S ,°Ó6×hÐh¹:ÀcÈ:Ó;V×;gÐ;gÐ_b×_gÑ_gÔ[gˆFÙ! #§(¡(¨2¥,Ó/ˆFßŸf¨¯©¯©Ñ8IÈ&ÐQRÍ)Ó8T×)UÒ)UÙÑ+¨F°1­Ið 8Zó [ô \àûð
	ús0   ÈH2 È2	K"È;!KÉ2KÊKÊ-KËKËK"