+
    lHàjE ã                   óF  € R t ^ RIt^RIHtHt ]! 4       t]P                  t]P                  tRt	Rt
R R ltR R ltR	 R
 ltR R ltR{R R lltR R ltR R ltR|R ltR R ltR}RR/R R llltR}R lt0 R~mtR tR tR tR tR  R! ltR"tR# R$ ltR% tR& R' ltR( R) lt RR* lt!R}R+ lt"R€t#R,t$R-t%R. R/ lt&R0 R1 lt'R2 R3 lt(R4 t)^ R5I*H+t, ]! R64      R7 R8 l4       t-]! R94      R: R; l4       t-]! R<4      R= R> l4       t-]! R?4      R@ RA l4       t-]! RB4      RC RD l4       t-]! RE4      RF RG l4       t-]! RH4      RI RJ l4       t-]! RK4      RL RM l4       t-]! RN4      RO RP l4       t-]! RQ4      RR RS l4       t-]! RT4      RU RV l4       t-]! RW4      RX RY l4       t-]! RZ4      R[ R\ l4       t-]! R]4      R^ R_ l4       t-]! R`4      Ra Rb l4       t-]! Rc4      Rd Re l4       t-Rf Rg lt.Rh t/Ri t0Rj Rk lt1Rl Rm lt2Rn Ro lt3RpRRqRRrR/Rs lt4Rt t5R�t6Rut7Rv t8Rw Rx lt9Ry Rz lt:R# )‚z¶Prompt / attachment / respond JSON-RPC handlers.

Bodies are rebound onto server.py's globals at install time (see
method_ctx.bind_module), so they reference server.py globals bare.
N)ÚHandlerRegistryÚbind_modulez3target user message is no longer in session historyzBCould not verify this group. Try again after the gateway recovers.c                ó0   € V ^8„  d   QhR\         R\         /# )é   ÚhistoryÚreturn)Úlist)Úformats   "Ú?/home/ubuntu/.hermes/hermes-agent/tui_gateway/methods_prompt.pyÚ__annotate__r      s   € ÷ Zñ Z¤4ð Z¬Dñ Zó    c                óp   € ^ RI Hp \        V 4       UUu. uF  w  r#V! V4      f   K  VNK  	  upp# u uppi )zCIndices of canonical live-user turns, including composite carriers.©Úuser_originated_turn_view)Úagent.context_compressorr   Ú	enumerate)r   r   ÚiÚms   &   r
   Ú_history_user_indicesr      s0   € åBÜ# GÔ,ÔYÑ,‘$�!Ñ0IÈ!Ó0L�AˆAÑ,ÒYÐYùÓYs   •2¨2c                ó$   € V ^8„  d   QhR\         /# )r   Úmsg©Údict)r	   s   "r
   r   r      s   € ÷ ñ œñ r   c                óü   € V P                  R4      pVf   V P                  R4      p\        P                  ! \        \        4      ;_uu_ 4        Vf   RM
\        V4      uuRRR4       #   + '       g   i     R# ; i)zRDurable SQLite row id from a history entry (``_row_id`` else ``row_id``), or None.Ú_row_idNÚrow_id)ÚgetÚ
contextlibÚsuppressÚ	TypeErrorÚ
ValueErrorÚint)r   Úraws   & r
   Ú_message_row_idr#      sU   € à
�'‰'�)Ó
€CØ
‚{Ø�g‰g�hÓˆÜ	×	Ò	œY¬
×	3Õ	3Ø’{‰t¬¨C«÷ 
4×	3×	3Ñ	3áús   ÁA*Á*A;	c                ó$   € V ^8„  d   QhR\         /# ©r   r   ©Úbool)r	   s   "r
   r   r   $   s   € ÷ Mñ M¬ñ Mr   c                ó   € \        V \        4      '       d   \        V\        4      '       g   R# V P                  R4      VP                  R4      8w  d   R# V P                  R4      R8X  dà   ^ RIHp ^ RIHp V! V 4      pV! V4      pVRJ VRJ 8w  d   R# Vf6   \        V P                  R4      4      \        VP                  R4      4      8H  # VP                  R4      pVP                  R4      p\        V\        4      '       dD   \        V\        4      '       d.   V! V4      P                  4       V! V4      P                  4       8H  # R	# \        V P                  R4      4      \        VP                  R4      4      8H  # )
zïTrue when a live-memory entry plausibly corresponds to a durable row: roles and
display-marker status must match (a marker shifts every later position) and an
addressable user turn must show the same text (multimodal: role/marker suffice).FÚroleÚuserr   ©Úsanitize_contextNÚdisplay_kindÚcontentT)
Ú
isinstancer   r   r   r   Úagent.memory_contextr,   r'   ÚstrÚstrip)ÚmemÚdb_msgr   r,   Úmem_viewÚdb_viewÚmem_contentÚ
db_contents   &&      r
   Ú_mem_db_pair_agreesr9   $   s.  € ô �cœ4× Ò ¬
°6¼4×(@Ò(@ÙØ
‡w�wˆvƒ˜&Ÿ*™* VÓ,Ô,ÙØ
‡w�wˆvƒ˜&Ô ÝFÝ9Ù,¨SÓ1ˆÙ+¨FÓ3ˆØ˜Ð '¨T /Ô2ÙØÒÜ˜Ÿ™ Ó/Ó0´D¸¿¹ÀNÓ9SÓ4TÑTÐTØ—l‘l 9Ó-ˆØ—[‘[ Ó+ˆ
Ü�k¤3×'Ò'¬J°zÄ3×,GÒ,GÙ# KÓ0×6Ñ6Ó8Ñ<LÈZÓ<X×<^Ñ<^Ó<`Ñ`Ð`ÙÜ�—‘˜Ó'Ó(¬D°·±¸NÓ1KÓ,LÑLÐLr   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r   Útarget_row_id)r   r!   )r	   s   "r
   r   r   =   s   € ÷ 
Eñ 
E¤tð 
E¼Cñ 
Er   c                óX   a a€ \        V V3R l\        \        S 4      4       4       R4      # )um  ``(user_ordinal, history_index)`` for ``target_row_id``, or None.

Exact ``_row_id`` matches only. An id absorbed into a merge carrier must NOT
resolve here: the carrier's own index cuts the whole merged pair away, but a
rewind aimed at the absorbed row has to retain the carrier's earlier half â€”
that mapping is `_resolve_truncate_row_id`'s durable-prefix path.
c              3   ó`   <"  € T F#  w  r\        SV,          4      S8X  g   K  W3x € K%  	  R # 5i©N©r#   )Ú.0Úu_ordÚh_idxr   r;   s   &  €€r
   Ú	<genexpr>Ú,_find_user_turn_by_row_id.<locals>.<genexpr>F   s/   øé € ð 	>Ñ,U™L˜EÜ˜G E�NÓ+¨}Ñ<ô 
ˆ%�Ó,Uùs   ƒ.£.N)Únextr   r   )r   r;   s   ffr
   Ú_find_user_turn_by_row_idrF   =   s.   ù€ ô õ	>¬IÔ6KÈGÓ6TÔ,Uó 	>Ø?CóEð Er   Ú Tc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   ÚsessionÚfallback_sidÚrepair_alternation)r   r1   r'   )r	   s   "r
   r   r   J   s$   € ÷ :ñ :Üð:Ü!$ð:Ü?Cñ:r   c                ó´  € \        V 4      ;'       g    \        T;'       g    R4      pV'       g   . #  \        V 4      ;_uu_ 4       p\        VRR4      p\	        V4      '       g    RRR4       R# V! W2RR7      pRRR4       \        X\        4      '       d   T# R#   + '       g   i     L*; i  \
         d    \        P                  RTRR7        R# i ; i)zOLoad the durable live-replay transcript, or None when it cannot be proven safe.rG   Úget_messages_as_conversationNT)rK   Úinclude_row_idsz<prompt.submit: failed loading durable history for session %s©Úexc_info)
Ú_submit_row_target_keyr1   Ú_session_dbÚgetattrÚcallableÚ	ExceptionÚloggerÚdebugr/   r   )rI   rJ   rK   Úsession_keyÚdbÚget_convr   s   &&&    r
   Ú _load_durable_truncation_historyr[   J   sÊ   € ô )¨Ó1×LÐL´S¸×9KÐ9KÈÓ5L€KßØˆ	ðÜ˜×!Ô! RÜ˜rÐ#AÀ4ÓHˆHÜ˜H×%Ò%Ø÷ "Ñ!ñ ØÐTXôZˆG÷	 "ô ! ¬$×/Ò/ˆ7Ð9°TÐ9÷ "×!ûô ô Ü�‰ØJÈKØð 	ô 	ò ð	ús;   ´B0 Á BÁ'B0 Á1
BÁ;B0 ÂB-	Â(B0 Â-B0 Â0#CÃCc                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   rI   r   r;   )r   r   r!   )r	   s   "r
   r   r   b   s&   € ÷ Eñ E¤dð E´Tð EÌ#ñ Er   c                ó¢  € \        W4      ;pe   V# \        V RR7      pVf   R# \        V4      \        V4      8X  d–   \        ;QJ d%    R \	        W4       4       F  '       d   K   RM	  RM! R \	        W4       4       4      '       dJ   \	        W4       F)  w  rV\        V4      ;pf   K  \        V4      e   K%  WuR&   K+  	  \        W4      ;pe   V# \        WB4      ;pf   R# Vw  rš\        V4      pV	\        V4      8  d0   \        WV	,          ,          WJ,          4      '       d   W›V	,          3# \        V4       F‰  w  rÍW,          pVP                  R4      ;'       g    R Uu. uF  p\        V\        4      '       g   K  VNK  	  ppV\        V4      8w  d
   VV9  d   Kh  \        WäV
,          4      '       g   K‚  WÍVRV
 3u # 	  R# u upi )	u�  Resolve ``truncate_before_row_id`` against the live list: a
``(user_ordinal, history_index)`` pair, or â€” when the target is a durable
row absorbed into a repaired live carrier â€” a triple appending the
physical ``durable_prefix`` to cut from. None refuses (fail closed);
a client-supplied ordinal is never trusted as a fallback.

Prefer in-memory ``_row_id`` / ``row_id`` stamps. When a live turn rewrote ``session["history"]``
without stamps (provider-format messages), load the session's durable transcript with
``include_row_ids=True`` and map the matched user-turn ordinal onto the live list. See #82959.

A cold resume/reload materializes the live history with ``repair_alternation=True``, so the
live list is the REPAIRED projection of the physical rows: a user;user run is merged into
its first row and the absorbed rows' ids have no live ordinal. When the physical target row
lives inside such a merged carrier, resolving to the carrier's own index would cut the whole
pair (losing the unanswered earlier half); instead the durable prefix â€” the physical rows
strictly before the target â€” is returned so the cut keeps the inner row boundary (#94486).
NF©rK   c              3   ó<   "  € T F  w  r\        W4      x € K  	  R # 5ir>   )r9   )r@   r3   r4   s   &  r
   rC   Ú+_resolve_truncate_row_id.<locals>.<genexpr>„   s    é € ð /ZÙ@X±°Ô ×,Ð,Ó@Xùs   ‚Tr   Ú_absorbed_row_ids© )rF   r[   ÚlenÚallÚzipr#   r   r9   r   r   r/   r!   Ú _merge_carrier_holds_target_text)rI   r   r;   ÚhitÚ
db_historyr3   r4   Údb_ridÚdb_hitÚdb_ordÚdb_idxÚmem_user_indicesrA   rB   ÚcarrierÚridÚabsorbed_idss   &&&              r
   Ú_resolve_truncate_row_idrq   b   sË  € ô$ )¨Ó@Ð@ˆÒMØˆ
ô 2°'ÈeÔT€JØÒÙô
 ˆ:ƒœ#˜g›,Ô&¯3«3ñ /ZÜ@CÀGÔ@Xó/Z¯3¯3ª3ñ /ZÜ@CÀGÔ@Xó/Z÷ ,Zò ,Zä˜wÖ3‰KˆCÜ)¨&Ó1Ð1�Ô>Ä?ÐSVÓCWÔC_Ø!'�I“ñ 4ô -¨WÓDÐDˆCÒQØˆJÜ+¨JÓFÐFˆÒOÙØ�N€FÜ,¨WÓ5ÐØ”Ð$Ó%Ô%Ô*=Ø VÕ,Õ-¨zÕ/A÷+Cò +Cð ¨Õ/Ð/Ð/ô "Ð"2Ö3‰ˆØ•.ˆØ(/¯©Ð4GÓ(H×(NÐ(NÈBÐ(Nó 1Ñ(N Ü% c¬3×/÷ ˜Ñ(Nˆð 1àœO¨GÓ4Ô4¸ÈlÔ9ZÙÜ/°ÀFÕ9K×LÒLÙØ˜Z¨¨Ð0Ð0Ò0ñ 4ñ ùò1s   Å'GÆGc                ó<   € V ^8„  d   QhR\         R\         R\        /# )r   rn   r4   r   )r   r'   )r	   s   "r
   r   r   ª   s!   € ÷ ?ñ ?¬dð ?¼Dð ?ÄTñ ?r   c                ón  € ^ RI Hp ^ RIHp V! V 4      pV! V4      pVe   Vf   R# VP	                  R4      pVP	                  R4      p\        V\        4      '       d   \        V\        4      '       g   R# V! V4      P                  4       pV! V4      P                  4       p	W˜8H  ;'       g	    RV	 2V9   # )ay  True when the live merge *carrier* plausibly holds the durable target row's
text. ``_merge_consecutive_users`` joins a user;user run with ``"\n\n"`` (an
empty side drops out), so the target's sanitized text either IS the carrier's
content or appears in it as a whole ``"\n\n"``-delimited part. Both views are
user-originated by construction (the caller only visits user turns).r   r+   Fr.   z

)r   r   r0   r,   r   r/   r1   r2   )
rn   r4   r   r,   r5   r6   r7   r8   Úmem_textÚdb_texts
   &&        r
   rf   rf   ª   s«   € õ CÝ5Ù(¨Ó1€HÙ'¨Ó/€GØÒ˜7š?ñ Ø—,‘,˜yÓ)€KØ—‘˜YÓ'€JÜ�{¤C×(Ò(¬Z¸
ÄC×-HÒ-Hñ Ù Ó,×2Ñ2Ó4€HÙ˜zÓ*×0Ñ0Ó2€GØÑ×>Ð> D¨¨	Ð"2°hÑ">Ð>r   c                óö   € \        V\        4      '       g@   \        P                  ! \        \
        4      ;_uu_ 4        \        V4      R3uuRRR4       # R\        V RV R24      3#   + '       g   i     L"; i)zœ``(int_value, error_response)`` for a client integer param.  bool is refused like
any non-integer: JSON ``true`` would int() to 1 and aim at the wrong turn.Né¤  z must be an integer)r/   r'   r   r   r   r    r!   Ú_err)ro   ÚvalueÚ
param_names   &&&r
   Ú_coerce_truncate_intr{   Ã   s]   € ô �eœT×"Ò"Ü× Ò ¤¬J×7Õ7Ü�u“:˜tÐ#÷ 8Ò7à”�c˜4 J <Ð/BÐ!CÓDÐDÐD÷ 8×7ús   ¾A(Á(A8	c                ó0   € V ^8„  d   QhR\         R\        /# )r   rI   r   )r   r1   )r	   s   "r
   r   r   Ì   s   € ÷ ñ ¤Tð ¬cñ r   c           
     óò  € \        V P                  R4      ;'       g    R4      pV'       g   R#  \        4       P                  R4      p\        V\        4      '       d"   \        VP                  RR4      4      '       g   R#   \        T 4      ;_uu_ 4       pTf   RMTP                  TRR7      pRRR4       . pX;'       g    R FÎ  pTP                  R4      ;'       g    RP                  4       P                  RR4      p\        T4      ^x8”  d   TR,          R,           pTP                  R4      ;'       g    RpTP                  R4      R8X  d   RMRp	T'       d   TP                  RT RT	 RT R24       K¶  TP                  RT RT	 R24       KÐ  	  RP                  T4      #   \         d     R# i ; i  + '       g   i     EL; i  \         d    \        P                  R	R
R7        R# i ; i)u¢   Note block for reactions since the last turn (model input only, announced once â€”
rows are stamped ``seen`` on read), or "".  Gated on display.message_reactions.rX   rG   ÚdisplayÚmessage_reactionsFNr*   )Úauthorz Failed to read pending reactionsTrO   ÚtextÚ
Ú :Néx   Nu   â€¦Úemojir)   z	their ownÚyourz[The user reacted z to z message: "z"]z earlier message]rb   )r1   r   Ú	_load_cfgr/   r   r'   rU   rR   Útake_unseen_reactionsrV   rW   r2   Úreplacerc   ÚappendÚjoin)
rI   rX   r~   rY   ÚpendingÚnotesÚentryÚsnippetr…   Úwhoses
   &         r
   Ú_pending_reaction_notesr‘   Ì   s¾  € ô �g—k‘k -Ó0×6Ð6°BÓ7€KßÙðÜ“+—/‘/ )Ó,ˆÜ˜7¤D×)Ò)¬d°7·;±;Ð?RÐTYÓ3Z×.[Ò.[Ùð /\ðÜ˜×!Ô! RØ šj‘d¨b×.FÑ.FÀ{Ð[aÐ.FÓ.bˆG÷ "ð
 €EØ—�˜B’ˆØ—9‘9˜VÓ$×*Ð*¨×1Ñ1Ó3×;Ñ;¸DÀ#ÓFˆÜˆw‹<˜#ÔØ˜d•m eÕ+ˆGØ—	‘	˜'Ó"×(Ð( bˆØ$Ÿy™y¨Ó0°FÔ:‘ÀˆßØ�L‰LÐ-¨e¨W°D¸¸¸{È7È)ÐSUÐVÖWð �L‰LÐ-¨e¨W°D¸¸Ð?PÐQÖRñ ð �9‰9�UÓÐøô) ô Úðú÷ "×!Ð!ûäô Ü�‰Ð7À$ˆÔGÚðúsB   °AF* ÂG ÂF<Â1G Æ*F9Æ8F9Æ<G	ÇG ÇG Ç"G6Ç5G6Úemitc                ó0   € V ^8„  d   QhR\         R\         /# )r   r’   r   r&   )r	   s   "r
   r   r   ï   s   € ÷ ñ ¼ð Ìñ r   c               óP  € \        V \        4      '       d   \        V4      '       g   R#  ^ RIHp V! V 4      '       g   R#  \        TRRR7       T'       d   \        RRRR	R/4       \        P                  R
4       R#   \
         d    \        P                  RRR7        R# i ; i)ag  End *sid*'s voice chat when *text* is a bare stop phrase TYPED while its voice mode is on
(typed twin of the spoken stop phrase) -> True; False for a normal message. *emit* sends the
``voice.transcript`` stop event to the voice client; the canonical ``prompt.submit`` path
(``gateway/session_controls.py``) answers its submitter in the reply instead (TUI-26).F)Úis_voice_stop_phrasez3typed stop-phrase check failed; submitting the textTrO   )Ú	stop_loopÚstop_ttszvoice.transcriptÚstop_phraseÚtypedu5   prompt.submit: typed stop phrase â€” voice chat ended)r/   r1   Ú_session_voice_enabledÚtools.voice_mode_transcriptr•   rU   rV   rW   Ú_end_session_voice_chatÚ_voice_emitÚinfo)r�   Úsidr’   r•   s   &&$ r
   Ú_consume_typed_stop_phraser    ï   s˜   € ô
 �tœS×!Ò!Ô&<¸S×&AÒ&AÙðõ 	EÙ# D×)Ò)Ùð *ô
 ˜C¨4¸$Õ?ßÜÐ&¨¸¸gÀtÐ(LÔMÜ
‡K�KÐGÔHÙøô ô Ü�‰ÐJÐUYˆÔZÚðús   «A? Á?"B%Â$B%c                óD   € \        W4      '       d   \        V RR/4      # R# )z«RPC reply ending the voice chat when a bare stop phrase is TYPED while the session's voice
mode is on (typed twin of the spoken stop phrase), or None for a normal message.Úvoice_stoppedTN)r    Ú_ok)ro   r�   rŸ   s   &&&r
   Ú_typed_stop_phrase_responser¤   	  s'   € ô 1KÈ4×0UÒ0UŒ3ˆs�_ dÐ+Ó,Ð_Ð[_Ð_r   c                óô  a€ VP                  R4      R8w  d   \        V RR4      # \        S\        4      ;'       d§    \	        V4      ;'       d”    \        S4      \        8H  ;'       dz    \        ;QJ d+    V3R l\        R0,
           4       F  '       d   K   RM 	  RM! V3R l\        R0,
           4       4      ;'       d     \        SP                  R4      \        4      pV'       d   R	# \        V RR
4      # )zBValidate the hosted-room turn proof carried by an internal submit.ÚsourceÚbot_roomi  z,hosted room turns require a bot_room sessionc              3   ó„   <"  € T F5  p\        SP                  V4      \        4      ;'       d
    SV,          x € K7  	  R # 5ir>   )r/   r   r1   )r@   ÚfÚhosted_tasks   & €r
   rC   Ú'_hosted_submit_error.<locals>.<genexpr>  s8   øé € ð IÙG�Aô ˜;Ÿ?™?¨1Ó-¬sÓ3×FÐF¸ÀA½ÔFÛGùs
   ƒ*A ®A Úexecution_generationFTNzinvalid hosted room turn proof)	r   rx   r/   r   rT   ÚsetÚ_HOSTED_TASK_FIELDSrd   r!   )ro   rI   rª   Úhosted_terminal_callbackÚvalids   &&f& r
   Ú_hosted_submit_errorr±     sé   ø€ à‡{�{�8Ó 
Ô*Ü�C˜ÐMÓNÐNä�;¤Ó%÷ 	Eð 	E¬(Ð3KÓ*L÷ 	Eð 	EÜ�ÓÔ 3Ñ3÷	Eð 	Eç‹Cô IÜ,Ð0FÐ/GÖGóI�C�CŠCô IÜ,Ð0FÐ/GÖGóIó I÷	Eð 	Eô �{—‘Ð'=Ó>ÄÓDð 
÷ ˆ4ÐOœd 3¨Ð.NÓOÐOr   c           	     ó4  € \        VP                  R4      ;'       g    R4      pVP                  R4      '       d    VP                  R4      P	                  4       MRpV'       g   R#  ^ RIHpHpHpH	pH
p	 V! V! 4       VR7      p
RpV
'       g™   ^ RIHp T	! V! 4       TV! VP                  R	4      4      ;'       gf    \        VP                  R
4      ;'       g    R4      P	                  4       ;'       g,    \        \        4       ;'       g    R4      P	                  4       R7      pT
'       g	   T'       d   T
'       d   RMRp\        T RRT R24      # R#   X d    \        T R\        4      u # X d     R# \          d    \        T R\        4      u # i ; i)zÀFence direct prompts into a hosted room from older Desktop builds (they know the
``Group: <room-id>`` title but not the authority marker; a direct prompt would start a
second renderer driver).ÚtitlerG   zGroup: N)ÚHostedRoomErrorÚRoomProbeUnavailableErrorÚdefault_db_pathÚprobe_hosted_roomÚprobe_peer_room_reservation)Úroom_idF)Úprofile_name_for_homeÚprofile_homeÚprofileÚdefault)r¹   Útarget_profilei  zits gatewayzits home hosti  zThis room is managed by z'. Update Hermes Desktop to continue it.)r1   r   Ú
startswithÚremoveprefixr2   Úgateway.hosted_roomsr´   rµ   r¶   r·   r¸   Úhermes_constantsrº   Ú_current_profile_namerx   Ú_GROUP_PROBE_FAILED_MSGrU   )ro   rI   Úparamsr³   r¹   r´   rµ   r¶   r·   r¸   ÚhostedÚpeerrº   Úowners   &&&           r
   Ú_legacy_group_fence_errorrÉ     so  € ô �—‘˜GÓ$×*Ð*¨Ó+€EØ7<×7GÑ7GÈ	×7RÒ7Rˆe× Ñ  Ó+×1Ñ1Ô3ÐXZ€GßÙð8÷	)õ 	)ñ #¡?Ó#4¸gÔFˆØˆßÝ>Ù.ÙÓ!¨7Ù)¨'¯+©+°nÓ*EÓF÷ Ið IÜ˜6Ÿ:™: iÓ0×6Ð6°BÓ7×=Ñ=Ó?÷Ið IäÔ0Ó2×?Ð?°iÓ@×FÑFÓHô	KˆD÷ —ß!'‘¨_ˆÜØ�Ð1°%°Ð8_Ð`óbð 	báøð %ô 8Ü�C˜Ô6Ó7Ò7Øô âÜô 8Ü�C˜Ô6Ó7Ò7ð8úsH   Á(&E Â,E Â<E ÃE Ã6E ÄE ÅFÅ0FÅ5FÅ9FÆFÆFc           
     ó€  € R;rVVP                  R4      ;pe   \        WR4      w  rXVe   RRV3# VP                  R4      ;p	e   \        W	4      w  rhVe   RRV3# \        VP                  R4      4      '       d   WVR3# \        P	                  RV\        V4      WeVP                  R4      4       RR\        V RR4      3# )	a†  Coerce + admit the truncation params; ``(target_row_id, client_ordinal, err)``.
Malformed (4004) -> unconfirmed (4029; checked BEFORE target resolution so a
leaked-state request never pays the durable read or heal-stamps live dicts).  An
ordinal/id alone is not consent: a leftover ordinal on an ORDINARY submit is
indistinguishable from a real rewind, and the cut is a destructive replace.NÚtruncate_before_row_idÚtruncate_before_user_ordinalÚconfirm_truncateuö   prompt.submit: REFUSED unconfirmed truncation of session %s (%d messages held; ordinal=%s, row_id=%s, message_id=%s). The client attached truncation parameters without confirm_truncate â€” likely stale truncation parameters on an ordinary submit.Útruncate_before_message_idi½  z¡truncation parameters require confirm_truncate=true; an ordinary prompt.submit must not drop session history (update your Hermes client if a rewind was intended))r   r{   Úis_truthy_valuerV   Úwarningrc   rx   )
ro   rŸ   rI   rÅ   r   r;   Úclient_ordinalÚtruncate_row_idÚerrÚtruncate_user_ordinals
   &&&&&     r
   Ú_parse_truncation_paramsrÕ   B  sç   € ð &*Ð)€MØ!Ÿ:™:Ð&>Ó?Ð?ˆÒLÜ1°#ÐH`ÓaÑˆØŠ?Ø˜˜s�?Ð"Ø!'§¡Ð,JÓ!KÐKÐÒXÜ2°3ÓNÑˆØŠ?Ø˜˜s�?Ð"Ü�v—z‘zÐ"4Ó5×6Ò6Ø¨dÐ2Ð2Ü
‡N�Nð	Yð 	ŒS�‹\˜>¸&¿*¹*ÐEaÓ:bô	dð
 �”tØˆTð	?ó@ð @ð @r   c                óà  a aaaaa€ \        S WVS4      w  popVe   RRV3# VP                  R4      pRp\        \        VP                  R4      ;'       g    . 4      4      o\        S4      oRVVV V3R llp	Vf   VEe   Ve@   RTrº\	        VSV4      p\        T;'       g    R4      ^8X  d   V^,          pVR,          pRpM1Rp
\        V4      ;po\        VV3R l\        S4       4       R4      pR	pVf,   \        P                  R
V,           R,           W±4       V	! 4       # V^ ,          pSeQ   SV8w  dJ   S^ 8”  d   SVS,           8X  g5   \        P                  RVSW®W«S4       RR\        S RRS RV
 RV R24      3# M±SS,
          pV^ 8  g   V\        S4      8¼  d   V	! 4       # \        ;QJ d    V3R lS 4       F  '       g   K   RM	  RM! V3R lS 4       4      pV'       d   . M
\        W!4      pV'       g   Ve	   V'       d(   \        P                  RVS4       RR\        S RR4      3# V^ 8  g   V\        S4      8¼  d
   V	! VR7      # Ve   VSV,          RV3# VSV,          R3# )u]  Resolve the truncation target to ``(ordinal, cut_index, err)`` â€” with a fourth
``durable_prefix`` element when the durable target was absorbed into a repaired
live carrier: unresolvable target (4018, fail closed â€” never degrade a missing
row_id/message_id into an ordinal cut) -> ordinal drift (4030) -> ordinal-only on
a durable session (4004).NrÎ   Údisplay_history_prefixc                 óp   <€ Se
   SS,
          MT pR R \        SR\        R\        S4      RSRVRS/R7      3# )Né²  Úuser_turn_countÚordinalÚsegment_ordinalÚprefix_user_count©Údata)rx   Ú_STALE_TARGET_MSGrc   )Úresolved_ordinalÚsegmentrÑ   rÝ   ro   Úuser_indicess   & €€€€r
   Ú_staleÚ+_resolve_truncation_ordinal.<locals>._staler  s\   ø€ ð 3AÒ2LˆNÐ.Ö.ÐRbð 	à�Tœ4  TÔ+<Øœs <Ó0°)¸^Ø˜wÐ(;Ð=NðDPô Qð Qð 	Qr   rË   :Nr   Nz?target row_id %d not found for session %s (in-memory + durable)c              3   ó¦   <"  € T FF  w  rSV,          P                  R 4      S8X  g    SV,          P                  R4      S8X  g   KA  W3x € KH  	  R# 5i)ÚidÚ
message_idN©r   )r@   rA   rB   r   Ú
msg_id_strs   &  €€r
   rC   Ú._resolve_truncation_ordinal.<locals>.<genexpr>‰  sM   øé € ð DÑ4K¡L EØ˜E•N×&Ñ& tÓ,°
Ô:Ø˜E•N×&Ñ& |Ó4¸
ÑBô  �%•Ó4Kùs   ƒ>AÁAz8target message_id %s not found in history for session %szprompt.submit: z&; refusing truncation without fallbackz¯prompt.submit: REFUSED truncation due to ordinal mismatch for session %s (ordinal=%d, %s_ordinal=%d, %s=%s, prefix_user_count=%d). Stale truncate_before_user_ordinal detected.i¾  ztruncate_before_user_ordinal (z) does not match z target turn (Ú)c              3   óL   <"  € T F  p\        SV,          4      R Jx € K  	  R # 5ir>   r?   )r@   rB   r   s   & €r
   rC   rë   ª  s#   øé € ð SÙEQ¸EŒO˜G E�NÓ+°4Õ7Ã\ùs   ƒ!$TFzrprompt.submit: REFUSED ordinal-only truncation of durable session %s (ordinal=%d); truncate_before_row_id requiredrw   z]ordinal-only truncation is unsafe for durable session history; include truncate_before_row_id)rá   r>   rb   )rÕ   r   rc   r   rq   r1   rE   r   rV   rÐ   rx   Úanyr[   )ro   rŸ   rI   rÅ   r   r;   rÓ   Útruncate_message_idÚdurable_prefixrä   rz   Útarget_reprÚfound_matchÚ	not_foundrÛ   Úhas_stamped_userÚdurablerÑ   rê   rÝ   rã   s   f&&&f            @@@@r
   Ú_resolve_truncation_ordinalrö   _  sÄ  ý€ ô *BØˆS˜6 7ó*,Ñ&€M�> 3à
‚Ø�T˜3ˆÐØ Ÿ*™*Ð%AÓBÐð €Nô Ô1°'·+±+Ð>VÓ2W×2]Ð2]Ð[]Ó^Ó_ÐÜ(¨Ó1€L÷Qò Qð Ò Ð$7Ó$CØÒ$Ø&>À˜Ü2°7¸GÀ]ÓSˆKÜ�;×$Ð$ "Ó%¨Ô*ð "-¨Q¥�Ø)¨"�o�ØY‰Ià5ˆJÜ'*Ð+>Ó'?Ð?ˆK˜*ÜõD´I¸lÔ4Kó DàEIóKˆKð SˆIØÒÜ�N‰NØ! IÕ-Ð0XÕXØô"ñ “8ˆOØ˜a•.ˆð
 Ò%¨.¸GÔ*CØ! AÔ%¨.¸GÐFWÕ<WÔ*WÜ�N‰Nð?ð �^ Z¸*Ø!ô#ð ˜œtØ�TØ0°Ð0@Ð@QØ�,˜n¨W¨I°Qð8ó 9ð 9ð 9øð
 !Ð#4Õ4ˆØ�QŒ;˜'¤S¨Ó%6Ô6Ù“8ˆO÷ ›3ô SÙEQóSŸ3Ÿ3š3ô SÙEQóSó SÐç(‘"Ô.NÈwÓ.\ˆß˜wš·'Ü�N‰NðKà�^ô%ð ˜œtØ�Tð1ó 2ð 2ð 2ð
 �„{�g¤ \Ó!2Ô2Ù wÔ/Ð/ØÒ!Ø˜ WÕ-¨t°^ÐCÐCØ�L Õ)¨4Ð/Ð/r   c                ó$   € V ^8„  d   QhR\         /# r%   )r­   )r	   s   "r
   r   r   ¾  s   € ÷ eñ eœSñ er   c                 óv   € V  Uu0 uF(  p\        \        V4      ;p\        4      '       g   K&  VkK*  	  up# u upi r>   )r/   r#   r!   )ÚmessagesÚmessager   s   &  r
   Ú_row_ids_ofrû   ¾  s1   € Ù"*Ód¡(�w¬jÄOÐT[ÓD\Ð:\¸&Ô_b×.c�FˆF¡(ÑdÐdùÒds   …#6­6Fc                ó$   € V ^8„  d   QhR\         /# r%   ©r!   )r	   s   "r
   r   r   È  s   € ÷ ñ ÌCñ r   c                óv  € ^ RI Hp Rp^ p\        V4       EF  pWƒ8  d   K  W(,          p	V	P                  R4      ;'       g    R U
u. uF  p
\	        V
\
        4      '       g   K  V
NK  	  pp
V'       g   V^,          pKi  VfK   \        WRR7      ;'       g    . pV Uu/ uF'  p\	        V\        4      '       g   K  \        V4      VbK)  	  pp\        V	4      pW~RJ ,          pV0VmV,
          R0,
           F0  p
VP                  V
4      pY}RJ ;'       g    V! V4      RJ,          pK2  	  EK  	  V# u up
i u upi )a“  User turns a cut at *cut_index* drops. A repaired live carrier stands for its whole merged
run (own id + ``_absorbed_row_ids``), which can mix real user rows with display markers
(#94486): its turns are counted from the physical durable rows, and every id that cannot be
classified there counts as a turn (fail closed). On a durable-carrier cut the run's rows
before the target survive (*survivor_ids*).r   Nra   Fr^   rb   )	r   r   r   r   r/   r!   r[   r   r#   )rI   rŸ   r   Ú	cut_indexÚsurvivor_idsr   ÚphysicalÚarchivedrB   rú   ro   ÚabsorbedÚrowsÚrowÚowns   &&&&&          r
   Ú_archived_user_turnsr  È  s7  € õ CØ€HØ€HÜ& w×/ˆØÔÙØ•.ˆØ$+§K¡KÐ0CÓ$D×$JÐ$JÈÐ$JÓdÑ$J˜CÌzÐZ]Ô_b×Oc—C�CÑ$JˆÐdßØ˜�MˆHÙØÒÜ3°GÐUZÔ[×aÐaÐ_aˆDÙ=AÓ[¹T°cÄZÐPSÔUY×EZÔ1œ¨Ó,¨cÒ1¹TˆHÐ[Ü˜gÓ&ˆà˜4�KÕˆØÐ#˜(Ð# lÕ2°d°V×;Ð;ˆCØ—,‘,˜sÓ#ˆCØ˜t˜×QÐQÑ'@ÀÓ'EÈTÐ'QÕQŠHô <ñ 0ð" €Oùò eùò \s   ÁD1Á$D1ÂD6Â;D6c                ó(  € \        VP                  R. 4      4      p\        WW#V4      pV^ ,          V^,          V^,          r˜pV	e   V	/ 3# \        V4      ^8”  d
   V^,          MRp
^ RIHp V
e"   V
 Uu. uF  qÌP                  4       NK  	  upRríM
V! WX4      w  rÞV'       gY   V'       dQ   \        VP                  R4      4      '       g1   \        P                  RV\        V4      V4       \        V RR4      / 3# \        W!WX\        V4      4      pV^8”  dŠ   \        VP                  R4      4      '       gj   \        V4      V
e   TM
\        V4      ,
          p\        P                  R	\        '       d   R
MRVVW÷4       \        '       d   \        V RRRVRV/R7      / 3# V'       g   \        P                  M\        P                  pV! RV\        V4      \        V4      V4       / p\        V4      ;_uu_ 4       pVEei    VP                  R4      ;'       g    Tp\        V4      pVe8   \!        VVRR7      pVf   \#        R4      hVP%                  \        V4      4       V Uu. uF  p\'        V4      NK  	  ppVP)                  VVRRRR7       Tf0   \/        T4       Uu. uF  p\'        TT,          4      NK  	  upTR&   M£\1        TR T 4       4       UUu/ uFK  w  pp\3        T\4        4      '       g   K  \3        T\4        4      '       g   K6  TT9   g   K?  \7        T4      TbKM  	  upp;TR&   pTP9                  T4       F  pTP;                  \7        T4      R4       K   	  RRR4       WÒR&   \5        VP                  R^ 4      4      ^,           VR&   RV3# u upi u upi   \*         d@   p\        P-                  RYTRR7       \        T RRT 24      / 3u Rp?uuRRR4       # Rp?ii ; iu upi u uppi   + '       g   i     LŸ; i) zyRewind/regenerate cut under ``history_lock``: ``(err, survivor_fields)``; the fields
are the client rowId-rebind payload.r   N)Ú#history_before_user_originated_turnÚconfirm_empty_truncatez_prompt.submit: REFUSED empty truncation of session %s (%d messages would be wiped; ordinal=%d).i¼  zstruncation would erase the entire session transcript; resubmit with confirm_empty_truncate=true if this is intendedÚconfirm_deep_truncatezfprompt.submit: %s unconfirmed deep truncation of session %s (%d messages / %d user turns; ordinal=%d).ÚREFUSEDzALLOWED (warn-only release)iÁ  zgtruncation would archive later user turns; resubmit with confirm_deep_truncate=true if this is intendedÚarchived_messagesÚarchived_user_turnsrÞ   zKprompt.submit: truncating session %s history %d -> %d messages (ordinal=%d)rX   Fr^   z4could not load durable row identities for truncationT)Úactive_onlyÚarchive_droppedÚreject_active_turn_leasezsprompt.submit: replace_messages failed for session %s (ordinal=%d); refusing turn so memory and DB stay aligned: %srO   i�  z&failed to persist history truncation: Úsurvivor_user_row_idsc              3   ó8   "  € T F  p\        V4      x € K  	  R # 5ir>   r?   )r@   rú   s   & r
   rC   Ú/_truncate_history_for_submit.<locals>.<genexpr>L  s   é € Ð.aÑW`ÈG¬¸w×/GÐ/GÓW`ùs   ‚Úsurvivor_row_id_mapÚhistory_version)Ú&_history_without_ephemeral_scaffoldingr   rö   rc   r   r	  ÚcopyrÏ   rV   rÐ   rx   r  rû   ÚDEEP_TRUNCATE_ENFORCEDrž   rR   r[   ÚRuntimeErrorÚupdater#   Úreplace_messagesrU   Úerrorr   re   r/   r!   r1   ÚintersectionÚ
setdefault)ro   rŸ   rI   rÅ   Úrequested_rebind_idsr   ÚresolvedrÛ   rÿ   rÓ   rð   r	  rú   Ú	truncatedÚ
_live_viewr  r  Úlog_fnÚfieldsrY   Útruncation_keyÚold_active_row_idsÚdurable_rebind_historyÚold_survivor_row_idsÚexcr   Ú
old_row_idÚ
new_row_idÚ
row_id_mapÚdropped_row_ids   &&&&&                         r
   Ú_truncate_history_for_submitr/  å  s?  € ô 5°W·[±[ÀÈBÓ5OÓP€GÜ*¨3°WÀgÓN€HØ& q�k¨8°A­;¸À½˜€GØ
‚Ø�BˆwˆÜ$'¨£M°AÔ$5�X˜a–[¸4€NÝLØÒ!ñ
 @NÓ N¹~°G§¡¦¹~Ñ NÐPT‘:á CÀGÓ WÑˆ	çŸ¬¸¿¹ÐD\Ó9]×)^Ò)^Ü�‰ð8à”�W“˜wô	(ô Ø�ðLóMð OQðQð 	Qô /¨w¸WÔQ\Ð]fÓQgÓhÐØ˜QÔ¤°v·z±zÐBYÓ7Z×'[Ò'[ä ›LØ'Ò3‰I¼¸Y»õIÐä�‰ð"ç/Ó/‰IÐ5RØÐ"Ð$7ô		B÷
 "Ó!ÜØ�TðAà)Ð+<Ø+Ð-@ðBô	Cð
 EGðGð G÷ $-ŒV�^Š^´&·+±+€FÙ
ØUØŒS�‹\œ3˜y›>¨7ô4ð €FÜ	�W×	Ô	 Ø‹>ð#[ð ")§¡¨]Ó!;×!BÐ!B¸s�Ü%0°Ó%9Ð"Ø'Ò3ô .NØ ÀEô.KÐ*à-Ò5Ü*Ð+aÓbÐbØ&×-Ñ-¬kÐ:PÓ.QÔRÙPYÓ'ZÑPYÀW¬¸Ö(@ÑPYÐ$Ð'Zð ×#Ñ#Ø" I¸4ÐQUØ-1ð $ô 3ð $Ò+ä;PÐQZÔ;[ó3]Ù;[°a”O I¨a¥LÖ1Ñ;[ñ3]�Ð.Ò/ô
 36Ø,Ñ.aÑW`Ó.aô3cô><ñ3cÑ.˜
 Jä! *¬c×2ô 0ô 8BÀ*Ìc×7Rô 0ð #Ð&:Ñ:ô	 0”C˜
“O ZÒ/ñ3cò><ð <�Ð,Ñ-°
ð ';×&GÑ&GÐHZÖ&[�NØ×)Ñ)¬#¨nÓ*=¸tÖDñ '\÷g 
ðj #ˆIÑÜ!$ W§[¡[Ð1BÀAÓ%FÓ!GÈ!Õ!K€GÐÑØ�ˆ<Ðùò !OùòD ([øô ô [Ü—‘ð=à #°ð ô 6ô ˜C Ð)OÐPSÈuÐ'UÓVÐXZÐZÔZ÷K 
Ò	ûð@[üò3]ùó><÷[ 
×	ús…   Á4NÇ<PÈN)ÈAN)É(N$É<N)ÊPÊ%O6Ë PËO;
Ë=O;
ÌO;
ÌO;
Ì.<PÎ$N)Î)O3Î4*O.ÏO3ÏPÏ.O3Ï3PÐP	c                ó$   € V ^8„  d   QhR\         /# r%   r   )r	   s   "r
   r   r   V  s   € ÷ cñ c¬ñ cr   c                óR   € ^ RI Hp RV P                  RV P                  RV! V4      /# )zVMachine-readable error data: ``code`` lets a GUI pick a "Run doctor" / "Retry" action.)Ústorage_failure_detailsÚcodeÚcauseÚdetails)Úhermes_state_user_copyr2  r3  r4  )Úfailurer"   r2  s   && r
   Ú_storage_error_datar8  V  s'   € å>Ø�G—L‘L '¨7¯=©=¸)ÑE\Ð]`ÓEaÐbÐbr   c                ó(   € V ^8„  d   QhR\         RR/# )r   Ú
session_idr   N©r1   )r	   s   "r
   r   r   \  s   € ÷ &ñ &¬ð &°ñ &r   c                óê   € V'       g   R#  V P                  V4      pTe)   TP	                  R4      e   T P                  T4       R# R# R#   \         d    \        P                  RTRR7        R# i ; i)uÏ  The first real turn is what reopens a finalized session (#85303).

Mounting a chat (``session.resume``/hydration) is a READ and no longer clears
``ended_at``/``end_reason`` â€” opening a finished session must not re-light DB-derived
liveness with no new activity. This runs on the submit path (the user actually sent
something) before the turn's first transcript write, so the row the turn writes is
live again. Best-effort: a failed read must not block the send.Nz,finalized-session reopen check failed for %sTrO   Úended_at)Úget_sessionrU   rV   rW   r   Úreopen_session)rY   r:  r  s   && r
   Ú_reopen_if_finalizedr@  \  so   € ÷ ÙðØ�n‰n˜ZÓ(ˆð ‚˜3Ÿ7™7 :Ó.Ò:Ø
×Ñ˜*Ö%ñ ;�øô ô Ü�‰ÐCÀZÐZ^ˆÔ_Úðús   ŒA Á#A2Á1A2c           
     óÈ  € ^ RI Hp  \        V4      RJ dF   V! \        4      p\	        V RRVP
                   RVP                   R2\        V\        4      R7      pMg\        V4       \        V4      ;_uu_ 4       pVe/   \        T\        VP                  R	4      ;'       g    R
4      4       RRR4       \        WV4       R# VR,          ;_uu_ 4        RVR&   \$        P%                  4       VR&   VP'                  RR4       \)        V4       \+        V4       RRR4       V#   + '       g   i     L~; i  \         d�   pT! T4      pTP                  R8X  d   \	        T RR\        YX4      R7      p Rp?L´\         P#                  RTRR7       \	        T RRTP
                   RTP                   R2\        YX4      R7      p Rp?ELRp?ii ; i  + '       g   i     T# ; i)a  Lazily persist the DB row now that the user sent a message (a branch becomes real
here), then the message itself (#111868: a freeze during the first build must leave a
resumable transcript); the error reply is the only user-visible signal (desktop maps it to a toast).)Údescribe_storage_failureFiÐ  zFSession storage is unavailable, so this message was not saved. Cause: z. z Then send your message again.rÞ   NrX   rG   Ú	disk_fulliÎ  zŠSession storage could not be written, so this message was not saved: the disk is full. Free some disk space, then send your message again.z)prompt.submit: session persist failed: %sTrO   iÏ  zLSession storage could not be written, so this message was not saved. Cause: Úhistory_lockÚrunningÚlast_activeÚ_hosted_room_task)r6  rB  Ú_ensure_session_db_rowÚ	_db_errorrx   ÚglossÚactionr8  Ú_persist_branch_seedrR   r@  r1   r   Ú_persist_submit_user_rowrU   r3  rV   rÐ   ÚtimeÚpopÚ_clear_inflight_turnÚ_release_active_session_slot)	ro   rI   r�   r-   rB  r7  r  rY   r*  s	   &&&&     r
   Ú_persist_session_row_for_submitrR  o  sµ  € õ @ð8Ü! 'Ó*¨eÓ3Ù.¬yÓ9ˆGÜØ�TØXÐY`×YfÑYfÐXgÐgiØ—>‘>Ð"Ð"@ðBä(¨´)Ó<ô	>‰Eô ! Ô)ô ˜W×%Ô%¨Ø’>Ü(¨¬S°·±¸]Ó1K×1QÐ1QÈrÓ-RÔS÷ &ô % W°LÔAÙð$ 
�×	 ×	 Ø"ˆ�	ÑÜ!%§¡£ˆ�ÑØ�‰Ð'¨Ô.Ü˜WÔ%Ü$ WÔ-÷ 
!ð €L÷9 &×%ûô
 ô 8Ù*¨3Ó/ˆØ�<‰<˜;Ô&ÜØ�TðFä(¨Ó6ô	8�Eô �N‰NÐFÈÐVZˆNÔ[ÜØ�TØ^Ð_f×_lÑ_lÐ^mÐmoØ—>‘>Ð"Ð"@ðBä(¨Ó6ô	8ŽEûð8ú÷" 
!Ö	 ð €LúsP   ˆAD6 ÁD6 Á:'D#Â"D#Â-D6 ÃAGÄ#D3	Ä.D6 Ä6GÅ1GÅ7AGÇGÇG!	c                óæ  € \        W V4      pV'       dœ   \        YVP                  R4      ;'       g    / P                  RR4      RRRRRR	/R
7       VR,          ;_uu_ 4        RVR&   \        P                  4       VR&   RRR4       \	        RV\        VP                  R4      V4      4       R# VR,          ;_uu_ 4        VP                  R4      '       g   VP                  R4      '       gD   RVR&   \        V4       \	        RTRVP                  R4      '       d   RMR/4        RRR4       R#  RRR4       \        WW#WEWgR7       R#   + '       g   i     LÕ; i  + '       g   i     L4; i)zyTurn thread body: patient wait for a deferred build (a slow build must not eat the
accepted in-flight message), then run.r  rú   zagent initialization failedÚlayerÚruntimer3  Úagent_init_failedÚ	retryableT)Úerror_surfacerD  FrE  rF  Nzsession.infoÚagentÚ_turn_cancel_requestedz)Turn cancelled before the agent was readyz4Session no longer running before the agent was ready)r-   Údisplay_metadataÚterminal_callbackÚturn_author)Ú_wait_agent_for_promptÚ_emit_terminal_turn_errorr   rN  Ú_emitÚ_session_inforP  Ú_run_prompt_submit)	ro   rŸ   rI   r�   r-   r[  r¯   r]  rÓ   s	   &&&&&&&& r
   Ú_run_after_agent_readyrc  Ÿ  sE  € ô ! ¨sÓ
3€Cß
ô 	"Ø˜3Ÿ7™7 7Ó+×1Ð1¨r×6Ñ6°yÐB_Ó`Ø" I¨vÐ7JÈKÐY]Ð^õ	`ð �^×$×$Ø!&ˆG�IÑÜ%)§Y¡Y£[ˆG�MÑ"÷ %ô 	ˆn˜c¤=°·±¸WÓ1EÀwÓ#OÔPÙØ	�×	 ×	 Ø�;‰;Ð/×0Ò0¸¿¹ÀI×8NÒ8NØ!&ˆG�IÑÜ  Ô)ä�'˜3 à—;‘;Ð7×8Ò8ñ <àKð!Nô Oð ÷ 
!Ñ	 Ø8N÷ 
!ô Ø�'¨lØ2÷M÷ %×$ú÷
 
!×	 ús   Á#EÃ.E Ã09E ÅE	Å E0	ÚSESSION_OWNER_BUSYÚSESSION_OWNER_UNCONFIRMEDc                ó$   € V ^8„  d   QhR\         /# r%   r   )r	   s   "r
   r   r   Í  s   € ÷ Qñ QÔW[ñ Qr   c                ó²   € \        VRR4      e   V'       g   \        WW#WE4      # \        VRR4      p\        T R\        V4      V'       d	   RV/4      # R4      # )z[The answer to a refused slot: a ledger refusal of a client submit goes to the owner's FIFO.Úledger_statusNÚreasonéú  )rS   Ú_submit_to_ledger_ownerrx   r1   )ro   rŸ   rI   r�   rÅ   ÚrefusalÚinternal_hosted_submitri  s   &&&&&&& r
   Ú_slot_refusalrn  Í  sU   € äˆw˜¨Ó.Ò:×CYÜ& s°ÀÓPÐPÜ�W˜h¨Ó-€FÜ��Tœ3˜w›<¿v¨(°FÐ);ÓPÐPÈ4ÓPÐPr   c                ó$   € V ^8„  d   QhR\         /# r%   r   )r	   s   "r
   r   r   Õ  s   € ÷ %0ñ %0Ìñ %0r   c                ó˜  € ^ RI Hp \        T R\        V4      R\	        VRR4      ;'       g    R/4      p\	        VRR4      R8X  d   V# RpVP                  WRW44      '       gE   \        V\        4      '       d   VP                  4       '       d   RMR	p\        V4      '       d   R
pMW VP                  WV4      p	V	P                  R4      RJ d   \        V RR/4      # \        V RRRV	P                  R4      RR/4      # \        V RRV,           R,           R\&        /4      #   TP                   d    Tu # TP                   d    \        T RRR\        /4      u # \         de   p
\         P#                  RTP                  R4      ;'       g    TT
RR7       \        Y¦P$                  4      '       d   \        T
4      MRp Rp
?
LÆRp
?
ii ; i)a  The gateway's durable ledger holds work for this session (#140385, RT-37): one owner, one FIFO.
Work that ends on its own (a running or queued gateway turn) gets this prompt queued behind it in
the OWNER's FIFO (``owner_forward``): the owner runs it once, after the current turn, and nothing
runs here. An ``unknown`` admission, or work no running gateway will finish, keeps its refusal
(only Discard / a gateway resume resolves it); anything else that cannot be queued is refused
with the reason and the advice to send when the turn ends.)Úowner_forwardrj  ri  NÚSESSION_NOT_OWNEDrh  Úunknownz,a rewind or attachment cannot join its queuez*this kind of message cannot join its queuezCan image cannot join its queue, so it was removed from this messager¢   TÚstatusÚqueuedÚadmission_idÚ	forwardedzœThe gateway is running a turn in this chat and did not confirm your message in time. It may already be queued there: check the chat before sending it again.z0forwarding prompt for %s to the owner failed: %srX   rO   zthe gateway refused itz/The gateway is running a turn in this chat and z=. Nothing was sent. Send it again when the current turn ends.)Útui_gatewayrq  rx   r1   rS   Úforwardabler/   r2   Ú_unstage_refused_imagesÚforward_promptr   r£   ÚOwnerNotRunningÚOwnerUnconfirmedre  rU   rV   rž   ÚOwnerUnavailablerd  )ro   rŸ   rI   r�   rÅ   rl  rq  Ú	not_ownedÚwhyÚreceiptr*  s   &&&&&&     r
   rk  rk  Õ  sÍ  € õ *Ü�S˜$¤ G£¨x¼ÀÈ(ÐTXÓ9Y×9pÐ9pÐ]pÐ.qÓr€IÜˆw˜¨Ó.°)Ô;ØÐØ
€CØ×$Ñ$ W°t×DÒDÜAKÈDÔRU×AVÒAVÐ[_×[eÑ[e×[gÒ[gÑ=Ø@ð 	ä" 7×+Ò+ØWˆCøð	1Ø#×2Ñ2°3ÀÓFˆGð �{‰{˜?Ó+¨tÓ3Ü˜3 °$Ð 7Ó8Ð8Ü�s˜X x°ÀÇÁÈ^ÓA\Ø(¨$ð0ó 1ð 1ä��TÐLÈsÕRØQõRàÔ-Ð.ó0ð 0øð ×,Ñ,ô 	ØÒØ×-Ñ-ô 	?Ü˜˜Tð $là!Ô#<Ð=ó?ò ?ô ô 	lÜ�K‰KÐJØŸ™ MÓ2×9Ð9°c¸3Èð ô Oä(¨×.LÑ.L×MÒM”#�c”(ÐSk�Cûð	lús1   Â(D  Ä G	Ä5G	ÅG	ÅG	Å$G	Å%AGÇG	c                ó$   € V ^8„  d   QhR\         /# r%   rý   )r	   s   "r
   r   r   ý  s   € ÷ ñ ¬ñ r   c                ó´   € V R,          ;_uu_ 4        \        V P                  R4      ;'       g    R4      p. V R&   RRR4       V#   + '       g   i     X# ; i)a  Drop the images staged for a submit the owner's FIFO cannot take (RT-37c live finding).

Every other refusal leaves ``attached_images`` staged because the turn that ends the refusal (the
legacy turn once the slot frees) consumes them. Here no legacy turn comes: while the gateway owns the
chat, a staged image makes every later text-only send unforwardable too, so the chat stays refused
behind an image the composer may no longer show. The refusal names the removal, so the user re-attaches
it knowingly instead of losing it silently.rD  Úattached_imagesNrb   )rc   r   )rI   Údroppeds   & r
   rz  rz  ý  sR   € ð 
�×	 ×	 Ü�g—k‘kÐ"3Ó4×:Ð:¸Ó;ˆØ%'ˆÐ!Ñ"÷ 
!ð €N÷ 
!Ö	 ð €Nús   ’*AÁA	c	           	     ó  € / p	\        V4      ;_uu_ 4       p
V
'       g   \        V RR4      V	3uuRRR4       # VP                  R4      '       dg   \        \	        VP                  R4      ;'       g    R4      VP                  R4      ;'       g    R4      '       d   \        V RR	4      V	3uuRRR4       # \        VP                  R
4      4      '       d"   V'       g   \        V RR4      V	3uuRRR4       # V'       d"   \        WW$V4      w  r¹Ve   V/ 3uuRRR4       # RVR&   RVR&   \        P                  4       VR&   Ve   \        V4      VR&   \        W#VR7       RRR4       RV	3#   + '       g   i     RT	3# ; i)zŸUnder ``history_lock``: refuse watch-child races / malformed truncation, apply the
cut, mark the turn running + in flight.  Returns ``(err, survivor_fields)``.é«  ú*backend is retiring; reconnect to continueNÚlazyrX   rG   r»   é©  u0   subagent still running â€” wait for it to finishrÍ   rw   zmconfirm_truncate requires truncate_before_user_ordinal, truncate_before_message_id, or truncate_before_row_idTrE  FrZ  rF  rG  )r-   )
Ú_session_turn_admissionrx   r   Ú_child_run_activer1   rÏ   r/  rN  r   Ú_start_inflight_turn)ro   rŸ   rI   r�   rÅ   Úhas_truncationr   rª   r-   r%  ÚadmittedrÓ   s   &&&&&&&&&   r
   Ú_lock_in_submit_turnr�    sr  € ð €FÜ	  ×	)Ô	)¨XßÜ˜˜TÐ#OÓPÐRXÐX÷ 
*Ò	)ð
 �;‰;�v×ÒÔ#4Ü�—‘˜MÓ*×0Ð0¨bÓ1°7·;±;¸~Ó3N×3VÐ3VÐRV÷$Xò $Xä˜˜TÐ#UÓVÐX^Ð^÷ 
*Ò	)ô ˜6Ÿ:™:Ð&8Ó9×:Ò:Ç>ÜØ�TØóð ð÷ 
*Ò	)÷ Ü6Ø˜'Ð+?óA‰KˆCàŠØ˜B�w÷# 
*Ò	)ð$ "ˆ�	ÑØ,1ˆÐ(Ñ)Ü!%§¡£ˆ�ÑØÒ"Ü+/°Ó+<ˆGÐ'Ñ(Ü˜W¸ÕF÷/ 
*ð0 �ˆ<Ð÷1 
*Ö	)ð0 �ˆ<ÐúsG   –E+¸E+Á!E+Á1E+ÂE+ÂE+Â5'E+ÃE+Ã6E+Ã>E+ÄA E+Å+E>	)ÚSURFACESzprompt.submitc                ó0   € V ^8„  d   QhR\         R\         /# ©r   rÅ   r   r   )r	   s   "r
   r   r   1  s"   € ÷ U@ñ U@”4ð U@œDñ U@r   c                 ó¼  a aaaaaa a!a"€ ^ RI Hp SP                  RR4      o SP                  RR4      p\        V\        4      '       d	   V! V4      MTo!SP                  R4      R8X  d   RMRoSP                  R4      p\        V\        4      '       d"   VP                  4       '       d   RVR	,          /MRo\        S S!S 4      ;pe   V# SP                  R
4      '       d   ^ RIHp V! 4        \        SS 4      w  opV'       d   V# ^ RI
Hp SP                  R4      p	V	e   \        W˜4      '       g   \        S RR4      # V	e   V	P                  MRo"SP                  R4      p
SP                  R4      oV
RJ;'       g    SRJpV'       d   \        S SV
S4      M\        S SS4      pVe   V# \!        S S4      ;pe   \#        S S SS!SWË4      # SP                  R4      \$        9   d   SP                  R4      MRSR&   SP                  R4      pSR,          R8X  d    \        V\        4      '       d
   VR,          MRSR&   SP                  R4      RJ SR&   \&        ;QJ d#    V3R l\(         4       F  '       g   K   RM	  RM! V3R l\(         4       4      pV'       dE   \        S!\        4      '       d/   \+        S!\	        SP                  R4      ;'       g    R4      4      o!\-        S\/        4       4      pV'       d   V'       d   \        S RR4      # \0        ;_uu_ 4        \3        S S S4      ;pe   VuuRRR4       # \5        4       ;pe   \7        S SV4       RRR4        SR,          ;_uu_ 4        SP                  R 4      '       g    RRR4       MŠV'       d   \        S R!R"4      uuRRR4       # X;'       g    SP                  R#4      pRRR4       V'       d   \        S R$R%4      # \9        S S SS!X\;        SP                  R&4      4      S"SR'7      pVf   K¼  V# SP                  R(4      p\        V\<        4      '       dC   V Uu0 uF5  p\        V\>        4      '       g   K  \        V\:        4      '       d   K3  VkK7  	  upMRp\A        S S SS!SVVV
S4	      w  ppVe   V# V'       dí   S"'       d&   \B        PE                  R)S"P                  R*4      4        \G        S4      ;_uu_ 4       pVe/   \I        T\	        SP                  R4      ;'       g    R4      4       RRR4       \M        S S SS!SSR-7      pTP                  R.4      '       g   TR/,          PO                  T4       T# \B        PQ                  R0S TR.,          P                  R1R24      4       \S        S SS!S4      ;pe   V# SP                  R34      ;'       g    / p\        VP                  R44      \>        4      '       d   VR4,          VR5&   \U        S SSP                  R64      4      '       g   \W        S S4       \X        P[                  VVVV VV V!V"3R7 lRR87      pVSR9&   VP]                  4        \_        S R:R;/VC4      #   + '       g   i     EL; i  + '       g   i     EL½; iu upi   + '       g   i     ELƒ; i  \J         d    \B        PE                  R+S RR,7        EL¬i ; i)<é    )Úsanitize_user_prompt_textr:  rG   r�   r-   ÚhiddenNÚtitle_preview:Niè  NÚinterrupted)Úmark_speech_interrupted)ÚDeliveryAuthorÚ_turn_authori  z8turn author is stamped by the gateway, never by a clientÚ_hosted_taskÚ_hosted_terminal_callbackÚsurfaceÚclient_surfaceÚvoice_contextz
voice-live:Nip  NÚvoice_live_contextÚ
voice_turnTc              3   óJ   <"  € T F  pSP                  V4      R Jx € K  	  R # 5ir>   ré   ©r@   ÚkrÅ   s   & €r
   rC   Ú_.<locals>.<genexpr>c  s    øé € ÐOÑ<N°q˜Ÿ™ A›¨dÕ2Ó<Nùs   ƒ #FrX   i  z=hosted room turns do not support isolated compute workers yetrD  rE  iû  z"hosted room member session is busyÚ	transportrŠ  zsession busyru  )ru  r]  r-   Úrebind_survivor_row_idszNisolated compute turns carry no author yet; the turn from %s runs unattributedrç   z?finalized-session reopen before isolated dispatch failed for %srO   )r-   r[  r  ÚresultzDcompute-host dispatch failed for session %s; falling back inline: %srú   zunknown errorÚ_submit_user_rowr   Úuser_row_idÚagent_readyc            
      ó(   <€ \        SSSSS SSS4      # r>   )rc  )r-   r[  r¯   ro   rI   rŸ   r�   r]  s   €€€€€€€€r
   Ú<lambda>Ú_.<locals>.<lambda>À  s    ø€ Ô-Ø��g˜t \Ð3CÐE]Ð_jôlr   )ÚtargetÚdaemonÚ_run_threadrt  Ú	streaming)0Úhermes_cli.input_sanitizer–  r   r/   r1   r2   r¤   Útools.tts_streamingrš  Ú_sess_nowaitÚtools.bot_relayr›  rx   r€   r±   rÉ   Ú_ensure_active_session_slotrn  Ú_CLIENT_SURFACESrî   Ú_TRUNCATION_PARAMSÚ#_expand_skill_invocation_for_replayÚ_session_uses_compute_hostÚ(_load_dashboard_process_isolation_configÚ_session_resume_lockÚ_reattach_refusalÚcurrent_transportÚ_rebind_live_transportÚ_handle_busy_submitr'   r   r!   r�  rV   rW   rR   r@  rU   Ú_submit_prompt_to_compute_hostr  rÐ   rR  Ú%_restart_completed_failed_agent_buildÚ_start_agent_buildÚ	threadingÚThreadÚstartr£   )#ro   rÅ   r–  Úraw_textr˜  Ústoppedrš  rÓ   r›  Ú
raw_authorrª   rm  Úlimit_messager¡  rŽ  Úturn_isolationrl  ÚtÚbusy_transportÚbusy_responseÚraw_rebind_idsÚrr   Úsurvivor_fieldsrY   Úisolated_responseÚstaged_userÚ
run_threadr-   r[  r¯   rI   rŸ   r�   r]  s#   ff                          @@@@@@@r
   Ú_rØ  0  s#  ÿø€ åCØ
�*‰*�\ 2Ó
&€CØ�z‰z˜& "Ó%€HÜ2<¸XÄs×2KÒ2KÑ$ XÔ.ÐQY€Dð  &Ÿz™z¨.Ó9¸XÔE‘8È4€LØ—J‘J˜Ó/€Mô �m¤S×)Ò)¨m×.AÑ.A×.CÒ.Cð 
˜-¨Õ.Ñ/àð ô
 /¨s°D¸#Ó>Ð>ˆÒKØˆØ‡z�z�-× Ò å?ÙÔ!Ü ¨Ó,�L€GˆSß
Øˆ
Ý.ð —‘˜NÓ+€JØÒ¤j°×&LÒ&LÜ�C˜ÐYÓZÐZØ'1Ò'=�*×#Ò#À4€KØ—*‘*˜^Ó,€KØ%Ÿz™zÐ*EÓFÐØ(°Ð4×\Ð\Ð8PÐX\Ð8\Ð÷ "ô 	˜S '¨;Ð8PÔQÜ'@ÀÀgÈvÓ'Vð ð ‚Øˆ
Ü4°S¸'ÓBÐBˆÒOô ˜S # w°°f¸mÓdÐdà9?¿¹ÀIÓ9NÔRbÔ9b §
¡
¨9Ô 5Ðhj€GÐÑð —J‘J˜Ó/€Mà 'Ð(8Õ 9¸\Ô IÌjÐYfÔhk×NlÒNlˆ�eÖÐrtð Ð Ñ!à"ŸJ™J |Ó4¸Ð<€GˆLÑß“SÔOÕ<NÓO—S—S’SÔOÕ<NÓOÓO€Nßœ* T¬3×/Ò/ô 3°4¼¸W¿[¹[ÈÓ=W×=]Ð=]Ð[]Ó9^Ó_ˆÜ/°Ô9aÓ9cÓd€Nß§.Ü�C˜Ð^Ó_Ð_÷ 
Ö	Ü(¨¨c°7Ó;Ð;ˆGÒHØ÷ 
Ò	ô #Ó$Ð$ˆAÒ1Ü" 3¨°Ô3÷	 
ð Ø�^×$×$Ø—;‘;˜y×)Ò)Ø÷ %Ð$÷ &Ü˜C Ð'KÓL÷	 %Ò$ð
 ×:Ð: '§+¡+¨kÓ":ˆN÷ %÷ ô ˜˜T >Ó2Ð2Ü+Ø��g˜t ^¼DÀÇÁÈHÓAUÓ<VÐdoØ%ô'ˆð Ô$Ø Ð Ø—Z‘ZÐ 9Ó:€Nô �n¤d×+Ò+ñ #ÓU‘Nˆq¤j°´C×&8ŒÄÈAÌt×AT�ˆ‘NÒUØ15ð ô 0ØˆS�'˜4 ¨Ð9MÈ{Ð\hójÑ€Cˆà
‚Øˆ
ßßÜ�L‰LÐiØ$Ÿ™¨Ó.ô0ð	-Ü˜W×%Ô%¨Ø’>Ü(¨¬S°·±¸]Ó1K×1QÐ1QÈrÓ-RÔS÷ &ô ;Ø��g˜t°,ÐQaôcÐà ×$Ñ$ W×-Ò-à˜hÕ'×.Ñ.¨Ô?Ø$Ð$ô 	�‰ØRÐTWØ˜gÕ&×*Ñ*¨9°oÓFô	Hô /¨s°G¸TÀ<ÓPÐPˆÒ]Øˆ
à—+‘+Ð0Ó1×7Ð7°R€KÜ�+—/‘/ )Ó,¬c×2Ò2Ø)4°YÕ)?ˆ˜Ñ&ä0°°g¸w¿{¹{È=Ó?Y×ZÒZÜ˜3 Ô(Ü×!Ñ!÷ló làð "ó €Jð
 (€GˆMÑØ×ÑÔÜˆs�X˜{Ð>¨oÐ>Ó?Ð?÷q 
×	Ð	ú÷ %×$Ð$üò* 	V÷" &×%Ð%ûô ô 	-Ü�L‰LÐZØ tð ÷ -ð	-ús~   Ì$Y3ÍY3Í7ZÎZÎ!ZÎ8ZÏZÑZÑ+ZÒZÓ Z4 Ó3'Z ÔZ Ô&Z4 Ù3Z	ÚZ	Ú Z1	Ú+Z4 Ú1Z4 Ú4#[Û[zclipboard.pastec                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   Ê  s   € ÷ ?ñ ?”4ð ?œDñ ?r   c                 ó’  € \        W4      w  r#V'       d   V#  ^ RIHpHp TP                  R^ 4      ^,           TR&   \        T4      pTP                  RRR7       TR\        P                  4       P                  R	4       R
TR,           R2,          pT! T4      '       gB   \        ^ TR,          ^,
          4      TR&   \        T RRRT! 4       '       d   R/4      # R/4      # TP                  R. 4      P                  \!        T4      4       \        T \#        Y(4      4      #   \         d   p\        T RRT 24      u Rp?# Rp?ii ; i)r•  )Úhas_clipboard_imageÚsave_clipboard_imageé£  zclipboard unavailable: NÚimage_counterT)ÚparentsÚexist_okÚclip_z%Y%m%d_%H%M%SrØ  ú.pngÚattachedFrú   z)Clipboard has image but extraction failedzNo image found in clipboardr„  )Ú_sess_buildingÚhermes_cli.clipboardrÛ  rÜ  rU   rx   r   Ú_session_images_dirÚmkdirÚdatetimeÚnowÚstrftimeÚmaxr£   r  rŠ   r1   Ú_attached_image_result)	ro   rÅ   rI   rÓ   rÛ  rÜ  ÚeÚimg_dirÚimg_paths	   &&       r
   rØ  rØ  É  sG  € ä! &Ó.�L€Gß
Øˆ
ð>ßRð  'Ÿ{™{¨?¸AÓ>ÀÕB€GˆOÑÜ! 'Ó*€GØ‡M�M˜$¨€MÔ.à�Eœ(Ÿ,™,›.×1Ñ1°/ÓBÐCÀ1ÀWÈ_ÕE]ÐD^Ð^bÐcÕcð ñ   ×)Ò)Ü#& q¨'°/Õ*BÀQÕ*FÓ#Gˆ�Ñ Ü�3˜ U¨IÙ;N×;PÒ;PÐ7ð1ó 2ð 	2à.ð1ó 2ð 	2ð ×ÑÐ(¨"Ó-×4Ñ4´S¸³]ÔCÜˆsÔ*¨7Ó=Ó>Ð>øô ô >Ü�C˜Ð!8¸¸Ð<Ó=Õ=ûð>ús   ™D! Ä!EÄ,EÄ;EÅEzimage.attachc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   â  s   € ÷ 'ñ '”4ð 'œDñ 'r   c                 óê  € \        W4      w  r#V'       d   V# \        VP                  R R4      ;'       g    R4      P                  4       pV'       g   \	        V RR4      #  ^ RIHpHpHpH	p V! V4      ;p	'       d   V	R ,          V	R,          rºM&V! V4      w  rËV! V4      p
V
f   \	        V RRV 24      # V
P                  P                  4       V9  d   \	        V RR	V
P                   24      # VP                  R
. 4      P                  \        V
4      4       \        T \!        Y*Y»;'       g    RV
P                   R2R7      4      #   \"         d!   p\	        T R\        T4      4      u Rp?# Rp?ii ; i)ÚpathrG   é¯  úpath required)Ú_IMAGE_EXTENSIONSÚ_detect_file_dropÚ_resolve_attachment_pathÚ_split_path_inputÚ	remainderNé°  zimage not found: zunsupported image: r„  ú[User attached image: Ú])rù  r�   rÝ  )rä  r1   r   r2   rx   Úclirõ  rö  r÷  rø  ÚsuffixÚlowerÚnamer  rŠ   r£   rì  rU   )ro   rÅ   rI   rÓ   r"   rõ  rö  r÷  rø  r…  Ú
image_pathrù  Ú
path_tokenrí  s   &&            r
   rØ  rØ  á  sd  € ä! &Ó.�L€Gß
Øˆ
Ü
ˆf�j‰j˜ Ó$×*Ð*¨Ó
+×
1Ñ
1Ó
3€CßÜ�C˜˜Ó/Ð/ð'÷	_ó 	_á'¨Ó,Ð,ˆ7Ö,Ø$+¨F¥O°W¸[Õ5I™	á$5°cÓ$:Ñ!ˆJÙ1°*Ó=ˆJØÒ!Ü˜C Ð):¸:¸,Ð'GÓHÐHØ×Ñ×"Ñ"Ó$Ð,=Ô=Ü˜˜TÐ%8¸¿¹Ð8IÐ#JÓKÐKØ×ÑÐ,¨bÓ1×8Ñ8¼¸Z»ÔIÜ�3Ô.ØØ×&^Ð&^Ð5KÈJÏOÉOÐK\Ð\]Ð3^ô`ó að 	aøô ô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús1   Á!E Á=7E Â58E Ã.AE ÅE2ÅE-Å'E2Å-E2zimage.attach_bytesc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   þ  s   € ÷ ]ñ ]”4ð ]œDñ ]r   c                ó”  € \        W4      w  r#V'       d   V# \        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P                  4       pV'       g   \	        V RR4      # \        WR\        RRR	7      w  rSVe   V# \        VP                  RR4      ;'       g    R4      p\        VP                  RR4      ;'       g    R4      P                  4       P                  4       pV'       d!   VP                  R4      '       g
   RV,           p\        YV;'       g    V'       d   RV 2MR4      pV\        4       9  d   \	        V RRV 24      #  \        W%VRR7      p	\        T \        Y)RRT	P                   R2\!        T4      R7      4      #   \         d   p
\	        T RRT
 24      u R
p
?
# R
p
?
ii ; i)z¨Attach an image from base64 bytes (remote client); reply mirrors ``image.attach``.
``filename``/``ext`` hint the extension, else magic bytes decide (fallback ``.png``).Úcontent_base64rß   rG   ró  zcontent_base64 requiredzimage/Úimagezimage is empty©Úmime_prefixÚ	max_bytesÚlabelÚ	empty_msgNÚfilenameÚextÚ.Úxrú  zunsupported image extension: Úupload©ÚprefixrÝ  zwrite failed: rû  rü  )rù  r�   Úbytes)rä  r1   r   r2   rx   Ú_decode_attach_payloadÚ_ATTACH_BYTES_MAX_BYTESrÿ  r¿   Ú_sniff_image_extÚ_allowed_image_extensionsÚ_queue_attached_imagerU   r£   rì  r   rc   )ro   rÅ   rI   rÓ   Úraw_b64Ú	img_bytesr  Úext_hintr  rï  rí  s   &&         r
   rØ  rØ  ý  s£  € ô " &Ó.�L€Gß
Øˆ
Ü�&—*‘*Ð-Ó.×JÐJ°&·*±*¸VÓ2D×JÐJÈÓK×QÑQÓS€GßÜ�C˜Ð8Ó9Ð9Ü+Ø (Ô6MØÐ!1ô3�N€Ið ‚Øˆ
Ü�6—:‘:˜j¨"Ó-×3Ð3°Ó4€HÜ�6—:‘:˜e RÓ(×.Ð.¨BÓ/×5Ñ5Ó7×=Ñ=Ó?€Hß˜×+Ñ+¨C×0Ò0Ø˜•>ˆÜ
˜9×&VÐ&VÇX°Q°x°j±>ÐSUÓ
W€CØ
Ô+Ó-Ô-Ü�C˜Ð!>¸s¸eÐDÓEÐEð5Ü(¨¸SÈÔRˆô ˆsÔ*ØØÐ3°H·M±M°?À!ÐDÌCÐPYËNô\ó ]ð ]øô ô 5Ü�C˜ °¨sÐ3Ó4Õ4ûð5ús   Å$F" Æ"GÆ-GÆ<GÇGz
pdf.attachc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r     s   € ÷ 6]ñ 6]”4ð 6]œDñ 6]r   c                ó:  € ^ RI p^ RIp^ RIp\        W4      w  rVV'       d   V# VP	                  R4      f   \        V RR4      # \        VP                  RR4      ;'       g    R4      P                  4       p\        VP                  R4      ;'       g    VP                  R4      ;'       g    R4      P                  4       pV'       g   V'       g   \        V R	R
4      # VP                  RR7      ;_uu_ 4       p	\        V	4      p
\        WW§V4      w  r¼pVe   VuuRRR4       # \        W4      w  rÞpVe   VuuRRR4       # RRRRR\        V4      R\        V4      \        V4      \        V
R,          4      .
p^ RIHp  VP                  VRR^xVP                   RRV! 4       RR7	      pTP$                  ^ 8w  dw   TP&                  ;'       g    TP(                  ;'       g    RP                  4       P+                  4       R+R p\        T RRRP-                  T4      ,           4      uuRRR4       # \/        T
P1                  R4      4      pT'       g   \        T RR4      uuRRR4       # . pT F{  pTP2                  P5                  R^4      R,,          p \7        T4      p\=        TTP?                  4       RR T 2R7      pTPA                  R\        T4      RT/\C        T4      C4       K}  	  \E        T R!RR"TR#\;        T4      R$TR%\;        TR&,          4      R'R(T R)\;        T4       R*2/4      uuRRR4       #   TP"                   d    \        T RR4      u uuRRR4       # i ; i  \8         d    T\;        T4      ,           p Låi ; i  + '       g   i     R# ; i)-z˜Attach a PDF by rendering each page to PNG (``pdftoppm``; 5028 if missing) and
queuing the pages as images.  Host ``path`` or base64 ``content_base64``.NÚpdftoppmé¤  z7pdftoppm not installed (poppler-utils package required)rò  rG   r  rß   ró  zpath or content_base64 requiredÚpdf_attach_r  z-pngz-rÚ150z-fz-lÚpage)Úwindows_hide_flagsTzutf-8r‰   F)Úcapture_outputr�   ÚtimeoutÚstdinÚencodingÚerrorsÚcreationflagsÚcheckzpdftoppm timed out (>120s)zpdftoppm failed: z | z
page-*.pngz)pdftoppm produced no pages (corrupt PDF?)Ú-râ  Úpdf_prã  r  Úpages_attachedÚpagesÚcountr„  r�   z[User attached PDF: z (z
 page(s))]éýÿÿÿéÿÿÿÿ)#ÚshutilÚ
subprocessÚtempfilerä  Úwhichrx   r1   r   r2   ÚTemporaryDirectoryÚPathÚ_pdf_attach_sourceÚ_pdf_page_rangeÚhermes_cli._subprocess_compatr#  ÚrunÚDEVNULLÚTimeoutExpiredÚ
returncodeÚstderrÚstdoutÚ
splitlinesr‹   ÚsortedÚglobÚstemÚsplitr!   r    rc   r  Ú
read_bytesrŠ   Ú_image_metar£   )ro   rÅ   r2  r3  r4  rI   rÓ   Úraw_pathr  ÚtdÚtd_pathÚpdf_pathÚdisplay_nameÚ
first_pageÚ	last_pageÚargvr#  ÚresÚtailÚrenderedÚattached_pagesÚsrcÚpage_numÚpage_intÚdsts   &&                       r
   rØ  rØ    s[  € ó ÛÛÜ! &Ó.�L€Gß
Øˆ
Ø‡|�|�JÓÒ'Ü�C˜ÐXÓYÐYÜ�6—:‘:˜f bÓ)×/Ð/¨RÓ0×6Ñ6Ó8€HÜ�&—*‘*Ð-Ó.×JÐJ°&·*±*¸VÓ2D×JÐJÈÓK×QÑQÓS€GßŸGÜ�C˜Ð@ÓAÐAØ	×	$Ñ	$¨MÐ	$×	:Ô	:¸bÜ�r“(ˆÜ&8¸ÀgÐY`Ó&aÑ#ˆ ØŠ?Ø÷	 
;Ò	:ô
 &5°SÓ%AÑ"ˆ
˜sØŠ?Ø÷ 
;Ò	:ð ˜  e¨T´3°z³?ÀDÌ#ÈiË.Ü�‹Mœ3˜w¨Õ/Ó0ð2ˆõ 	Eð	Að —.‘.Ø T°¸cÈ×I[ÑI[Ø ¨ÑBTÓBVÐ^cð !ó eˆCð
 �>‰>˜QÔØ—J‘J×2Ð2 #§*¡*×2Ð2°×9Ñ9Ó;×FÑFÓHÈÈÐMˆDÜ˜˜TÐ#6¸¿¹ÀDÓ9IÕ#IÓJ÷- 
;Ò	:ô. ˜'Ÿ,™, |Ó4Ó5ˆßÜ˜˜TÐ#NÓO÷3 
;Ò	:ð4 ˆÛˆCØ—x‘x—~‘~ c¨1Ó-¨bÕ1ˆHð<Ü˜x›=�ô (Ø˜Ÿ™Ó)¨6¸EÀ(ÀÐ:LôNˆCà×!Ñ! 6¬3¨s«8°V¸XÐ"ZÌÐUXÓIYÐ"ZÖ[ñ ô �3Ø˜˜j¨,Ð8HÌ#ÈnÓJ]Ø�^ W¬c°'Ð:KÕ2LÓ.MØÐ*¨<¨.¸¼3¸~Ó;NÐ:OÈzÐZð\ó ]÷I 
;Ò	:øð$ ×(Ñ(ô 	AÜ˜˜TÐ#?Ó@Ñ@÷' 
;Ò	:ð$	Aûô ô <Ø%¬¨NÓ(;Õ;’ð<ú÷? 
;×	:Ð	:úsz   Ã9!N	Ä%N	Å=N	Æ)L8Æ*#N	ÇN	Ç"AN	È1.N	É**N	ÊM&Ê BN	Ì8M#ÍN	Í"M#Í#N	Í&N	ÎN	ÎN	ÎN	Î	N	zfile.attachc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   W  s   € ÷ 'ñ '”4ð 'œDñ 'r   c                óŒ  a€ \        SV 4      w  r#V'       d   V# V3R lR 4       w  rEpV'       g   V'       g   \        V RR4      #  \        W$WVR7      w  rx\        W'4      p	\	        V RRRVP
                  R\        V4      R	V	R
R\        V	4       2RV/4      #   \         d!   p
\        T R\        T
4      4      u Rp
?
# Rp
?
ii ; i)z¤Stage a non-image file into the session workspace; returns a workspace-relative
``@file:`` ref.  ``data_url`` carries the bytes when ``path`` isn't gateway-visible.c              3   óŠ   <"  € T F8  p\        SP                  VR 4      ;'       g    R 4      P                  4       x € K:  	  R# 5i©rG   N©r1   r   r2   r¥  s   & €r
   rC   r§  ]  s:   øé € ð TÙ6R°ŒˆF�J‰J�q˜"Ó×#Ð# Ó$×*Ñ*×,Ð,Ó6Rùs
   ƒ"A¦Arò  r   ró  zpath or data_url required)rH  Údata_urlr   rã  TÚref_pathÚref_textz@file:Úuploadedr  N)rò  r]  r   )	rä  rx   Ú_stage_session_file_attachmentÚ_attachment_ref_pathr£   r   r1   Ú_format_ref_valuerU   )ro   rÅ   rI   rÓ   r"   r]  r   Ústored_pathr`  r^  rí  s   &f         r
   rØ  rØ  V  sÕ   ø€ ô " &¨#Ó.�L€Gß
Øˆ
ôTÙ6RóTÑ€C�4ç—xÜ�C˜Ð:Ó;Ð;ð	'Ü >Ø¨Hô!AÑˆä'¨Ó=ˆÜ�3Ø˜˜f k×&6Ñ&6¸ÄÀKÓ@PØ˜ *°Ô7HÈÓ7RÐ6SÐ.TØ˜ð"ó #ð 	#øô ô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús   ÁAB ÂCÂ#B>Â8CÂ>Czimage.detachc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   n  s   € ÷ 3ñ 3”4ð 3œDñ 3r   c           
      ó¤  € \        W4      w  r#V'       d   V# \        VP                  R R4      ;'       g    R4      P                  4       pV'       g   \	        V RR4      # \        VP                  R. 4      ;p4      pV Uu. uF  qwV8w  g   K  VNK  	  upVR&   \        V R\        VR,          4      V8g  R\        VR,          4      /4      # u upi )rò  rG   ró  rô  r„  Údetachedr/  )rä  r1   r   r2   rx   rc   r  r£   )ro   rÅ   rI   rÓ   r"   ÚimagesÚbeforerò  s   &&      r
   rØ  rØ  m  sÊ   € ä! &Ó.�L€Gß
Øˆ
Ü
ˆf�j‰j˜ Ó$×*Ð*¨Ó
+×
1Ñ
1Ó
3€CßÜ�C˜˜Ó/Ð/Ü˜7×-Ñ-Ð.?ÀÓDÐD�ÓE€FÙ39Ó!I±6¨4ÀS¹[§$ $±6Ñ!I€GÐÑÜˆsØ”C˜Ð 1Õ2Ó3°vÑ=Ø”�WÐ.Õ/Ó0ð2ó 3ð 3ùò "Js   ÂCÂCzinput.detect_dropc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   }  s   € ÷ 'ñ '”4ð 'œDñ 'r   c                 óÚ  € \        W4      w  r#V'       d   V#  ^ RIHp T! \        VP	                  RR4      ;'       g    R4      4      pV'       g   \        V RR/4      # VR,          VR,          rvVR,          '       d}   VP                  R	. 4      P                  \        V4      4       \        T RR
RR
R\        V4      R\        VR	,          4      RT;'       g    RVP                   R2/\        V4      C4      # RV R2V'       d   RV 2MR,           p\        V RR
RRR\        V4      RVP                  RV/4      #   \         d!   p	\        T R\        T	4      4      u Rp	?	# Rp	?	ii ; i)r•  )rö  r�   rG   ÚmatchedFrò  rù  Úis_imager„  Tr/  rû  rü  z[User attached file: r‚   r   rÝ  N)r·  rý  rö  r1   r   r£   r  rŠ   rc   r   rG  rU   rx   )
ro   rÅ   rI   rÓ   rö  r…  Ú	drop_pathrù  r�   rí  s
   &&        r
   rØ  rØ  |  sk  € ä Ó,�L€Gß
Øˆ
ð'Ý)Ù#¤C¨¯
©
°6¸2Ó(>×(DÐ(DÀ"Ó$EÓFˆßÜ�s˜Y¨Ð.Ó/Ð/Ø& v�°¸Õ0D�9Ø�:×ÔØ×ÑÐ0°"Ó5×<Ñ<¼SÀ»^ÔLÜ�sØ˜4 ¨T°6¼3¸y»>Øœ˜WÐ%6Õ7Ó8Ø˜	×OÐOÐ'=¸i¿n¹nÐ=MÈQÐ%Oð*ô ˜iÓ(ð	*ó +ð +ð
 ' y k°Ð3Ï9¸¸I¸;Ñ7GÐZ\Õ]ˆÜ�3Ø�t˜Z¨°¼¸I»ÈÐPY×P^ÑP^Ø�Dðó ð 	øô ô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús;   ™%D? ¿D? ÁD? Á BD? Ã<D? Ä	5D? Ä?E*Å
E%ÅE*Å%E*zprompt.backgroundc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   —  s   € ÷ Yñ Y”4ð YœDñ Yr   c                 óp   aaa€ \        WR 4      w  oopopV'       d   V# VVV3R lp\        V SSVRV4      # )Úbgc                  óN  <€ ^ RI Hp  \        SR,          S4      p\        VP	                  R4      4      ;_uu_ 4       pV ! R/ / VCRV/CB p VP                  SSR7      p\        P                  ! \        4      ;_uu_ 4        VP                  4        RRR4       RRR4       \        X4      #   + '       g   i     L#; i  \        P                  ! \        4      ;_uu_ 4        TP                  4        RRR4       i   + '       g   i     i ; i; i  + '       g   i     L�; i)r•  ©ÚAIAgentrY  Ú
session_db)Úuser_messageÚtask_idNrb   )Ú	run_agentrt  Ú_background_agent_kwargsÚ_side_agent_session_dbr   Úrun_conversationr   r   rU   ÚcloseÚ_final_response_text)rt  Úkwargsru  rY  rª  rI   rw  r�   s        €€€r
   ÚbodyÚ_.<locals>.bodyœ  sÎ   ø€ Ý%Ü)¨'°'Õ*:¸GÓDˆÜ# F§J¡J¨|Ó$<×=Ô=ÀÙÑCÐB ÐB¨°zÑBÑCˆEð"Ø×/Ñ/¸TÈ7Ð/ÓS�ô
  ×(Ò(¬×3Õ3Ø—K‘K”M÷ 4÷ >ô $ FÓ+Ð+÷ 4×3û”Z×(Ò(¬×3Õ3Ø—K‘K”M÷ 4×3×3Ð3ý÷ >×=úsS   ½DÁCÁ "DÂB.	ÂDÂ.B>Â9DÃ#DÃ$C>Ã5	DÃ>DÄ	DÄDÄD$	zbackground.complete)Ú_side_agent_argsÚ_spawn_side_agent)ro   rÅ   ÚparentrÓ   r  rI   rw  r�   s   &&   @@@r
   rØ  rØ  –  s@   ú€ ä*:¸3ÈÓ*MÑ'€GˆT�6˜7 Cß
Øˆ
÷,ô ˜S '¨7°FÐ<QÐSWÓXÐXr   z
prompt.btwc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   ¯  s   € ÷ Wñ W”4ð WœDñ Wr   c           
     óP  aa	a
a€ \        WR4      w  por4pV'       d   V# VP                  R4      o\        \        SRR4      ;'       g    VP                  R4      ;'       g    . 4      o
R
 Uu/ uF  pV\        SVR4      bK  	  upo	VV	V
V3R lp\	        WWCRVRS/R	7      # u upi )z¥Side question over a snapshot of the live conversation (``agent/side_question.py``);
history, alternation and prompt cache stay untouched.  Answer: ``btw.complete``.ÚbtwrY  Ú_session_messagesNr   c                  ó<   <€ ^ RI Hp  V ! SSSSR7      ;'       g    R# )r•  )Úanswer_side_question)Úparent_agentÚmain_runtimerG   )Úagent.side_questionr‰  )r‰  rY  r‹  Úsnapshotr�   s    €€€€r
   r  r€  »  s-   ø€ Ý<Ù#Ø�(¨¸\ôK÷ Qð QØNPð	Qr   zbtw.completeÚquestion)Úextra)ÚmodelÚproviderÚbase_urlÚapi_keyÚapi_moder:  )r�  r   r   rS   r‚  )ro   rÅ   rI   rƒ  rw  rÓ   r¦  r  rY  r‹  r�  r�   s   &&      @@@@r
   rØ  rØ  ®  sÂ   û€ ô +;¸3ÈÓ*NÑ'€GˆT�6 Cß
Øˆ
Ø�K‰K˜Ó €EÜ”G˜EÐ#6¸Ó=×]Ð]ÀÇÁÈYÓAW×]Ð]Ð[]Ó^€Hñ XóYáWˆAð 	
Œ7�5˜!˜TÓ"Ò"ÙWñY€L÷Qð Qô
 Ø�g ~°tÀJÐPTÐCUôWð WùòYs   Á.B#zpreview.restartc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   Å  s   € ÷ +*ñ +*”4ð +*œDñ +*r   c                 óŠ  aa	a
aaaa€ \        SV 4      w  opV'       d   V# V3R  lR 4       w  r4pV'       g   \        V RR4      # R\        P                  4       P                  R,           2oSP                  RR4      o	SP                  R4      ;'       g    \        P                  ! 4       ;_uu_ 4        \        SP                  R4      ;'       g    . 4      pR	R	R	4       \        X4      o
\        W4V\        S
4      4      o\        V4      oV	V
VVVV3R
 lpV3R lp\        V SSS	RVSVR7      #   + '       g   i     L`; i)c              3   óˆ   <"  € T F7  p\        SP                  V4      ;'       g    R 4      P                  4       x € K9  	  R# 5ir[  r\  r¥  s   & €r
   rC   r§  É  s4   øé € Ð]ÑC\¸aœ˜VŸZ™Z¨›]×0Ð0¨bÓ1×7Ñ7×9Ð9ÓC\ùs
   ƒ!A¥Aé¬  zurl requiredÚpreview_ºNé   Nr:  rG   rD  r   Nc            	      ó4  <€ ^ RI Hp  ^ RIHp S'       d   V! S	RS/4       S'       d   R\	        S4       R2MRp\        RSRS	R	R
V 2/4       V ! R/ \        SR,          S	4      B\        SS	4      B P                  SS	S;'       g    RR7      p\        V4      # )r•  rs  )Úregister_task_env_overridesÚcwdz (with z$ parent-session messages of context)rG   zpreview.restart.progressrw  r�   zStarting hidden restart agentrY  N)rv  rw  Úconversation_historyrb   )
rx  rt  Útools.terminal_toolr�  rc   r`  Ú_ephemeral_preview_agent_kwargsÚ_preview_restart_callbacksr{  r}  )
rt  r�  Úhistory_noterª  rƒ  Úparent_historyÚpreview_cwdÚpromptrI   rw  s
       €€€€€€r
   r  r€  Ô  sÃ   ø€ Ý%ÝCßÙ'¨°%¸Ð1EÔF÷ ð ”c˜.Ó)Ð*Ð*NÑOØ#%ð 	ô 	Ø&¨Ø˜ Ð+HÈÈÐ)WÐXô	Zñ
 ñ 
Ü-¨g°gÕ.>ÀÓHð
ä(¨°Ó9ñ
÷ Ñ
Ø¨À~×G]ÐG]ÐY]ð ó _ð 	ô
 $ FÓ+Ð+r   c                  ó¢   <€ \         P                  ! \        4      ;_uu_ 4        ^ RIHp  V ! S4       RRR4       R#   + '       g   i     R# ; i)r•  )Úclear_task_env_overridesN)r   r   rU   r   r¨  )r¨  rw  s    €r
   ÚcleanupÚ_.<locals>.cleanupè  s.   ø€ Ü× Ò ¤×+Õ+ÝDÙ$ WÔ-÷ ,×+×+Ò+ús	   ¤=½A	zpreview.restart.complete)rž  r©  )Úurlrž  Úcontext)Ú_sessrx   ÚuuidÚuuid4Úhexr   r   Únullcontextr   Ú_preview_restart_historyÚ_preview_restart_promptr'   Ú_validated_preview_cwdr‚  )ro   rÅ   rÓ   r«  rž  r¬  r�  r  r©  rƒ  r¤  r¥  r¦  rI   rw  s   &f       @@@@@@r
   rØ  rØ  Ä  s  þ€ ä˜ Ó%�L€GˆSß
Øˆ
Ü]ÑC\Ó]Ñ€CˆgßÜ�C˜˜~Ó.Ð.ØœŸ™›×)Ñ)¨"Õ-Ð.Ð/€GØ�Z‰Z˜ bÓ)€FØ	�‰�^Ó	$×	@Ð	@¬
×(>Ò(>Ó(@×	@Ñ	@Ü˜Ÿ™ IÓ.×4Ð4°"Ó5ˆ÷ 
Aä-¨hÓ7€NÜ$ S¨w¼¸^Ó8LÓM€FÜ(¨Ó-€K÷,ò ,õ(.ô ØˆW�g˜vÐ'AÀ4Ø ô*ð *÷A 
A×	@ús   Â5%D2Ä2E	zclarify.lockc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   ô  s   € ÷ >ñ >”4ð >œDñ >r   c                 óH  € \        VP                  R 4      ;'       g    R4      p\        VP                  R4      ;'       g    R4      pV'       d	   V'       g   \        V RR4      # VP                  RR4      pVe.   \        V\         4      '       g   \        P                  VRR7      p\        WW44      ;pe   V# ^ R	IHp  VP                  W#V4      pTf   \        T R
R/4      # \        T R
RRT/4      #   \         d!   p\        T R\        T4      4      u Rp?# Rp?ii ; i)Ú
request_idrG   Úquestion_idé¢  z#request_id and question_id requiredÚanswerNF)Úensure_ascii©Úserver_requestsrt  ÚexpiredÚokÚ	remaining)r1   r   rx   r/   ÚjsonÚdumpsÚ_lock_compute_host_clarifyrx  r½  Úlock_answerr    r£   )	ro   rÅ   r·  r¸  rº  Úproxiedr½  rÀ  rí  s	   &&       r
   rØ  rØ  ó  s  € ä�V—Z‘Z Ó-×3Ð3°Ó4€JÜ�f—j‘j Ó/×5Ð5°2Ó6€KßŸ[Ü�C˜ÐDÓEÐEØ�Z‰Z˜ "Ó%€FØÒ¤*¨V´S×"9Ò"9Ü—‘˜F°�Ó7ˆÜ-¨c¸{ÓSÐSˆÒ`ØˆÝ+ð'Ø#×/Ñ/°
ÈÓPˆ	ð Òä�3˜ 9Ð-Ó.Ð.Üˆs�X˜t [°)Ð<Ó=Ð=øô ô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús   ÃC6 Ã6D!ÄDÄD!ÄD!zrequest.answerc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   
  s   € ÷ +ñ +”4ð +œDñ +r   c                óf  € \        VP                  R4      ;'       g    R4      pVP                  R4      pV'       d   \        V\        4      '       g   \	        V RR4      # ^ RIHp RRRVRV/pVP                  V4      '       g   \        V4      '       d   \        V R	R
/4      # \        V R	R/4      # )u  Answer an open serverâ†’client request from a client that did not receive it (a Bot Mode room
window answering a member's prompt mirrored from its resume snapshot). The response-frame path is
the norm; this is the proxy for it. ``expired`` when the request already ended.rç   rG   rª  r¹  z id and an object result requiredr¼  Újsonrpcz2.0rt  r¿  r¾  )
r1   r   r/   r   rx   rx  r½  Úresolve_responseÚ_relay_compute_host_responser£   )ro   rÅ   r·  rª  r½  Úframes   &&    r
   rØ  rØ  	  s¡   € ô
 �V—Z‘Z Ó%×+Ð+¨Ó,€JØ�Z‰Z˜Ó!€FßœZ¨´×5Ò5Ü�C˜ÐAÓBÐBÝ+Ø˜˜t Z°¸6ÐB€EØ×'Ñ'¨×.Ò.Ô2NÈu×2UÒ2UÜ�3˜ 4Ð(Ó)Ð)Üˆs�X˜yÐ)Ó*Ð*r   zapproval.pendingc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r     s   € ÷ Vñ V”4ð VœDñ Vr   c                 óV   a€ \        W4      w  opV'       d   V# \        V R V3R l4      # )Ú	approvalsc                 ó4   <€ V P                  SR ,          4      # ©rX   ©Úlist_gateway_approvals)ÚarI   s   &€r
   r¯  r°    s   ø€  A×$<Ñ$<¸WÀ]Õ=SÔ$Tr   )r­  Ú_approval_reply©ro   rÅ   rÓ   rI   s   && @r
   rØ  rØ    s0   ø€ ä˜Ó%�L€GˆSß
Øˆ
ÜØˆ[ÔTóVð Vr   zapproval.receivedc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   #  s   € ÷ cñ c”4ð cœDñ cr   c                 óÒ   aa€ \        W4      w  opV'       d   V# \        VP                  R 4      ;o\        4      '       d	   S'       g   \	        V RR4      # \        V RVV3R l4      # )r·  i¦  zrequest_id requiredÚacknowledgedc                 ó6   <€ V P                  SR ,          S4      # rÐ  )Úack_gateway_approval)rÓ  r·  rI   s   &€€r
   r¯  r°  *  s   ø€  q×'=Ñ'=¸gÀmÕ>TÐV`Ô'ar   )r­  r/   r   r1   rx   rÔ  )ro   rÅ   rÓ   r·  rI   s   && @@r
   rØ  rØ  "  s]   ù€ ä˜Ó%�L€GˆSß
Øˆ
Ü F§J¡J¨|Ó$<Ð<�j¼c×BÒBÏ*Ü�C˜Ð4Ó5Ð5ÜØˆ^Õaócð cr   zapproval.respondc                ó0   € V ^8„  d   QhR\         R\         /# r“  r   )r	   s   "r
   r   r   .  s   € ÷ Xñ X”4ð XœDñ Xr   c                 óÜ   aa€ \        SV 4      w  opV'       dC   VP                  R 4      ;'       g    / P                  R4      R8w  d   V# \        S4      oSf   V# \        V RVV3R l4      # )r  r3  i¡  r!  c                 óš   <€ V P                  SR ,          SP                  RR4      SP                  RR4      SP                  R4      R7      # )rX   ÚchoiceÚdenyrd   Fr·  )Úresolve_allr·  )Úresolve_gateway_approvalr   )rÓ  rÅ   rI   s   &€€r
   r¯  r°  9  sD   ø€ �!×,Ñ,Ø�MÕ" F§J¡J¨x¸Ó$@ØŸ
™
 5¨%Ó0¸V¿Z¹ZÈÓ=Uð -ô Wr   )r­  r   Ú"_approval_respond_session_fallbackrÔ  rÕ  s   &f @r
   rØ  rØ  -  sm   ù€ ä˜ Ó%�L€GˆSß
à�G‰G�GÓ×"Ð" ×'Ñ'¨Ó/°4Ô7ØˆJÜ4°VÓ<ˆØŠ?ØˆJÜØˆZõ	WóXð Xr   c                ó$   € V ^8„  d   QhR\         /# r%   r   )r	   s   "r
   r   r   @  s   € ÷ ,ñ ,¼Dñ ,r   c           	     ó^   € RRR\        V4      R\        V R,          4      /VC\        V4      C# )zICommon ``{attached, path, count, ...meta}`` reply after queuing an image.rã  Trò  r/  r„  )r1   rc   rG  )rI   r  r�  s   &&,r
   rì  rì  @  s?   € ð 	�D˜&¤# j£/°7¼CÀÐHYÕ@ZÓ<[ð,à
ð,ä˜zÓ*ð,ð ,r   c           	     óà  € V'       d€   \        WR\        RRR7      w  rVVe   RRV3# VR,          R8w  d   RR\        V RR	4      3# VR
,          pVP                  V4       T\	        VP                  RR4      ;'       g    R4      R3#  ^ RIHp V! V4      p	V	e"   \        V	4      ;p
P                  4       '       g   RR\        V RRV 24      3# V
P                  P                  4       R8w  d   RR\        V RRV
P                   24      3# V
P                  4       P                  \        8”  d"   \        R,          pRR\        V RRV R24      3# WªP                  R3#   \         d    Rp	 LÕi ; i)zAMaterialize the PDF to render: ``(pdf_path, display_name, err)``.zapplication/pdfÚPDFzdecoded PDF is emptyr  N:Né   Ns   %PDF-i±  z0payload is not a PDF (missing %PDF- magic bytes)z	input.pdfr  rG   zuploaded.pdf)r÷  rú  zPDF not found: z.pdfznot a PDF: rÙ   zPDF too large; cap is z MBi   )r  Ú_PDF_ATTACH_MAX_BYTESrx   Úwrite_bytesr1   r   rý  r÷  rU   r7  Úis_filerþ  rÿ  r   ÚstatÚst_size)ro   rÅ   rJ  rH  r  Ú	pdf_bytesrÓ   rK  r÷  r!  ÚpdfÚmbs   &&&&&       r
   r8  r8  G  s{  € çÜ/ØÐ&7ÔCXØÐ#9ô;‰ˆ	ð Š?Ø˜˜s�?Ð"Ø�R�=˜HÔ$Ø˜œt C¨Ð/aÓbÐbÐbØ˜[Õ(ˆØ×Ñ˜YÔ'Øœ˜VŸZ™Z¨
°BÓ7×IÐI¸>ÓJÈDÐPÐPðÝ0Ù+¨HÓ5ˆð Ò¤t¨H£~Ð 5 ×>Ñ>×@Ò@Ø�Tœ4  T¨_¸X¸JÐ+GÓHÐHÐHØ
‡z�z×ÑÓ˜VÔ#Ø�Tœ4  T¨[¸¿¹¸
Ð+CÓDÐDÐDØ
‡x�xƒz×ÑÔ1Ô1Ü" {Õ3ˆØ�Tœ4  TÐ-CÀBÀ4ÀsÐ+KÓLÐLÐLØ—‘˜$ÐÐøô ô ØŠðús   Â	E ÅE-Å,E-c           	     óê  €  \        VP                  R4      ;'       g    ^4      pVP                  R4      f   RM\        VP                  R4      4      pT^8  d   RR\	        T RR4      3# Tf   T\
        ,           ^,
          pY28  d   RR\	        T RR4      3# Y2,
          ^,           \
        8”  d   RR\	        T RR	\
         R
24      3# Y#R3#   \        \        3 d    RR\	        T RR4      3u # i ; i)zJValidate first/last page against the per-call cap: ``(first, last, err)``.rM  rN  Nró  z%first_page/last_page must be integerszfirst_page must be >= 1zlast_page must be >= first_pagei³  zpage range exceeds cap of z pages per attach call)r!   r   r   r    rx   Ú_PDF_ATTACH_MAX_PAGES)ro   rÅ   rM  rN  s   &&  r
   r9  r9  c  s  € ðTÜ˜Ÿ™ LÓ1×6Ð6°QÓ7ˆ
Ø"ŸJ™J {Ó3Ò;‘DÄÀVÇZÁZÐP[ÓE\ÓA]ˆ	ð �A„~Ø�Tœ4  TÐ+DÓEÐEÐEØÒØÔ!6Õ6¸Õ:ˆ	ØÔØ�Tœ4  TÐ+LÓMÐMÐMØÕ Õ!Ô$9Ô9Ø�Tœ4Ø�Ð3Ô4IÐ3JÐJ`Ðaócð cð 	cà $Ð&Ð&øô ”zÐ"ô TØ�Tœ4  TÐ+RÓSÐSÒSðTús   ‚C Ÿ6C Ã!C2Ã1C2c                ó$   € V ^8„  d   QhR\         /# r%   r;  )r	   s   "r
   r   r   x  s   € ÷ dñ d¤Cñ dr   c                 óz   € \        V \        4      '       d   V P                  R \        V 4      4      # \        V 4      # )Úfinal_response)r/   r   r   r1   )rª  s   &r
   r}  r}  x  s0   € Ü9CÀFÌD×9QÒ9QˆF�J‰JÐ'¬¨V«Ó5ÐcÔWZÐ[aÓWbÐcr   c          
      óT   € V ^8„  d   QhR\         R\         R\         R\        R\         /# )r   r«  rž  r¬  Úhas_historyr   )r1   r'   )r	   s   "r
   r   r   |  s7   € ÷ `ñ `¤ð `¬3ð `¼ð `Ì4ð `ÔTWñ `r   c                óº   € RP                  R RRV P                  4        2RT;'       g    R 2V'       d   RV 2MRV'       d   \        MR.\        O 4       4      # )	z†The hidden restart agent's task, shared by this transport and the gateway's
(``gateway/session_tui_side.py``) so the two cannot drift.r‚   c              3   ó:   "  € T F  pV'       g   K  Vx € K  	  R # 5ir>   rb   )r@   Úlines   & r
   rC   Ú*_preview_restart_prompt.<locals>.<genexpr>  s'   é € ð `ñ 'W˜dô [_÷	 ’Tó 'Wùs   ‚
‘
z8The desktop preview pane cannot load a local server URL.zPreview URL: zCurrent working directory: z	(unknown)zPreview console:
rG   )r‹   r2   Ú_PREVIEW_RESTART_HISTORY_NOTEÚ_PREVIEW_RESTART_RULES)r«  rž  r¬  rö  s   &&&&r
   r³  r³  |  sw   € ð �9‰9ñ `ØBÀmÐTW×T]ÑT]ÓT_ÐS`ÐDaØ
% c×&8Ð&8¨[Ð%9Ð:ß*1Ð
˜W˜IÑ&°rß)4Õ%¸"ð	'Wô @Vñ	'Wó `ó `ð `r   c                ó0   € V ^8„  d   QhR\         R\         /# )r   rž  r   r;  )r	   s   "r
   r   r   †  s   € ÷ 	ñ 	¤ð 	¬ñ 	r   c                ó  € ^ RI p V '       d5   VP                  P                  VP                  P                  V 4      4      MRpV'       d$   VP                  P	                  V4      '       d   V# R#   \
        \        3 d     R# i ; i)z�The client's cwd as an existing absolute directory, else ``""``. A malformed client path
(embedded NUL, a missing dir) is "no validated cwd", never an error.NrG   )Úosrò  ÚabspathÚ
expanduserÚisdirÚOSErrorr    )rž  rÿ  r¥  s   &  r
   r´  r´  †  sg   € ó ðßBE�b—g‘g—o‘o b§g¡g×&8Ñ&8¸Ó&=Ô>È2ˆß)¨b¯g©g¯m©m¸K×.HÒ.Hˆ{ÐPÈbÐPøÜ”ZÐ ô Úðús(   †A1 Ž=A1 Á A1 Á-A1 Á/A1 Á1BÂBrž  r�  r©  c               óž   aaaaaaaa€ S;'       g    / oVVVVVVVV3R lp	\        V	RS 2R7      f   \        V RR4      # \        V RS/4      # )uû   Run ``body()`` on a daemon thread under the session's profile home (the ContextVar
doesn't propagate across threads) and cwd; its text â€” or ``error: <exc>`` â€” lands on
``parent`` as ``event`` with ``task_id`` (+ ``extra``).  Replies ``{task_id}``.c            	      ó¤  <€ \        S
S;'       g    \        S	4      SR 7      p  \        S	4      ;_uu_ 4        S! 4       pRRR4       \        SSRS
/SCRX/C4       Se   S! 4        \        V 4       R#   + '       g   i     L=; i  \         d#   p\        SSRS
/SCRRT 2/C4        Rp?LSRp?ii ; i  Se   S! 4        \        T 4       i ; i))rž  Úui_session_idNrw  r�   zerror: )Ú_set_session_contextÚ_session_cwdÚ_session_profile_runtime_scoper`  rU   Ú_clear_session_context)Úsession_tokensr�   rí  r  r©  rž  Úeventr�  rƒ  rI   rw  s      €€€€€€€€r
   r;  Ú_spawn_side_agent.<locals>.run™  sÌ   ø€ ô .Ø˜#×6Ð6¤¨gÓ!6ÀvôOˆð		3Ü/°×8Õ8Ù“v�÷ 9ä�%˜ )¨WÐ!L¸Ð!L¸vÀtÑ!LÔMð Ò"Ù”	Ü" >Ö2÷ 9×8ûô ô 	WÜ�%˜ )¨WÐ!U¸Ð!U¸vÈÐQRÐPSÀ}Ñ!U×VÑVûð	Wûð Ò"Ù”	Ü" >Õ2ús?   ¤B ·A4¿B Á4B	Á?B ÂB4ÂB/Â*B7 Â/B4Â4B7 Â7Czside-agent-)r   r‡  rˆ  rw  )Ú_start_session_workrx   r£   )
ro   rI   rw  rƒ  r  r  rž  r�  r©  r;  s
   &fffffddd r
   r‚  r‚  ’  sR   ÿ€ ð
 �KˆK�R€E÷3ô 3ô0 ˜3 {°7°)Ð%<Ô=ÒEÜ�C˜ÐKÓLÐLÜˆs�Y Ð(Ó)Ð)r   c           	     ó  € \        W4      w  r4V'       d   RRRRV3# VP                  RR4      VP                  RR4      reV'       g   RRRR\        V RR4      3# W5Wb R\        P	                  4       P
                  R,           2R3# )	zTShared admission for the side-agent RPCs: ``(session, text, parent, task_id, err)``.Nr�   rG   r:  r˜  ztext requiredrØ  rš  )r­  r   rx   r®  r¯  r°  )ro   rÅ   r  rI   rÓ   r�   rƒ  s   &&&    r
   r�  r�  ¶  s†   € ä˜Ó%�L€Gß
Ø�T˜4  sÐ*Ð*Ø—:‘:˜f bÓ)¨6¯:©:°lÀBÓ+Gˆ&ßØ�T˜4 ¤t¨C°°Ó'GÐGÐGØ˜& H¨A¬d¯j©j«l×.>Ñ.>¸rÕ.BÐ-CÐ"DÀdÐJÐJr   uC  The conversation history above is from the user's main session â€” including the commands you (the assistant) previously ran to start servers, edit files, or check ports. Use it to figure out exactly which server should be running at this Preview URL. The user did not start a brand new task; recover what they had working.c                ó’   €  ^ RI Hp \        WV! V4      /4      #   \         d!   p\	        T R\        T4      4      u Rp?# Rp?ii ; i)zA``_ok({result_key: call(tools.approval)})``, 5004 on any failure.)ÚapprovaliŒ  N)Útoolsr  r£   rU   rx   r1   )ro   Ú
result_keyÚcallr  rí  s   &&&  r
   rÔ  rÔ  ß  sA   € ð'Ý"Ü�3¡T¨(£^Ð4Ó5Ð5øÜô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús   ‚ ›A¦A»AÁAc                ó$   € V ^8„  d   QhR\         /# )r   rÅ   r   )r	   s   "r
   r   r   è  s   € ÷ ñ ¬tñ r   c                ó@  a€ \        V P                  R4      ;'       g    R4      oS'       dÅ    ^ RIHp \        ;_uu_ 4        \        \        P                  4       4      pRRR4       X Fƒ  w  r4\        VP                  R4      ;'       g    R4      pV'       g   K3  \        ;QJ d%    V3R lV! V4       4       F  '       g   K   RM	  RM! V3R lV! V4       4       4      '       g   K�  Vu # 	  \        V P                  R4      ;'       g    R4      ;p'       d    \        V4      ;pe
   V^,          #  R# R#   + '       g   i     Lã; i  \         d    \        P                  R	RR
7        L�i ; i  \         d    \        P                  RRR
7        R# i ; i)a  Durable-identity fallback for a stale live sid (re-minted after a reconnect while
the prompt stayed on screen): (1) the ``request_id`` against every live session's
pending approvals, then (2) ``session_id`` as a STORED id.  Live session or None.

See #91684.
r·  rG   rÑ  NrX   c              3   ór   <"  € T F,  p\        VP                  R 4      ;'       g    R4      S8H  x € K.  	  R# 5i)r·  rG   N)r1   r   )r@   rŒ   r·  s   & €r
   rC   Ú5_approval_respond_session_fallback.<locals>.<genexpr>÷  s4   øé € ð @á#>˜ô ˜Ÿ™ LÓ1×7Ð7°RÓ8¸JÖFÛ#>ùs   ƒ!7¥7TFz+approval.respond request_id fallback failedrO   r:  z*approval.respond stored-id fallback failed)r1   r   Útools.approvalrÒ  Ú_sessions_lockr   Ú	_sessionsÚitemsrî   rU   rV   rW   Ú_find_live_session_by_key)rÅ   rÒ  ÚliverŸ   rI   Úkeyr±  r·  s   &      @r
   râ  râ  è  sX  ø€ ô �V—Z‘Z Ó-×3Ð3°Ó4€Jßð	WÝ=ß–ÜœIŸO™OÓ-Ó.�÷  ã $‘�Ü˜'Ÿ+™+ mÓ4×:Ð:¸Ó;�ß‘3Ÿ3›3ô @á#9¸#Ô#>ó@Ÿ3Ÿ3š3ô @á#9¸#Ô#>ó@÷ @ô @ð #’Nñ !%ô �V—Z‘Z Ó-×3Ð3°Ó4Ð4€vÖ4ð	VÜ1°&Ó9Ð9�ÒFØ˜A•w�ð Gó ÷!  —ûô ô 	WÜ�L‰LÐFÐQUˆLÖVð	Wûô ô 	VÜ�L‰LÐEÐPTˆLÕUÙð	VúsY   ¯E ÁD<Á!8E Â
E Â)E Ã!E Ã,E Ã0E ÄE7 Ä<E	ÅE Å"E4Å3E4Å7"FÆFc                ó   € V ^8„  d   QhRR/# )r   r   Nrb   )r	   s   "r
   r   r     s   € ÷ 0ñ 0˜ñ 0r   c                ó2   € \        \        4       V RR7       R# )zQPublish this module's helpers + handlers onto ``server``, rebound to its globals.)ÚskipN)rØ  )r   Úglobals)Úservers   &r
   Úregisterr%    s   € ä”“	˜6¨×/r   )rG   T)rÌ   r>   >   r¹   rw  Úturn_idÚ	member_idÚ	thread_idr¬   )NN)rÌ   rË   rÎ   )zPRestart exactly the app intended for the Preview URL, not Hermes Desktop itself.zcThe Preview URL and port are the target. Preserve that target unless you conclude it is impossible.zœIf the prior conversation shows a specific command that bound this URL/port, prefer re-running THAT exact command (in the same cwd) over guessing a new one.z¡First inspect what process, if any, owns the Preview URL port. If a stale server exists, inspect its cwd and prefer that cwd over the Hermes/Desktop process cwd.zŠThe Current working directory is only a hint. Do not assume it is the preview app root when the port owner or files indicate another root.zÂIf the console shows a module-script MIME error for src/main.tsx or similar, a static server is serving source files. Do not restart python -m http.server or any dumb static server for that app.z¾For module-script MIME failures, inspect package.json/vite config in the candidate app root and start the real dev server/bundler (for example npm/pnpm/yarn dev) so module transforms happen.zÃBefore declaring success, verify the Preview URL responds with the intended app, not Hermes Desktop. If it serves Hermes/Desktop UI or another unrelated app, stop that process and report failure.z8Do not modify files. Do not ask the user unless blocked.z@Prefer existing project scripts or commands when they are clear.z:If a stale process owns the needed port, handle it safely.zOStart long-running servers detached/in the background, then return immediately.zLDo not run a foreground dev server command that blocks this background task.zaKeep the final response short: what command/server was started, or why it could not be restarted.);Ú__doc__r   Ú
method_ctxr   r   Ú	_registryÚmethodÚprofile_scopedÚ_profile_scopedrà   rÄ   r   r#   r9   rF   r[   rq   rf   r{   r‘   r    r¤   r®   r±   rÉ   rÕ   rö   rû   r  r  r/  r8  r@  rR  rc  r»  rd  re  rn  rk  rz  r�  Úgateway.session_surfacer‘  rº  rØ  rì  r8  r9  r}  r³  r´  r‚  r�  rü  rû  rÔ  râ  r%  rb   r   r
   Ú<module>r0     s(  ðñó ç 4áÓ€	Ø	×	Ñ	€Ø×*Ñ*€ð JÐ Ø^Ð õZõõMõ2
E÷:õ0EõP?ô2EõñF¸t÷ ð ô4`ò jÐ ò
Pò òF@ò:\0õ~eð Ð õò:nõbcõ&ô&-ô` MðF\Ð ð
 *Ð ð 8Ð õQõ%0õPòõD Añ ˆÓôU@ó ðU@ñp ÐÓô?ó ð?ñ. ˆÓô'ó ð'ñ6 ÐÓô]ó ð]ñ< ˆÓô6]ó ð6]ñr ˆÓô'ó ð'ñ, ˆÓô3ó ð3ñ ÐÓô'ó ð'ñ2 ÐÓôYó ðYñ. ˆÓôWó ðWñ* ÐÓô+*ó ð+*ñ\ ˆÓô>ó ð>ñ* ÐÓô+ó ð+ñ ÐÓôVó ðVñ ÐÓôcó ðcñ ÐÓôXó ðXõ$,òò8'õ*dõ`õ	ð!*Ø79ð!*ØAEð!*ØOSô!*òHKðÐ ð$ Jð ò'õ÷<0r   