+
    iHàj7  ã                  óV  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIH	t	 ^ RI
Ht ^ RIHt ]P                  ! RRR7      tR]R	&   ]P                  ! R
RR7      tR]R&    ! R R]4      t ! R R4      t ! R R4      tR tR tR tR tR tR tR tR R ltR tR t]	R 4       t R# )a‚  Prepare desktop terminal consent without running shells ahead of their turn.

Workers keep execution middleware on its original stack. Only command approval
runs ahead; the existing sequential executor releases each worker and persists
its result before releasing the next. No terminal environment/cwd is acquired
while preparing, and the real execution still runs every command guard.
)ÚannotationsN)Úcontextmanager)ÚAny)Úpropagate_context_to_threadÚterminal_approval_batch)Údefaultzcontextvars.ContextVar[Any]Ú_batchÚterminal_approval_slotÚ_slotc                  ó   € ] tR t^tRtR# )Ú_CancelledPreparation© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__static_attributes__r   ó    ÚB/home/ubuntu/.hermes/hermes-agent/agent/terminal_approval_batch.pyr   r      s   † Ûr   r   c                  ó.   € ] tR t^tR tR tR tR tRtR# )Ú_TerminalSlotc                	óú   € WVuV n         V n        V n        \        P                  ! 4       V n        \        P                  ! 4       V n        R V n        . V n        RV n	        R V n
        R V n        R V n        RV n        R # )NF)ÚbatchÚparsedÚindexÚ	threadingÚEventÚreadyÚreleaseÚfutureÚtidsÚ	preparingÚargsÚdecisionÚ	guard_keyÚclaimed)Úselfr   r   r   s   &&&&r   Ú__init__Ú_TerminalSlot.__init__   sc   € Ø.3¸UÐ+ˆŒ
�D”K ¤Ü—_’_Ó&ˆŒ
Ü —’Ó(ˆŒØˆŒØˆŒ	ØˆŒØˆŒ	ØˆŒØˆŒØˆŽr   c                	ó¼   € V P                   P                  P                  4       '       g'   V P                   P                  P                  '       d   \        R 4      hR# )z@Terminal approval preparation cancelled; command was not startedN)r   Ú	cancelledÚis_setÚagentÚ_interrupt_requestedr   )r&   s   &r   Úcheck_cancelledÚ_TerminalSlot.check_cancelled(   sB   € Ø�:‰:×Ñ×&Ñ&×(Ò(¨D¯J©J×,<Ñ,<×,Q×,QÐ,QÜ'Ð(jÓkÐkñ -Rr   c           	     	óB  € ^ RI Hp V P                  4        \        P                  ! VP
                  4      V n        RV n         VP                  4       p\        VP
                  P                  R4      \        4      '       Ed   ^ RIHpHp T! VP                  V P                  P                   P"                  ;'       g    R\%        V P                  P                   RR4      ;'       g    RR7      p VP
                  R,          pVP
                  P                  R4      '       g   VP'                  V4      ;'       g    TpWsR	,          VP)                  V4      3V n        VP,                  ! V P*                  !  V n        V! V4       R
V n        V P0                  P3                  4        V P4                  P7                  R4      '       g   V P                  4        K3  V P                  4        R#   T! T4       i ; i  R
T n        T P0                  P3                  4        i ; i)é    )Úterminal_toolTÚcommand)Ú!set_current_observability_contextÚ#reset_current_observability_contextÚ Ú_current_turn_id)Útool_call_idÚ
session_idÚturn_idÚ
backgroundÚenv_typeFçš™™™™™¹?N)Útoolsr2   r.   ÚcopyÚdeepcopyr"   r!   Ú_get_env_configÚ
isinstanceÚgetÚstrÚtools.approval_contextr4   r5   Úcall_idr   r,   r9   ÚgetattrÚtrailing_amp_background_commandÚ_docker_has_host_accessr$   Ú_check_all_guardsr#   r   Úsetr   Úwait)r&   ÚrefÚttÚconfigr4   r5   Útokensr3   s   &&      r   ÚprepareÚ_TerminalSlot.prepare,   s‰  € Ý-Ø×ÑÔÜ—M’M #§(¡(Ó+ˆŒ	ØˆŒð	ð ×'Ñ'Ó)ˆFÜ˜#Ÿ(™(Ÿ,™, yÓ1´3×7Ó7ßyÙ:Ø!$§¡¸¿¹×9IÑ9I×9TÑ9T×9ZÐ9ZÐXZÜ# D§J¡J×$4Ñ$4Ð6HÈ"ÓM×SÐSÐQSô�ð@à!Ÿh™h yÕ1�GØŸ8™8Ÿ<™<¨×5Ò5Ø"$×"DÑ"DÀWÓ"M×"XÐ"XÐQX˜Ø&-°jÕ/AÀ2×C]ÑC]Ð^dÓCeÐ%f�D”NØ$&×$8Ò$8¸$¿.¹.Ñ$I�D”Má7¸Ô?à"ˆDŒNØ�J‰J�N‰NÔØ—,‘,×#Ñ# C×(Ò(Ø× Ñ Ö"Ø×ÑÖøñ 8¸Õ?ûà"ˆDŒNØ�J‰J�N‰NÕús>   ÁA;G; Ã )G; Ã*G; Ã33G. Ä'G. Ä?AG. Æ G; Ç.
G8Ç8G; Ç;#Hc                	ó´  € ^ RI Hp \        P                  V 4      pV P                  V P
                  rCVP                  VP                  4      p VP                  VP                   4      ;_uu_ 4       pV P                  P                  V4       V P                  4        VP                  VP                   WTP                  4      pVP                  ! VP                   3/ VP                  4       BRVP                   RVP"                  RV P$                  ^,           RVP&                  /B uuRRR4       V P(                  P                  4        \        P+                  V4       #   + '       g   i     M; i T P(                  P                  4        \        P+                  T4       R#   T P(                  P                  4        \        P+                  T4       i ; i)r1   )Útool_executorÚexecuteÚscope_blockÚdisplay_indexÚauthorization_gateN)r,   rT   r
   rK   r   r   rM   Útask_idÚ_registered_tool_workerr    Úappendr.   Ú_resolve_sequential_dispatchÚmessagesÚ$_run_agent_tool_execution_middlewareÚmiddleware_kwargsrU   rV   r   rX   r   Úreset)r&   ÚteÚtokenÚpcr   rM   ÚtidÚdispatchs   &       r   ÚrunÚ_TerminalSlot.runK   sQ  € Ý-Ü—	‘	˜$“ˆØ—K‘K §¡ˆEØ�f‰f�U—]‘]Ó#ˆð	Ø×+Ñ+¨E¯K©K×8Ô8¸CØ—	‘	× Ñ  Ô%Ø×$Ñ$Ô&Ø×:Ñ:¸5¿;¹;ÈÏ^É^Ó\�Ø×>Ò>Ø—K‘KñØ#&×#8Ñ#8Ó#:ñØDL×DTÑDTðà "§¡ðà>B¿j¹jÈ1½nðð (-×'?Ñ'?ò÷	 9Ñ8ð �J‰J�N‰NÔÜ�K‰K˜Õ÷ 9×8úÐ8ð �J‰J�N‰NÔÜ�K‰K˜Öøð �J‰J�N‰NÔÜ�K‰K˜Õús%   Á#F& Á2B5E!Ä'
F& Å!E1	Å,F& Æ&1G)r"   r   r%   r#   r   r$   r   r   r!   r   r   r    N)	r   r   r   r   r'   r.   rQ   rf   r   r   r   r   r   r      s   † ò
òlòö>r   r   c                  ó(   € ] tR t^_tR tR tR tRtR# )Ú_TerminalBatchc           	     	óF  € ^ RI Hp ^ RIHp WVuV n        V n        V n        \        P                  ! 4       V n	        . V n
        V! 4       V n        V! \        V4      R7      V n        \        V4       UUu. uF  w  rx\        WV4      NK  	  uppV n        RV n        R# u uppi )r1   )Ú _ConcurrentToolAuthorizationGate)ÚDaemonThreadPoolExecutor)Úmax_workersFN)Úagent.tool_executorrk   Útools.daemon_poolrl   r,   r]   rY   r   r   r*   Úpending_approvalsrX   ÚlenÚexecutorÚ	enumerater   ÚslotsÚfailure_seen)	r&   r,   r]   rY   r   rk   rl   Úirc   s	   &&&&&    r   r'   Ú_TerminalBatch.__init__`   sƒ   € ÝHÝ>Ø27À7Ð/ˆŒ
�D”M 4¤<Ü"ŸšÓ*ˆŒØ!#ˆÔÙ"BÓ"DˆÔÙ0¼SÀ»[ÔIˆŒÜ>GÈÔ>OÔPÑ>O±U°Q”m D¨aÖ0Ñ>OÒPˆŒ
ð "ˆÖùó Qs   Á4Bc                	óD  € ^ RI Hp V P                   EF  pVP                  4        V P                  P                  \        VP                  4      4      Vn        V! 4       p\        P                  ! 4       pV P                  P                  4       pVP                  P                  R4      '       d   K   VP                  4        \        P                  ! 4       V,
          V P                  P                  4       V,
          ,
          pVf   K{  Wc8¼  g   Kƒ  \        R4      h	  R# )r1   )Ú _resolve_sequential_tool_timeoutr=   NzBTerminal approval preparation timed out; commands were not started)rn   ry   rt   r.   rr   Úsubmitr   rf   r   ÚtimeÚ	monotonicrX   Úexcluded_secondsr   rL   ÚTimeoutError)r&   ry   ÚslotÚtimeoutÚstartedÚbaselineÚelapseds   &      r   ÚstartÚ_TerminalBatch.startp   sÊ   € ÝHØ—J•JˆDØ× Ñ Ô"ØŸ-™-×.Ñ.Ô/JÈ4Ï8É8Ó/TÓUˆDŒKÙ6Ó8ˆGÜ—n’nÓ&ˆGØ×.Ñ.×?Ñ?ÓAˆHð —j‘j—o‘o c×*Ô*Ø×$Ñ$Ô&ÜŸ.š.Ó*¨WÕ4¸×8OÑ8O×8`Ñ8`Ó8bÐemÕ8mÕn�ØÔ&¨7Ö+=Ü&Ð'kÓlÐló r   c                	ój  € ^ RI Hp ^ RIHp VP                  ;_uu_ 4        V P
                  P                  4        V P                   F  w  r4VP                  P                  V. 4      pWE9   d3   VP                  V4       RVn        VP                  P                  4        V'       d   Kc  VP                  P                  VR4       K�  	  V P                  P                  4        RRR4       V P                   F†  pVP                   P                  4        VP"                  f   K-  VP"                  P%                  4       '       d   KO  V! V P&                  VP(                  4       VP"                  P+                  4        Kˆ  	  V P,                  P/                  RRR7       R#   + '       g   i     LÅ; i)r1   )Ú_interrupt_worker_tids©ÚapprovalÚdenyNFT)rL   Úcancel_futures)rn   r‡   r>   r‰   Ú_lockr*   rK   rp   Ú_gateway_queuesrC   ÚremoveÚresultÚeventÚpopÚclearrt   r   r   Údoner,   r    Úcancelrr   Úshutdown)r&   r‡   r‰   Úsession_keyÚentryÚqueuer   s   &      r   ÚcloseÚ_TerminalBatch.close€   s'  € Ý>Ý"ð �^�^‹^Ø�N‰N×ÑÔ Ø&*×&<Ô&<Ñ"�Ø ×0Ñ0×4Ñ4°[À"ÓE�Ø”>Ø—L‘L Ô'Ø#)�E”LØ—K‘K—O‘OÔ%ß‘uØ×,Ñ,×0Ñ0°¸dÖCñ '=ð ×"Ñ"×(Ñ(Ô*÷ ð —J”JˆDØ�L‰L×ÑÔØ�{‰{Ô&¨t¯{©{×/?Ñ/?×/AÔ/AÙ& t§z¡z°4·9±9Ô=Ø—‘×"Ñ"Ö$ñ	 ð
 	�‰×Ñ E¸$ÐÖ?÷! �^ús   ¡BF"Â+:F"Æ"F2	)	r,   rX   r*   rr   ru   r]   rp   rt   rY   N)r   r   r   r   r'   r„   r™   r   r   r   r   ri   ri   _   s   † ò"ò mö @r   ri   c                ó‚   € \         P                  4       pVe'   V P                  R8X  d   VP                  V 4       R # R # R # )NÚterminal)r
   rC   ÚnamerQ   )rM   r   s   & r   Úprepare_current_terminalrž   ˜   s2   € Ü�9‰9‹;€DØÒ˜CŸH™H¨
Ô2Ø�‰�SÖñ 3Ñr   c                óä   a aaaaaa€ \         P                  4       oSf   S # ^ RIHo \        P
                  ! 4       oVV VV3R lp\        V4      o\        P                  ! 4       oRoVVV3R lpV# )zFA middleware-owned thread must not lose the batch's execution barrier.)rZ   c                 ó4  <€ \         P                  ! 4       S8X  d	   S! V / VB # S! SP                  P                  4      ;_uu_ 4       pSP                  P                  V4       SP                  4        S! V / VB uuR R R 4       #   + '       g   i     R # ; i©N)r   Ú	get_identr   r,   r    r[   r.   )r"   Úkwargsrd   rZ   re   Ú	owner_tidr   s   *, €€€€r   ÚtrackedÚ'bind_prepared_dispatch.<locals>.tracked§   su   ø€ Ü×ÒÓ  IÔ-Ù˜TÐ, VÑ,Ð,Ù$ T§Z¡Z×%5Ñ%5×6Ô6¸#Ø�I‰I×Ñ˜SÔ!Ø× Ñ Ô"Ù˜TÐ, VÑ,÷ 7×6×6Ó6ús   Á3BÂB	Fc                 óŠ   <€ S;_uu_ 4        S'       d   \        R 4      hRoRRR4       S! V / VB #   + '       g   i     L; i)z5Hermes tool execution callback invoked more than onceTN)ÚRuntimeError)r"   r£   r%   ÚinvokeÚlocks   *,€€€r   ÚonceÚ$bind_prepared_dispatch.<locals>.onceµ   s;   ø€ çŠTßÜ"Ð#ZÓ[Ð[ØˆG÷ ñ �tÐ&˜vÑ&Ð&÷	 �Tús	   Œ2²A	)r
   rC   rn   rZ   r   r¢   r   ÚLock)	re   r¥   r«   rZ   r%   r©   rª   r¤   r   s	   f  @@@@@@r   Úbind_prepared_dispatchr®   ž   s^   þ€ ä�9‰9‹;€DØ‚|ØˆÝ;ä×#Ò#Ó%€I÷-ð -ô )¨Ó1€Fô �>Š>Ó€DØ€G÷'ð €Kr   c                óZ  € \         P                  4       pVf   R # VP                   F€  pVP                  P	                  VP
                  4      P                  V 8X  g   K9  VP                  '       d   KM  RVn        VP                  4        VP                  P                  4        Vu # 	  R # )NT)r   rC   rt   r   rM   rY   rF   r%   r.   r   rK   )rF   r   r   s   &  r   Útake_prepared_callr°   À   sw   € Ü�J‰J‹L€EØ‚}ÙØ—”ˆØ�;‰;�?‰?˜5Ÿ=™=Ó)×1Ñ1°WÖ<ÀTÇ\Ç\Â\ØˆDŒLØ× Ñ Ô"Ø�L‰L×ÑÔØŠKñ ñ r   c                 ón   € \         P                  4       p V e   V P                  P                  4        R # R # r¡   )r
   rC   r   rK   ©r   s    r   Úapproval_publishedr³   Í   s&   € Ü�9‰9‹;€DØÒØ�
‰
�‰Öñ r   c                ó¦   € \         P                  4       pVe9   VP                  4        VP                  P                  P                  W34       R# R# )zDCalled under the approval queue lock, before enqueueing the request.N)r
   rC   r.   r   rp   r[   )r–   r—   r   s   && r   Úregister_prepared_approvalrµ   Ó   s?   € ä�9‰9‹;€DØÒØ×ÑÔØ�
‰
×$Ñ$×+Ñ+¨[Ð,@ÖAñ r   c                ó’  € \         P                  4       pVe   VP                  '       d   R # VP                  4        VP                  P
                  '       d   VP                  e
   R Vn        R # ^ RIHp VP                  4       VP                  P                  VP                  P                  4      P                  8w  g   VP                  WV38w  d   R # VP                  R uqSn        VeZ   VP                  R4      '       dC   VP                  R4      '       g,   ^ RIHp VP                  R4      '       d   V! 4       R8X  g   R # V# )N)Ú_approval_tool_call_idÚapprovedÚuser_approved)Ú_get_approval_modeÚsmart_approvedÚsmart)r
   rC   r!   r.   r   ru   r#   rE   r·   r   rM   rY   rF   r$   rº   )r3   r<   Úhas_host_accessr   r·   r#   rº   s   &&&    r   Úconsume_prepared_guardr¾   Û   sí   € Ü�9‰9‹;€DØ‚|�t—~—~�~ÙØ×ÑÔð ‡z�z××Ð 4§=¡=Ò#<ØˆŒÙÝ=Ø×"Ñ"Ó$¨¯©¯©¸¿
¹
×8JÑ8JÓ(K×(SÑ(SÔSØ�~‰~ '°_Ð!EÔEÙØ"Ÿm™m¨TÐ€HŒmð Ò §¡¨Z× 8Ò 8ÀÇÁÈo×A^ÒA^Ý=Ø—‘Ð-×.Ò.Ñ3EÓ3GÈ7Ô3RÙØ€Or   c                 óZ   € \         P                  4       p V R J;'       d    V P                  # r¡   )r
   rC   r!   r²   s    r   Úpreparing_terminal_approvalrÀ   ù   s$   € Ü�9‰9‹;€DØ�tÐ×.Ð. §¡Ð.r   c               ó    € V ^8„  d   QhRRRR/# )é   ÚfailedÚboolÚreturnÚNoner   )Úformats   "r   Ú__annotate__rÈ   þ   s   € ÷ "ñ "˜tð "¨ñ "r   c                ó\   € \         P                  4       pVe   V '       d
   RVn        R# R# R# )u¨  Record that the batch's current slot published a failed result.

Called by the sequential publisher AFTER a result is committed, so the
flag lands only for failures the model actually sees (a wedged worker's
late result never publishes). Sticky for the batch: one failure re-gates
every later prepared slot (#113158); successes leave it alone â€” a later
success must not un-stale an approval after an even earlier failure.
NT)r   rC   ru   )rÃ   r   s   & r   Úmark_batch_outcomerÊ   þ   s'   € ô �J‰J‹L€EØÒŸVØ!ˆÖñ $Ñr   c                óž   € \         P                  4       pVe5   VP                  4        WP                  8w  d   R Vn        \        R4      hR # R # )NzNTerminal arguments changed after approval preparation; command was not started)r
   rC   r.   r"   r#   r¨   )r"   r   s   & r   Úvalidate_prepared_terminalrÌ     sH   € Ü�9‰9‹;€DØÒØ×ÑÔð —9‘9ÔØ ˆDŒMÜÐoÓpÐpñ ñ	 r   c              #  óv   a a"  € ^ RI Hp ^ RIHo VV 3R lpV! WR7       F  w  rE\	        V4      x € K  	  R# 5i)zJKeep nonterminal barriers, but batch adjacent terminals in mixed segments.)Úgroupby©Ú_parse_tool_callc                ód   <€ S! SV R R7      pVP                   R8H  ;'       d    VP                  RJ # )T©Úflatten_proberœ   N©r�   Úparse_error)Úcallrc   rÐ   r,   s   & €€r   Úis_terminalÚ+terminal_approval_runs.<locals>.is_terminal  s1   ø€ Ù˜e T¸Ô>ˆØ�w‰w˜*Ñ$×?Ð?¨¯©¸4Ð)?Ð?r   )ÚkeyN)Ú	itertoolsrÎ   rn   rÐ   Úlist)r,   ÚcallsrÎ   r×   Ú_rf   rÐ   s   f&    @r   Úterminal_approval_runsrÞ     s.   ùé € å!Ý4ö@ñ ˜%×1‰ˆÜ�3‹iŒó 2ùs   „59c           	   #  ó8  "  € ^ RI Hp ^ RIHp ^ RIHp \        V4      ^8  g/   V! R4      R8w  g"   VP                  VP                  4       4      f   Rx € R# V Uu. uF  qv! WRR7      NK  	  ppV U	u. uF  q™P                  V4      P                  NK  	  p
p	\        ;QJ d    R	 V 4       F  '       g   K   RM	  R
M! R	 V 4       4      '       g4   \        V
4      '       d#   \        \        V
4      4      \        V
4      8w  d   Rx € R# \        WW84      p\        P                  V4      p V P                   '       g%   \#        V RR
4      '       g    VP%                  4        Rx € VP+                  4        \        P1                  V4       R# u upi u up	i   \&        \(        3 dC   pTP+                  4        \-        T\(        4      '       d   T P/                  RR7        Rp?LƒRp?ii ; i  TP+                  4        \        P1                  T4       i ; i5i)r1   )Úget_session_envrˆ   rÏ   ÚHERMES_SESSION_SOURCEÚdesktopNTrÒ   c              3  ój   "  € T F)  qP                   R 8g  ;'       g    VP                  RJx € K+  	  R# 5i)rœ   NrÔ   )Ú.0rc   s   & r   Ú	<genexpr>Ú*terminal_approval_batch.<locals>.<genexpr>1  s+   é € ÐQÉ&ÀB�G‰G�zÑ!×?Ð? R§^¡^¸4Ð%?Ô?Ë&ùs   ‚3œ3FÚ_incremental_persistence_failedz"terminal batch preparation timeout)Útool_reason)Úgateway.session_contextrà   r>   r‰   rn   rÐ   rq   Ú_gateway_notify_cbÚget_current_session_keyrM   rF   ÚanyÚallrK   ri   r   r-   rG   r„   r   r~   r™   rB   Ú	interruptr`   )r,   rÜ   r]   rY   rà   r‰   rÐ   rÖ   r   rc   Úidsr   rb   Úexcs   &&&&          r   r   r   $  sŽ  é € å7ÝÝ4ÜˆE‹
�QŒ™/Ð*AÓBÀiÔOØ×*Ñ*¨8×+KÑ+KÓ+MÓNÒVÛÙÙLQÓRÉEÀDÐ˜u¸$×?ÉE€FÐRñ .4Ó
4©V r�6‰6�'‹?×"Ô"©V€CÐ
4ß‹ÑQÉ&ÓQ��ŠÑQÉ&ÓQ×QÒQÜ�s—8’8œs¤3 s£8›}´°C³Ô8ÛÙÜ˜5¨GÓ<€EÜ�J‰J�uÓ€EðØ×)×)Ð)´'¸%ÐAbÐdi×2jÒ2jð	VØ—‘”ó 	à�‰ŒÜ�‰�UÖùò7 Sùò 5øô *¬<Ð8ô VØ—‘”ô
 ˜c¤<×0Ò0Ø—O‘OÐ0T�OÔUÿøðVûð 	�‰ŒÜ�‰�UÕüsm   ‚AHÁFÁ/HÁ5#FÂHÂ9HÃAHÄ/%G0 ÅF Å%G0 Å)1HÆG-Æ+8G(Ç#G0 Ç(G-Ç-G0 Ç0'HÈH)!Ú__conditional_annotations__Ú__doc__Ú
__future__r   Úcontextvarsr?   r   r{   Ú
contextlibr   Útypingr   Útools.thread_contextr   Ú
ContextVarr   Ú__annotations__r
   Ú	Exceptionr   r   ri   rž   r®   r°   r³   rµ   r¾   rÀ   rÊ   rÌ   rÞ   r   )rñ   s   @r   Ú<module>rû      sÈ   øðôõ #ã Û Û Û Ý %Ý å <à&1×&<Ò&<Ð=VÐ`dÔ&e€Ð#Ó eØ%0×%;Ò%;Ð<TÐ^bÔ%c€Ð"Ó cô	˜Iô 	÷Añ A÷H6@ñ 6@òròòD
òòBòò</õ
"òqò
ð ñ#ó ò#r   