Ë
    ãß²j~ï  ã                  óª  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z ddlmZmZmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$  ejJ                  d«      Z&d5d6d„Z'd7d„Z(d5d8d„Z)d9d„Z*d:d„Z+d;d„Z,d<d„Z-d<d„Z.ddœd=d„Z/d>d„Z0dZ1d?d„Z2d@d„Z3dAd„Z4	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBd„Z5dZ6dZ7dCd „Z8dDd!„Z9dEd"„Z:dFd#„Z; G d$„ d%«      Z<dGd&„Z=	 	 	 	 	 	 	 	 	 	 	 	 	 	 dHd'„Z>dId(„Z?dJd)„Z@dKd*„ZAdLd+„ZBe G d,„ d-«      «       ZC	 	 	 	 	 	 	 	 	 	 	 	 dMd.„ZDdNd/„ZE	 	 	 	 	 	 	 	 	 	 	 	 dOd0„ZFdPd1„ZGdQd2„ZHe G d3„ d4«      «       ZIy)Rz�Running ONE pre-built child agent: heartbeat, registry entry, workspace seeding,
timeout/failure handling, result-entry assembly and cleanup (``_ChildRun``).é    )ÚannotationsN)ÚTimeoutError)ÚAnyÚDictÚListÚOptional)Úrequest_hard_interrupt)Ú	dataclassÚfield)Ú
file_state)Ú_quietÚ_safe_progress)Ú _capture_gateway_steer_authorityÚ_close_subagent_steeringÚ_register_subagentÚ_unregister_subagent)Ú_extract_output_tailÚ_looks_like_error_outputÚ_stringify_tool_contentÚ_summarize_tool_argumentsztools.delegate_toolc                óH   — t        | t        t        f«      rt        | «      S |S )z:int() for counters that may be mocks/None on test doubles.)Ú
isinstanceÚintÚfloat)ÚvalueÚdefaults     úB/home/ubuntu/.hermes/hermes-agent/tools/delegate_tool_child_run.pyÚ_numr      s   € ä# E¬C´¨<Ô8Œ3ˆu‹:ÐE¸gÐEó    c                ó*   — t        | t        «      r| S d S ©N)r   Ústr)r   s    r   Ú_str_or_noner#      s   € Ü˜u¤cÔ*ˆ5Ð4°Ð4r   c                ó,   — | |d|d|t        |dd«      dœS )zGResult entry for a child that raised, never finished, or was abandoned.Nr   Ú_delegate_role)Ú
task_indexÚstatusÚsummaryÚerrorÚ	api_callsÚduration_secondsÚ_child_role)Úgetattr)Úidxr'   r)   ÚchildÚdurations        r   Ú_fabricated_entryr1   "   s*   € ð  V¸ÀuÐ[\Ø$´W¸UÐDTÐVZÓ5[ñð r   c                ó6   — |r|| d<   | dxx   d|› d�z  cc<   yy)zERecord steer text that won the race with the child's failure/timeout.Úmissed_steerr)   z2 [steer did not land before the subagent stopped: ú]N© )ÚentryÚ
late_steers     r   Ú_append_missed_steerr8   )   s/   € áØ *ˆˆnÑØˆg‹ÐOÐS]ÐR^Ð^_Ð`ÑaŒð r   c                ó†   — t        |d¬«      5  t        | dd«      }t        |«      r |«        ddd«       y# 1 sw Y   yxY w)zOBest-effort ``child.close()`` (tool sandboxes, browser daemons, httpx clients).T©Úexc_infoÚcloseN)r   r-   Úcallable)r/   Úlog_messager<   s      r   Ú_close_childr?   /   s;   € ä	� dÔ	+ñ Ü˜˜w¨Ó-ˆÜ�EŒ?ÙŒG÷÷ ñ ús	   Ž 7·A c                óÂ   — t        | dd«      }|r(|5   t        | j                  |«      |«       ddd«       y t        | j                  |«      |«       y# 1 sw Y   yxY w)zV``parent_agent._active_children.<op>(child)`` under the parent's lock when it has one.Ú_active_children_lockN)r-   Ú_active_children)Úparent_agentÚopr/   Úlocks       r   Ú_with_children_lockrF   6   sa   € ä�<Ð!8¸$Ó?€DÙØñ 	>Ø6ŒG�L×1Ñ1°2Ó6°uÔ=÷	>ð 	>ð 	3Œ�×-Ñ-¨rÓ2°5Õ9÷	>ð 	>ús   ’AÁAc           	     óT  — t        | d«      rt        | d|«       t        | dd«      duryt        | dd«      }t        | dd«      }|�|j                  «       r"t	        ||xs d	t        | d
d«      xs d	¬«       yt        d«      5  |j                  |«       ddd«       y# 1 sw Y   yxY w)a›  Register the child for parent interrupt propagation.

    ``interrupt()`` fans out to a SNAPSHOT of ``_active_children``; a child attached after the stop
    landed (a fan-out still building its siblings, a turn that has not reached its iteration check yet)
    would otherwise start with no signal and run to completion as an orphan. Mirror a pending stop here
    so the whole spawn tree dies with its parent.rB   ÚappendÚ_interrupt_requestedFTNÚ_interrupt_messageÚ_hard_interrupt_requestedzparent agent interruptedÚ_tool_interrupt_reason©Útool_reasonz/Failed to propagate interrupt to late child: %s)ÚhasattrrF   r-   Úis_setÚ_signal_child_stopr   Ú	interrupt)rC   r/   ÚmessageÚhards       r   Ú_attach_childrU   ?   s®   € ô ˆ|Ð/Ô0Ü˜L¨(°EÔ:Üˆ|Ð3°UÓ;À4ÑGØä�lÐ$8¸$Ó?€GÜ�<Ð!<¸dÓC€DØ€|�t—{‘{”}Ü˜5 'Ò"GÐ-GÜ'.¨|Ð=UÐW[Ó'\Ò'zÐ`zö	|ô ÐEÓFñ 	%Ø�O‰O˜GÔ$÷	%÷ 	%ñ 	%ús   ÂBÂB'c                óž   — t        | d«      sy	 t        | d|«       y# t        t        f$ r }t        j                  d|«       Y d}~yd}~ww xY w)zERemove the child from parent interrupt propagation (no-op if absent).rB   NÚremovez/Could not remove child from active_children: %s)rO   rF   Ú
ValueErrorÚUnboundLocalErrorÚloggerÚdebug)rC   r/   Úes      r   Ú_detach_childr]   T   sL   € ä�<Ð!3Ô4ØðKÜ˜L¨(°EÕ:øÜÔ)Ð*ò KÜ�‰ÐFÈ×JÑJûðKús   � �A¬AÁAzparent delegation endedrM   c               óŒ   — t        d«      5  | �"t        | g|¢­d|iŽst        | d«      rd| _        ddd«       y# 1 sw Y   yxY w)z¾Cooperative interrupt so the child's worker thread can exit cleanly. ``tool_reason`` is the
    fixed cause the child's tools see (a pending approval wait reports it instead of a user deny).NrN   rI   T)r   r	   rO   rI   )r/   rN   Úreasons      r   rQ   rQ   ]   sL   € ô 
�‹ñ .ØÐÔ&<¸UÐ&eÀVÒ&eÐYdÒ&eÜ˜EÐ#9Ô:Ø)-ˆEÔ&÷.÷ .ñ .ús	   Œ%:ºAc                ó¨   — dd l }|j                  | «      D ��cg c],  }|j                  «       j                  d«      D ]  }|› |› �‘Œ
 Œ. c}}S c c}}w )Nr   Ú
)Ú	tracebackÚformat_stackÚrstripÚsplit)ÚframeÚindentÚ
_tracebackÚ
frame_lineÚsubs        r   Ú_format_thread_stackrk   g   sQ   € Û"Ø/9×/FÑ/FÀuÓ/M×y ÐYc×YjÑYjÓYl×YrÑYrÐswÓYxÒyÐRUˆvˆh�s�eÒÐyÐÓyÐyùÓys   ™1A)ÚmodelÚproviderÚapi_modeÚbase_urlÚmax_iterationsÚ
quiet_modeÚskip_memoryÚskip_context_filesÚplatformr%   Ú_delegate_depthc                ób   — 	 t         |«       «      S # t        $ r}d| › |› d�gcY d}~S d}~ww xY w)zfLines from ``produce()``, or one ``<label: ...exc>`` line so a broken attribute never aborts the dump.ú  Ú>N)ÚlistÚ	Exception)ÚlabelÚproduceÚexcs      r   Ú_diag_sectionr~   p   s9   € ð$Ü‘G“I‹ÐøÜò $Ø�U�G˜C˜5 Ð"Ð#Õ#ûð$ús   ‚ ’	.›)£.©.c                óR   ‡ — ˆ fd„}ˆ fd„}dgt        d|«      z   t        d|«      z   S )Nc                 óÐ   •— t        ‰dd «      xs t        ‰dd «      xs d} t        | t        «      }d|rt        | j	                  d«      «      nd› �d|rt        | «      › �gS d› �gS )NÚephemeral_system_promptÚsystem_promptÚ z  system_prompt_bytes: úutf-8zn/az  system_prompt_chars: )r-   r   r"   ÚlenÚencode)Ú
sys_promptÚis_strr/   s     €r   Ú_promptz_diag_sizes.<locals>._promptx   sƒ   ø€ Ü˜UÐ$=¸tÓDÒsÌÐPUÐWfÐhlÓHmÒsÐqsˆ
Ü˜J¬Ó,ˆà%É¤c¨*×*;Ñ*;¸GÓ*DÔ&EÐUZÐ%[Ð\Ø%¹¤c¨*£oÐ%KÐLð
ð 	
àEJÐ%KÐLð
ð 	
r   c                 ó®   •— t        ‰dd «      } | €g S dt        | «      › �dt        t        j                  | t        ¬«      j                  d«      «      › �gS )NÚtoolsz  tool_schema_count: z  tool_schema_bytes: )r   r„   )r-   r…   ÚjsonÚdumpsr"   r†   )Útools_schemar/   s    €r   Ú_toolsz_diag_sizes.<locals>._tools€   s]   ø€ Ü˜u g¨tÓ4ˆØÐØˆIà#¤C¨Ó$5Ð#6Ð7Ø#¤C¬¯
©
°<ÌÔ(M×(TÑ(TÐU\Ó(]Ó$^Ð#_Ð`ð
ð 	
r   z## Prompt / schema sizeszsystem_prompt: <error: ztool_schema: <error: )r~   )r/   r‰   r�   s   `  r   Ú_diag_sizesr�   w   sG   ø€ ô
ô
ð 'Ð'¬-Ð8QÐSZÓ*[Ñ[Ô^kð  mDð  FLó  _Mñ  Mð  Mr   c                ó.  ‡ ‡— ddl Šdg}‰j                  «       }‰ �L‰ j                  «       r<|j                  ‰ j                  «      }|j                  |�t        |d«      ndg«       n|j                  ‰ €dnd«       ˆˆ fd„}|d	d
gz   t        d|«      z   S )zÄWorker stack plus all other live threads (bounded to 40): the worker is often parked on a helper thread, so a
    pre-HTTP wedge is indistinguishable from a slow provider without the full picture.r   Nz!## Worker thread stack at timeoutrw   z  <worker frame not available>z  <no worker thread handle>z   <worker thread already exited>c                 óD  •‡— ‰j                  «       } t        j                  «       D �ci c]  }|j                  sŒ|j                  |“Œ }}‰	r‰	j                  nd Šg }t        ˆfd„| j	                  «       D «       «      D ]˜  \  }\  }}|dk\  r'|j                  dt        | «      |z
  dz
  › d�«        |S |j                  |«      }|j                  d|r|j                  nd|› �› |r|j                  rdnd	› d
�«       |j                  t        |d«      «       Œš |S c c}w )Nc              3  ó4   •K  — | ]  }|d    ‰k7  sŒ|–— Œ y­w)r   Nr5   )Ú.0ÚfÚworker_idents     €r   ú	<genexpr>z6_diag_threads.<locals>._all_threads.<locals>.<genexpr>œ   s   øè ø€ Ò/b°aÈQÈqÉTÐUaÓMa´Ñ/bùs   ƒ‘é(   z  <é   z more threads omitted>z  --- zident=z daemonrƒ   z ---z    )Ú_current_framesÚ	threadingÚ	enumerateÚidentÚitemsrH   r…   ÚgetÚnameÚdaemonÚextendrk   )
ÚframesÚthÚby_identÚoutÚdumpedr�   rf   r–   Ú_sysÚworker_threads
          @€€r   Ú_all_threadsz#_diag_threads.<locals>._all_threads—   s  ù€ Ø×%Ñ%Ó'ˆÜ+4×+>Ñ+>Ó+@ÖM RÀBÇHÃH�B—H‘H˜b‘LÐMˆÐMÙ.;�}×*Ò*ÀˆØˆÜ&/Ó/b¸6¿<¹<»>Ô/bÓ&bò 	<Ñ"ˆF‘N�U˜EØ˜Š|Ø—
‘
˜S¤ V£¨vÑ!5¸Ñ!9Ð :Ð:PÐQÔRØð ˆ
ð —‘˜eÓ$ˆBØ�J‰J˜©2 §¢°V¸E¸7Ð3CÐDÑSUÐZ\×ZcÒZcÁYÐjlÐDmÐmqÐrÔsØ�J‰JÔ+¨E°6Ó:Õ;ð	<ð ˆ
ùò Ns
   ©D»Drƒ   z## All thread stacks at timeoutz<all-thread dump failed: )	Úsysrš   Úis_aliverŸ   r�   r¢   rk   rH   r~   )r©   Úlinesr£   Úworker_framerª   r¨   s   `    @r   Ú_diag_threadsr¯   ‹   s¨   ù€ ó Ø0Ð1€EØ×!Ñ!Ó#€FØÐ  ]×%;Ñ%;Ô%=Ø—z‘z -×"5Ñ"5Ó6ˆØ�‰ÀÐAYÔ)¨,¸Ô=ð  aAð  `Bõ  	Cà�‰°mÐ6KÑ2ÐQsÔtõð �BÐ9Ð:Ñ:¼]ÐKfÐhtÓ=uÑuÐur   c                óJ  ‡ — 	 ddl m} ddl} |«       dz  }	 |j                  dd¬«       t        ‰ dd«      xs d|› �}	|d	|	› d
|j                  j                  «       j                  d«      › d�z  }
|xs dj                  «       }t        |«      dkD  r|dd dz   }ˆ fd„}t        ‰ dd«      }dd|j                  j                  «       j                  «       › �ddd|› �d|	› �d|› d�d|d›d�dd|xs dddgt        |t        «      ¢d‘d‘dt        ‰ d d«      ›�‘}|rN|j                  d!t        |«      › �«       t        d«      5  |j                  d"t        |«      › �«       ddd«       |dgt!        ‰ «      ¢d‘d#‘z  }|t#        d$ˆ fd%„«      z  }|dgt%        |«      ¢d‘d&‘d'‘d(‘d)‘d*‘z  }|
j'                  d+j)                  |«      d,¬-«       t+        |
«      S # t        $ r Y yw xY w# 1 sw Y   Œ‰xY w# t        $ r }t,        j/                  d.|«       Y d}~yd}~ww xY w)/a9  Structured diagnostic for a subagent that timed out before any API call (otherwise "timed out with no
    response", 0 API calls, nothing to inspect): ``~/.hermes/logs/subagent-timeout-<sid>-<ts>.log`` with the
    child's config, prompt/schema sizes, activity snapshot and worker stack. Path, or None on failure.r   )Úget_hermes_homeNÚlogsT)ÚparentsÚexist_okÚ_subagent_idr.   zsubagent-timeout-Ú-z%Y%m%d_%H%M%Sz.logrƒ   iè  z ...[truncated]c                óV   •— 	 d| › dt        ‰| d «      ›�S # t        $ r	 d| › d�cY S w xY w)Nrw   ú: z: <unreadable>)r-   rz   )Úattrr/   s    €r   Ú
_attr_linez5_dump_subagent_timeout_diagnostic.<locals>._attr_line¼   sC   ø€ ð1Ø˜D˜6 ¤G¨E°4¸Ó$>Ð#AÐBÐBøÜò 1Ø˜D˜6 Ð0Ò0ð1ús   ƒ –(§(Úvalid_tool_namesu.   # Subagent timeout diagnostic â€” issue #14726z# Generated: z
## Timeoutz  task_index:        z  subagent_id:       z  configured_timeout: Úsz  actual_duration:   z.2fz## Goalú(empty)z## Child configz## Toolsetsz  enabled_toolsets:  Úenabled_toolsetsz  loaded tool count: z  loaded tools:      z## Activity summaryz<get_activity_summary failed: c                 ó~   •— ‰j                  «       j                  «       D � �cg c]  \  } }d| › d|›�‘Œ c}} S c c}} w )Nrw   r¸   )Úget_activity_summaryrž   )ÚkÚvr/   s     €r   ú<lambda>z3_dump_subagent_timeout_diagnostic.<locals>.<lambda>Ð   s8   ø€ ÐSX×SmÑSmÓSo×SuÑSuÓSw×6xÉ4È1Èa¸¸A¸3¸bÀÀ²Ó6x€ ùÓ6xs   £9z## NoteszG  This file is written ONLY when a subagent times out with 0 API calls.zI  0-API-call timeouts mean the child never reached its first LLM request.zG  Common causes: oversized prompt rejected by provider, transport hang,z<  credential resolution stuck. See issue #14726 for context.ra   r„   )Úencodingz+Subagent timeout diagnostic dump failed: %s)Úhermes_constantsr±   ÚdatetimeÚmkdirrz   r-   ÚnowÚstrftimeÚstripr…   Ú	isoformatÚmapÚ_DIAG_CHILD_ATTRSrH   r   Úsortedr�   r~   r¯   Ú
write_textÚjoinr"   rZ   Úwarning)r/   r&   Útimeout_secondsr+   r©   Úgoalr±   Ú_dtÚlogs_dirÚsubagent_idÚ	dump_pathÚ_goal_previewrº   Ú
tool_namesr­   r}   s   `               r   Ú!_dump_subagent_timeout_diagnosticrÚ   §   sÉ  ø€ ð.Ý4ÛÙ"Ó$ vÑ-ˆð	Ø�N‰N 4°$ˆNÔ7ô ˜e ^°TÓ:ÒPÀÀJÀ<Ð>PˆØÐ!2°;°-¸qÀÇÁ×AQÑAQÓAS×A\ÑA\Ð]lÓAmÐ@nÐnrÐsÑsˆ	Øš ×*Ñ*Ó,ˆÜˆ}Ó Ò$Ø)¨%¨4Ð0Ð3DÑDˆMô	1ô ˜UÐ$6¸Ó=ˆ
à<ÀÈcÏlÉl×N^ÑN^ÓN`×NjÑNjÓNlÐMmÐ>nÐprØÐ1°*°Ð>ÐBWÐXcÐWdÐ@eØ$ _Ð$5°QÐ7Ð;PÐQaÐbeÐPfÐfgÐ9hÐjlÐnwØÒ&˜Y¨Ð,=ð	
ô ADÀJÔPaÓ@bð	
ð
 ð
ð
 ð
ð
 "7´w¸uÐFXÐZ^Ó7_Ð6bÐcð
ˆñ Ø�L‰LÐ0´°Z³Ð0AÐBÔCÜ˜“ñ KØ—‘Ð4´V¸JÓ5GÐ4HÐIÔJ÷Kà�"ÐE”{ 5Ó)ÐE¨2ÐEÐ/DÐEÑEˆØ”Ø,Ó.xó
ñ 	
ˆð 	�"ð 
”} ]Ó3ð 
°Rð 
¸ð 
ØUð
àWð
ð Vð
ð Kð	
ñ 	
ˆð 	×Ñ˜TŸY™Y uÓ-¸ÐÔ@Ü�9‹~ÐøôK ò 	Ùð	ú÷0Kð Kûô ò Ü�‰ÐDÀcÔJÜûðúsS   ƒG9 ˜G «DG9 ÅG-Å%A8G9 Ç	G*Ç'G9 Ç)G*Ç*G9 Ç-G6Ç2G9 Ç9	H"ÈHÈH"ç      @gš™™™™™é?c                ó   — d| d›d|d›d�S )Nz3[delegation budget warning] No progress signal for z.0fz
s of your uy   s inactivity window. Finish the current step and return your summary now â€” the work is discarded if the window elapses.r5   )Úidle_secondsÚchild_timeouts     r   Ú_budget_warning_textrß   ç   s'   € à
=¸lÈ3Ð=OÈzÐZgÐhkÐYlð mð 	ðr   c                ó´   — t        | dd«      }t        |«      sy	  |t        ||«      «       y# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zeQueue the one-line warning through the child's steer path (delivered at its next iteration boundary).ÚsteerNzbudget warning steer failed: %s)r-   r=   rß   rz   rZ   r[   )r/   rÝ   rÞ   rá   r}   s        r   Ú_warn_child_budgetrâ   î   sQ   € ä�E˜7 DÓ)€EÜ�EŒ?Øð=ÙÔ" <°Ó?Õ@øÜò =Ü�‰Ð6¸×<Ñ<ûð=ús   ›. ®	A·AÁAc                ó®   — 	 | j                  «       xs i }|j                  d«      |j                  d«      |j                  d«      fS # t        $ r Y yw xY w)u—  ``(completed calls, current tool, activity clock)`` â€” the progress signals the heartbeat's stale verdict
    already watches. A child waiting on an in-flight LLM completion is ALIVE: its activity clock ticks while the
    provider works (``direct_api_call``'s 15s heartbeat) and the call itself is bounded by the per-call stale
    watchdog, so at the delegation layer it must not read as stuck (#116001).)NNNÚapi_call_countÚcurrent_toolÚlast_activity_ts)rÀ   rz   rŸ   )r/   r(   s     r   Ú_child_activity_fingerprintrç   ø   sZ   € ð
"Ø×,Ñ,Ó.Ò4°"ˆð �K‰KÐ(Ó)¨7¯;©;°~Ó+FÈÏÉÐTfÓHgÐhÐhøô ò "Ù!ð"ús   ‚A Á	AÁAc           	     óØ   — 	 | j                  «       xs i j                  d«      }|�4t        t        dt	        j                  «       t        |«      z
  «      d«      S dS # t        $ r Y yw xY w)zÖSeconds since the child's activity clock last ticked, or None when the child exposes no clock. Reported on a
    timeout so an operator can tell a slow-but-live provider from a runaway without transcript forensics.ræ   Nç        é   )rÀ   rŸ   ÚroundÚmaxÚtimer   rz   )r/   Útss     r   Ú_child_last_event_agerï     se   € ðØ×(Ñ(Ó*Ò0¨b×5Ñ5Ð6HÓIˆØ>@¸nŒu”S˜œdŸi™i›k¬E°"«IÑ5Ó6¸Ó:ÐVÐRVÐVøÜò Ùðús   ‚AA ÁA Á	A)Á(A)c                  ó.   — e Zd ZdZdd„Zdd„Zdd„Zd„ Zy)	Ú
_HeartbeatuO  One child's parent-activity heartbeat via the shared periodic scheduler
    (``agent.periodic_scheduler``) â€” not one daemon thread per child. NOT started at construction:
    the caller calls ``start()`` inside its ``try`` so a failed schedule (OS thread exhaustion on
    first use) leaves ``handle`` None and ``stop()`` is a no-op.c                ó–   — |||c| _         | _        | _        dd d ddœ| _        d | _        t        j                  «       | _        d | _        y )Nr   )ÚiterÚtoolrî   Ústale)	r/   rC   r&   Ú	last_seenÚhandler›   ÚEventÚsettledÚstale_threshold_seconds)Úselfr/   rC   r&   s       r   Ú__init__z_Heartbeat.__init__  sL   € Ø9>ÀÈjÐ6ˆŒ
�DÔ% t¤ð #$¨T¸ÈÑJˆŒØˆŒô !—‘Ó(ˆŒð 9=ˆÕ$r   c                óL   — ddl m} ddlm}  || j                  |«      | _        y )Nr   )Úschedule)Ú_HEARTBEAT_INTERVAL)Úagent.periodic_schedulerrþ   Útools.delegate_toolrÿ   Útickr÷   )rû   rþ   rÿ   s      r   Ústartz_Heartbeat.start  s   € Ý5Ý;Ù˜tŸy™yÐ*=Ó>ˆ�r   c                óV   — | j                   �| j                   j                  d¬«       yy)z?wait=5 mirrors the old thread join: an in-flight tick finishes.Né   ©Úwait)r÷   Úcancel©rû   s    r   Ústopz_Heartbeat.stop$  s&   € à�;‰;Ð"Ø�K‰K×Ñ AÐÕ&ð #r   c                ó�  — ddl m}m}m} | j                  | j
                  | j                  | j                  f\  }}}}|�t        |dd«      nd}|syd|› d�}		 |j                  «       }
|
j                  d«      }|
j                  dd«      }|
j                  d	d«      }|
j                  d
«      }|duxr |d   du xs ||d   kD  }||d   kD  s
||d   k7  s|r|j                  ||d¬«       |�||d<   n|dxx   dz  cc<   |r|n|}|d   |k\  rDt        j                  d||d   |xs d«       ||z  | _        | j                  j!                  «        y|rd|› d|› d|› d�}	n.|
j                  dd«      rd|
j                  dd«      › d|› d|› d�}	t%        d«      5   ||	«       ddd«       y# t"        $ r Y Œ(w xY w# 1 sw Y   yxY w)z,Returning False stops the periodic callback.r   )rÿ   Ú_HEARTBEAT_STALE_CYCLES_IDLEÚ_HEARTBEAT_STALE_CYCLES_IN_TOOLNÚ_touch_activityzdelegate_task: subagent z workingrå   rä   rp   ræ   rî   ró   rô   )ró   rô   rõ   rõ   r™   u`   Subagent %d appears stale (no progress for %d heartbeat cycles, tool=%s) â€” abandoning its waitz<none>Fz delegate_task: subagent running z (iteration ú/ú)Úlast_activity_descrƒ   )r  rÿ   r  r  r/   rC   r&   rö   r-   rÀ   rŸ   ÚupdaterZ   rÑ   rú   rù   Úsetrz   r   )rû   rÿ   r  r  r/   rC   r&   rö   ÚtouchÚdescÚchild_summaryÚ
child_toolÚ
child_iterÚ	child_maxÚchild_activity_tsÚactivity_advancedÚstale_cycless                    r   r  z_Heartbeat.tick)  sG  € çzÑzØ59·Z±ZÀ×ARÑARÐTX×TcÑTcÐei×esÑesÐ5sÑ2ˆˆ|˜Z¨ØBNÐBZ”˜Ð&7¸Ô>Ð`dˆÙØØ)¨*¨°XÐ>ˆð 	Ø!×6Ñ6Ó8ˆMØ&×*Ñ*¨>Ó:ˆJØ&×*Ñ*Ð+;¸QÓ?ˆJØ%×)Ñ)Ð*:¸AÓ>ˆIØ -× 1Ñ 1Ð2DÓ EÐð !2¸Ð =ò !Ø˜$‘ 4Ð'ÒNÐ+<¸yÈ¹Ñ+Nð ð ˜I fÑ-Ò-°¸yÈÑ?PÒ1PÑTeØ× Ñ  j°zÈÐ ÔKØ$Ð0Ø&7�I˜d’Oà˜'Ó" aÑ'Ó"Ù>HÑ:ÐNjˆLØ˜Ñ! \Ò1Ü—‘ØvØ 	¨'Ñ 2°JÒ4JÀ(ôð
 0<Ð>QÑ/Q�Ô,Ø—‘× Ñ Ô"ØÙØ9¸*¸À\ÐR\ÐQ]Ð]^Ð_hÐ^iÐijÐk‘Ø×"Ñ"Ð#7¸Ô<Ø1°-×2CÑ2CÐDXÐZ\Ó2]Ð1^Ð^jÐkuÐjvÐvwð  yBð  xCð  CDð  E�ô �D‹\ñ 	Ù�$ŒK÷	àøô	 ò 	Ùð	ú÷	àús%   ÁC9F- Å=F- Æ	F<Æ-	F9Æ8F9Æ<GN)r/   r   rC   r   r&   r   ©ÚreturnÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rü   r  r
  r  r5   r   r   rñ   rñ     s   „ ñDó
=ó?ó
'ó
+r   rñ   c                ó   — t        | ||«      S )z<Build (not start) one child's heartbeat; see ``_Heartbeat``.)rñ   )r/   rC   r&   s      r   Ú_start_heartbeatr%  W  s   € ä�e˜\¨:Ó6Ð6r   c               óp  — t        | dd«      }t        |t        «      r|sy|€'t        d«      5  ddlm}  |dd«      xs d}ddd«       |r|�|€t        |«      \  }}t        | dd«      }t        |t        t        | d	d«      «      t        |t        «      rt        d|dz
  «      nd|t        t        | d
d«      «      t        t        | dd«      «      t        j                  «       dd| t        t        | dd«      xs d«      xs t        t        |dd«      xs d«      xs d|||dœ«       |S # 1 sw Y   ŒëxY w)zÕRegister the live child in the module registry; return its subagent_id. Test doubles without a stable string
    ``_subagent_id`` are not registered (None) and the caller skips every registry interaction for them.rµ   Nr   )Úget_session_envÚHERMES_UI_SESSION_IDrƒ   ru   r™   Ú_parent_subagent_idÚ_delegation_idrl   ÚrunningÚ_parent_session_idÚ
session_id)rÖ   Ú	parent_idÚdepthrÓ   Údelegation_idrl   Ú
started_atr'   Ú
tool_countÚagentÚowner_agent_session_idÚowner_session_idÚowner_transportÚowner_session_record)r-   r   r"   r   Úgateway.session_contextr'  r   r   r#   r   rì   rí   )	r/   rC   rÓ   r5  r6  r7  rµ   r'  Ú
_raw_depths	            r   Ú_register_childr:  [  sK  € ô ˜5 .°$Ó7€LÜ�l¤CÔ(±ØØÐÜ�D‹\ñ 	SÝ?Ù.Ð/EÀrÓJÒRÈdÐ÷	Sñ ˜_Ð4Ð8LÐ8TÜ0PÐQaÓ0bÑ-ˆÐ-Ü˜Ð 1°1Ó5€JÜØ#Ü!¤'¨%Ð1FÈÓ"MÓNÜ+5°jÄ#Ô+F”�Q˜
 Q™Ô'ÈAØÜ%¤g¨eÐ5EÀtÓ&LÓMÜœg e¨W°dÓ;Ó<Ü—i‘i“k¨YÀaÐRWô
 ”˜Ð3°RÓ8Ò>¸BÓ?Ò}Ä3ÄwÈ|Ð]iÐkmÓGnÒGtÐrtÓCuÒ}Ðy}ð -Ø*Ø 4ñ%ô ð( Ð÷5	Sð 	Sús   ®D,Ä,D5c                óh  — ddl m}m}  |«       syt        d«      5  ddlm} |j                  «       st        j                  d«       	 ddd«       yd}t        d«      5  ddl	m
}  ||«      }ddd«       |j                  |xs  || «      |¬«      cddd«       S # 1 sw Y   Œ/xY w# 1 sw Y   yxY w)	zâOpt-in worktree isolation: own git worktree off the parent's HEAD (the
    child's terminal starts there). Git-only, local-backend-only; failures
    degrade silently to the shared workspace. Returns the worktree info or None.r   )Ú_get_worktree_isolationÚ_resolve_workspace_hintNz#worktree isolation setup failed: %s©Úsubagent_worktreez6worktree isolation skipped: non-local terminal backend)Úget_session_cwd)rÖ   )r  r<  r=  r   r‹   r?  Úlocal_backend_activerZ   r[   Útools.terminal_toolr@  Úcreate_subagent_worktree)rC   Úparent_task_idrÖ   r<  r=  r?  Ú_parent_cwdÚ_gscs           r   Ú_create_isolated_worktreerG  �  s²   € ÷ UÙ"Ô$ØÜ	Ð5Ó	6ñ 
Ý+Ø ×5Ñ5Ô7Ü�L‰LÐQÔRØ÷	
ð 
ð
 ˆÜ�D‹\ñ 	/ÝCÙ˜~Ó.ˆK÷	/ð !×9Ñ9ØÒ@Ñ2°<Ó@Èkð :ó 
÷
ñ 
÷	/ð 	/ú÷
ð ús)   œ-B(ÁB(ÁBÁ.$B(ÂB%	Â!B(Â(B1c                óä   ‡ ‡‡‡— ‰j                  ˆ fd„«       t        ‰ dd«      Št        ‰«      syd	ˆfd„Š ‰d«       t        j                  dˆˆfd„«      }d|_        |j                  «        y)
u¹  Hand ``child.close()`` to a Future done-callback and drain its transports.

    The interrupt is cooperative: the worker still runs its finally path, so closing now could close SQLite under its
    final write â€” the done-callback is the first safe boundary. The abandoned worker is usually parked in an OpenSSL
    read; NEVER hard-close that transport from this thread (cross-thread FD release under a live SSL read corrupts
    native state) â€” shutdown() the pooled sockets so the read settles with EOF and the worker unwinds. One immediate
    sweep + one delayed re-sweep for a connection opened in between; a worker that still won't settle keeps its
    resources until process exit.
    c                ó   •— t        ‰d«      S )Nz1Failed to close timed-out child after worker exit)r?   )Ú_doner/   s    €r   rÃ   z,_defer_close_after_timeout.<locals>.<lambda>   s   ø€ ´¸eÐExÓ1y€ r   Ú#_drain_transports_after_abandonmentNc                ód   •— t        d| d¬«      5   ‰d| › �¬«       d d d «       y # 1 sw Y   y xY w)Nz+Timed-out child transport drain (%s) failedTr:   Údelegate_timeout_)r_   )r   )ÚphaseÚ_drains    €r   Ú_drain_oncez/_defer_close_after_timeout.<locals>._drain_once«  s6   ø€ ÜÐAÀ5ÐSWÔXñ 	7ÙÐ-¨e¨WÐ5Õ6÷	7÷ 	7ñ 	7ús   �&¦/Ú	immediaterÛ   c                 ó8   •— ‰j                  «       rd S  ‰ d«      S )NÚresweep)Údone)rP  Úchild_futures   €€r   rÃ   z,_defer_close_after_timeout.<locals>.<lambda>°  s   ø€ ¸,×:KÑ:KÔ:M°$€ ÑS^Ð_hÓSi€ r   T)rN  r"   r  r  )Úadd_done_callbackr-   r=   r›   ÚTimerr¡   r  )r/   rU  Ú_resweep_timerrO  rP  s   `` @@r   Ú_defer_close_after_timeoutrY  –  sd   û€ ð ×"Ñ"Ó#yÔzô �UÐAÀ4ÓH€FÜ�FÔØõ7ñ �ÔÜ—_‘_ SÔ*iÓj€NØ €NÔØ×ÑÕr   c                ó  ‡‡‡— t        | dd«      }|€yddlmŠ t        | dd«      Š|j                  «       Š‰�·t	        d«      5  t        ˆfd„|j                  «       D «       d«      } ‰|‰«      sT|j                  ‰«       t        ˆˆfd	„|j                  «       D «       d«      }|�|j                  |j                  «      ndŠ|�t        | d
«      r| j                  |«       ddd«       |‰fS |‰fS # 1 sw Y   |‰fS xY w)a-  Lease a credential from the child's pool (if any) and bind it; ``(pool, lease_id)``. The bound entry must
    serve the child's endpoint: on a mixed same-provider pool the least-leased pick may target another host, so it is
    released and an endpoint-matching entry is leased by id instead (#68237).Ú_credential_poolN)NNr   )Ú%credential_pool_entry_serves_endpointro   z-Failed to bind child to leased credential: %sc              3  óB   •K  — | ]  }|j                   ‰k(  sŒ|–— Œ y ­wr!   )Úid)r”   r\   Úleased_cred_ids     €r   r—   z*_lease_child_credential.<locals>.<genexpr>Â  s   øè ø€ Ò [ qÀAÇDÁDÈNÓDZ¤Ñ [ùs   ƒ˜c              3  óV   •K  — | ]   }|j                   d k7  sŒ ‰|‰«      sŒ|–— Œ" y­w)ÚdeadN)Úlast_status)r”   r\   Ú_entry_serves_endpointro   s     €€r   r—   z*_lease_child_credential.<locals>.<genexpr>Æ  s(   øè ø€ Òx˜1¸¿¹ÈÓ8OÑTjÐklÐnvÕTw”QÑxùs   ƒ)˜	)¢)Ú_swap_credential)r-   Úagent.credential_poolr\  Úacquire_leaser   ÚnextÚentriesÚrelease_leaser^  rO   rd  )r/   Ú
child_poolÚleased_entryrc  ro   r_  s      @@@r   Ú_lease_child_credentialrl  ´  s  ú€ ô ˜Ð 2°DÓ9€JØÐØÝeÜ�u˜j¨$Ó/€HØ×-Ñ-Ó/€NØÐ!ÜÐCÓDñ 	5ô  Ó [¨J×,>Ñ,>Ó,@Ô [Ð]aÓbˆLÙ)¨,¸ÔAØ×(Ñ(¨Ô8Ü#Üx 
× 2Ñ 2Ó 4ÔxØó �ð O[ÐNf ×!9Ñ!9¸,¿/¹/Ô!JÐlp�ØÐ'¬G°EÐ;MÔ,NØ×&Ñ& |Ô4÷	5ð �~Ð%Ð%ˆ:�~Ð%Ð%÷	5ð �~Ð%Ð%ús   ÁB C4Ã4D c                óˆ   — |rt        ||«      nd}|r0| j                  d«      }t        |t        «      r	|r|› d|› �n|| d<   yy)a  Linearization boundary for registry steering: from here the child cannot consume another steer. Closing under
    the registry lock either rejects a concurrent caller or drains every accepted exact text into the result before
    callbacks/result assembly run.NÚpending_steerra   )r   rŸ   r   r"   )ÚresultrÖ   r/   ÚlateÚexistings        r   Ú_merge_late_steerrr  Î  sQ   € ñ <GÔ# K°Ô7ÈD€DÙØ—:‘:˜oÓ.ˆÜ;EÀhÔPSÔ;TÑYa X J¨b°°Ñ"7ÐgkˆˆÒð r   c                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y	)
Ú_SchemaOutcomezOptional[Dict[str, Any]]ÚschemazOptional[bool]Úvalidú	List[str]Úerrorsr   ÚretriesN)r   r!  r"  Ú__annotations__r5   r   r   rt  rt  Ø  s   … à$Ó$ØÓØÓØ„Lr   rt  c           	     ó  — t        | dd«      }t        |t        «      st        |dg d«      S ddlm}m} |j                  d«      xs d} |||«      \  }	}
|	s"|j                  «       r|j                  dd«      rt        ||	|
d«      S d}	 dd	l	m
}  |t        t        | d
d«      xs d«      «      5  | j                   ||
«      ||¬«      }ddd«       t        |t        «      rÄ|j                  d«      xs d}|j                  «       r||d<   	 t!        |j                  dd«      xs d«      t!        |j                  dd«      xs d«      z   |d<   |j                  d«      }t        |t&        «      r*t        |j                  d«      t&        «      r|d   |z   |d<    |||«      \  }	}
t        ||	|
d«      S # 1 sw Y   ŒëxY w# t        $ r"}t        j                  d||«       Y d}~�Œd}~ww xY w# t"        t$        f$ r Y Œ°w xY w)zÜValidate the final answer against the attached output_schema with ONE bounded retry. Schema-less children (no
    dict on ``child._delegate_output_schema``) take no branch here so their result entry stays byte-identical.Ú_delegate_output_schemaNr   )Úbuild_retry_messageÚvalidate_outputÚfinal_responserƒ   ÚinterruptedF©Údelegated_child_contextr-  ©Úuser_messageÚtask_idÚstream_callbackz(Subagent %d schema-retry turn failed: %sr*   Úmessagesr™   )r-   r   Údictrt  Útools.delegation_output_schemar}  r~  rŸ   rÊ   Úagent.delegation_contextr‚  r"   Úrun_conversationrz   rZ   rÑ   r   Ú	TypeErrorrX   ry   )r/   ro  r&   Úchild_task_idÚrelay_child_textÚ_output_schemar}  r~  Ú_first_textÚ_schema_validÚ_schema_errorsÚ_retry_resultr‚  Ú
_retry_excÚ_retry_textÚ_retry_messagess                   r   Ú_validate_child_output_schemar—  ß  s  € ô
 ˜UÐ$=¸tÓD€NÜ�n¤dÔ+Ü˜n¨d°B¸Ó:Ð:ßSØ—*‘*Ð-Ó.Ò4°"€KÙ$3°KÀÓ$PÑ!€M�>Ù˜K×-Ñ-Ô/°6·:±:¸mÈUÔ3SÜ˜n¨m¸^ÈQÓOÐOð €Mð
[õ 	EÙ$¤S¬°¸ÀbÓ)IÒ)OÈRÓ%PÓQñ 	Ø!×2Ñ2Ù0°Ó@È-Ø 0ð 3ó ˆM÷	ô �-¤Ô&Ø#×'Ñ'Ð(8Ó9Ò?¸RˆØ×ÑÔØ'2ˆFÐ#Ñ$ð	Ü"% f§j¡j°¸aÓ&@Ò&EÀAÓ"FÌÈ]×M^ÑM^Ð_jÐlmÓMnÒMsÐrsÓItÑ"tˆF�;Ñð (×+Ñ+¨JÓ7ˆÜ�o¤tÔ,´¸F¿J¹JÀzÓ<RÔTXÔ1YØ!'¨
Ñ!3°oÑ!EˆF�:ÑÙ(7¸À^Ó(TÑ%ˆ�~Ü˜.¨-¸ÈÓKÐK÷'	ð 	ûô
 ò [Ü�‰ÐAÀ:Èz×ZÒZûð[ûô œ:Ð&ò 	Ùð	úsC   Â
&G Â0F5ÃG ÄAG/ Æ5F>Æ:G Ç	G,Ç
G'Ç'G,Ç/HÈ Hc                óî  — g }i }t        | t        «      s|S | D �]X  }t        |t        «      sŒ|j                  d«      dk(  r’|j                  d«      xs g D ]y  }|j                  di «      }|j                  dd«      }|j                  dd«      t	        |«      t        |«      d	œ}|j                  |«       |j                  d
«      sŒr|||d
   <   Œ{ Œ»|j                  d«      dk(  sŒÐt        |j                  dd«      «      }t	        |«      t        |«      rdnddœ}	|j                  d«      }
|
r|j                  |
«      nd}|�|j                  |	«       �ŒA|s�ŒE|d   j                  |	«       �Œ[ |S )zvTool trace from the child's conversation messages, pairing parallel
    tool calls with their results by tool_call_id.ÚroleÚ	assistantÚ
tool_callsÚfunctionÚ	argumentsrƒ   r    Úunknown)rô   Ú
args_bytesÚinput_summaryr^  rô   Úcontentr)   Úok)Úresult_bytesr'   Útool_call_idNéÿÿÿÿ)
r   ry   rˆ  rŸ   r…   r   rH   r   r   r  )r‡  Ú
tool_traceÚtrace_by_idÚmsgÚtcÚfnr�  Úentry_tr¡  Úresult_metaÚtc_idÚtargets               r   Ú_build_tool_tracer¯  	  sc  € ð (*€JØ-/€KÜ�h¤Ô%ØÐØó 3ˆÜ˜#œtÔ$ØØ�7‰7�6‹?˜kÒ)Ø—g‘g˜lÓ+Ò1¨rò 	4�Ø—V‘V˜J¨Ó+�ØŸF™F ;°Ó3�	àŸF™F 6¨9Ó5ÄSÈÃ^Ü%>¸yÓ%Iñ�ð ×!Ñ! 'Ô*Ø—6‘6˜$•<Ø,3�K  4¡Ò)ñ	4ð �W‰W�V‹_ Ó&Ü-¨c¯g©g°iÀÓ.DÓEˆGÜ+.¨w«<ÔNfÐgnÔNoÁ7ÐuyÑzˆKØ—G‘G˜NÓ+ˆEÙ/4�[—_‘_ UÔ+¸$ˆFØÐ!Ø—‘˜kÖ*ÛØ˜2‘×%Ñ% kÖ2ð-3ð. Ðr   c                ó8  ‡‡‡— |j                  d«      xs d}t        |«      xr |j                  «       dk7  }d}|j                  dd«      rfd\  }}	ddlmŠ d|j                  «       d	hŠt        ˆˆˆfd
„t        |j                  d«      xs g «      D «       d«      }
|
rW|j                  «       |
}}nD|j                  d«      s|j                  d«      rd\  }}	n|j                  dd«      rdnd}	|rdnd}t        | dd«      }t        | dd«      }||||j                  dd«      |t        t        | dd«      «      |	|	dk(  t        t        | dd«      «      t        t        | dd«      «      dœt        |j                  d«      xs g «      t        | dd«      t        |t        t        f«      rt        |xs d«      nddœ}t        |d   d«      |d<   t        |t        «      r|r|nd|d <   |dk(  r>|j                  dd!«      |d<   |j                  d"«      }t        |t        «      r|r||d"<   n|r||d<   t        |j                   t"        «      rƒt        |j$                  «      |d#<   |j&                  r|j&                  |d$<   |j$                  s|j(                  r|j(                  |d%<   |j$                  du r|rd&|j&                  rd'ndz   d(z   |d)<   |j                  d*«      }t        |t        «      r)|j                  «       r||d+<   d,|› d-�}|r|› d.|› �n||d/<   |S )0a  Parent-visible result entry (status, exit_reason, tool trace, tokens, cost).
    ``status``/``exit_reason``/``truncated`` follow the ``_run_single_child`` contract; a structured failure always
    wins over the summary-presence heuristic (a fallback for legacy/mock results only).r  rƒ   r½   r€  F)r€  r€  r   )Úflatten_message_textzOperation interrupted.c              3  óž   •K  — | ]D  }|j                  d «      dk(  sŒ ‰|j                  d«      «      j                  «       xŠ‰vr‰–— ŒF y­w)r™  rš  r¡  N)rŸ   rÊ   )r”   Úmr±  ÚplaceholdersÚts     €€€r   r—   z&_build_result_entry.<locals>.<genexpr>;  sP   øè ø€ ò g˜aÈQÏUÉUÐSYË]Ð^iÓMiÙ"6°q·u±u¸YÓ7GÓ"H×"NÑ"NÓ"PÐP˜QÐYeÑeô ñ gùs
   ƒA�0Ar‡  Úfailedr)   )r¶  r)   Ú	completedrp   Úsession_estimated_cost_usdré   Úsession_cost_statusNr*   rl   Úsession_prompt_tokensÚsession_completion_tokens)ÚinputÚoutputr%   )r&   r'   r(   r*   r+   rl   Úexit_reasonÚ	truncatedÚtokensr¦  r,   Ú_child_cost_usdrÁ  é   Úcost_usdrž  Úcost_statusz$Subagent did not produce a response.Úfailure_reasonÚschema_validÚschema_retriesÚschema_errorsz8Final answer does not satisfy the declared output_schemaz (after 1 retry)u–   ; `summary` is the child's raw, UNVALIDATED final text â€” extract what you need from it yourself (see schema_errors) rather than re-running the task.Úschema_notern  r3   uL   [steer did not land â€” the subagent finished before it could be delivered: r4   ú

r(   )rŸ   ÚboolrÊ   Úagent.message_contentr±  rg  Úreversedr-   r#   r   r¯  r   r   r   rë   r"   ru  rˆ  rv  ry  rx  )r/   ro  r&   r0   ru  r(   Úusable_summaryÚinterrupt_noter'   r¾  ÚpartialÚ_costÚ_cost_statusr6   Ú_failure_reasonÚ_missed_steerÚ
_miss_noter±  r´  rµ  s                    @@@r   Ú_build_result_entryrÖ  )  s&  ú€ ð �j‰jÐ)Ó*Ò0¨b€Gô ˜'“]ÒC w§}¡}£¸)Ñ'C€NØ€NØ‡z�z�- Ô'Ø:Ñˆ�õ 	?Ø˜GŸM™M›OÐ-EÐFˆÜõ g¤8¨F¯J©J°zÓ,BÒ,HÀbÓ#Iô gØhjólˆáØ&-§m¡m£o°w˜G‰NØ	�‰�HÔ	 §¡¨GÔ!4ð 0Ñˆ‘ð &,§Z¡Z°¸UÔ%C‘kÐIYˆÙ .‘°Hˆä�EÐ7¸Ó=€EÜ˜5Ð"7¸Ó>€Lð !ØØØ—Z‘Z ¨QÓ/Ø$Üœg e¨W°dÓ;Ó<Ø"ð !Ð$4Ñ4äœ' %Ð)@À!ÓDÓEÜœ7 5Ð*EÀqÓIÓJñ
ô (¨¯
©
°:Ó(>Ò(DÀ"ÓEô ˜uÐ&6¸Ó=Ü2<¸UÄSÌ%ÀLÔ2Qœ5 ¢¨#Ô.ÐWZñ)€Eô. ˜eÐ$5Ñ6¸Ó:€Eˆ*ÑÜ+5°lÄCÔ+HÉ\™<Ð_h€Eˆ-ÑØ�ÒØŸ™ GÐ-SÓTˆˆg‰ð !Ÿ*™*Ð%5Ó6ˆÜ�o¤sÔ+±Ø&5ˆEÐ"Ò#Ù	Ø'ˆˆg‰ô �&—-‘-¤Ô&Ü $ V§\¡\Ó 2ˆˆnÑØ�>Š>Ø&,§n¡nˆEÐ"Ñ#Ø�|Š| §¢Ø%+§]¡]ˆE�/Ñ"Ø�<‰<˜5Ñ ¡^àJØ)/¯ªÑ%¸RñAðPñPð �-Ñ ð —J‘J˜Ó/€MÜ�-¤Ô%¨-×*=Ñ*=Ô*?Ø -ˆˆnÑØgÐhuÐgvÐvwÐxˆ
Ù;B˜g˜Y d¨:¨,Ñ7È
ˆˆiÑØ€Lr   c                ó$   — | j                  d«      S )N)zhttp://zhttps://údata:image/)Ú
startswith)Úrefs    r   Ú_is_image_urlrÛ  �  s   € Ø�>‰>Ð@ÓAÐAr   c                óž  — 	 |D �cg c]  }|j                  d«      sŒ|‘Œ }}|D �cg c]  }t        |«      sŒ||vsŒ|‘Œ }}|D �cg c]  }t        |«      rŒ|‘Œ }}ddlm}m} d}	t        d«      5  ddlm}
  |
«       }	ddd«        |t        t        |dd«      xs d«      t        t        |dd«      xs d«      |	t        t        |d	d«      xs d«      ¬
«      }|dk(  ry || ||«      \  }}|r2t        j                  dt        |«      dj                  |dd «      «       |r |xs d| dœg|D �cg c]	  }dd|idœ‘Œ c}z   }t        d„ |D «       «      r|S | S |rt        j                  dt        |«      «       g }|D ]M  }t        j                   j#                  |«      r|j%                  d|› d�«       Œ8t        j                  d|«       ŒO |j'                  d„ |D «       «       |s| S | dz   dj                  |«      z   dz   S c c}w c c}w c c}w # 1 sw Y   �Œ–xY wc c}w # t(        $ r t        j                  dd¬«       | cY S w xY w) u[  The child's first user message when a task forwards ``images``.

    Routing reuses the inbound-image policy (``agent.image_routing``, honouring ``agent.image_input_mode``): a
    vision-capable child gets an OpenAI-style content list (text part + one ``image_url`` part per image; local files
    as data URLs behind the read guard, http(s)/data URLs verbatim); otherwise the goal gains ``[Image attached â€¦]``
    hint lines for ``vision_analyze``. Any failure degrades to the text-only goal so image plumbing never breaks a
    spawn â€” logged at warning since the caller asked for the images.
    rØ  r   )Úbuild_native_content_partsÚdecide_image_input_modeN)Úload_config_readonlyrm   rƒ   rl   Úrequested_provider)rà  Únativez>delegate_task: skipped %d unreadable image(s) for subagent: %sú, é   Útext)Útyperä  Ú	image_urlÚurl)rå  ræ  c              3  óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)rå  ræ  N)rŸ   )r”   Úps     r   r—   z,_build_child_goal_message.<locals>.<genexpr>®  s   è ø€ ÒLÀ §¡ f£°Õ <ÑLùs   ‚ zLdelegate_task: %d inline data-URL image(s) dropped for a non-vision subagentz[Image attached at: r4   z6delegate_task: image path not found, not forwarded: %sc              3  ó(   K  — | ]
  }d |› d�–— Œ y­w)z[Image attached: r4   Nr5   )r”   Úus     r   r—   z,_build_child_goal_message.<locals>.<genexpr>·  s   è ø€ Ò<°!Ð(¨¨¨1Ô-Ñ<ùs   ‚rÊ  ra   z,
Use vision_analyze to inspect these images.z>delegate_task: image forwarding failed; sending text-only goalTr:   )rÙ  rÛ  Úagent.image_routingrÝ  rÞ  r   Úhermes_cli.configrß  r"   r-   rZ   rÑ   r…   rÐ   ÚanyÚosÚpathÚisfilerH   r¢   rz   )rÓ   Úimagesr/   r¼   Ú	data_urlsÚurlsÚpathsrÝ  rÞ  Úcfgrß  ÚmodeÚpartsÚskippedrë  Úhintsré  s                    r   Ú_build_child_goal_messagerû  ‘  s{  € ð#à &ÖF˜1¨!¯,©,°}Õ*E’QÐFˆ	ÐFØ!ÖM�a¤]°1Õ%5¸!À9Ò:L’ÐMˆÐMØ"Ö;�q¬-¸Õ*:’Ð;ˆÐ;ß[ØˆÜ�D‹\ñ 	)Ý>Ù&Ó(ˆC÷	)ñ 'Ü”˜˜z¨2Ó.Ò4°"Ó5´s¼7À5È'ÐSUÓ;VÒ;\ÐZ\Ó7]Ð_bÜ"¤7¨5Ð2FÈÓ#KÒ#QÈrÓRô
ˆð �8ÒÙ7¸¸eÀTÓJ‰NˆE�7ÙÜ—‘Ð_ÔadÐelÓamÐos×oxÑoxð  zAð  BDð  CDð  zEó  pFô  GÙØÒB¨F¸DÑ#AÐ"Bð  @Iö  GJÐz{ÐP[ÐkpÐrsÐjtÓGuò  GJñ  J�ÜÑLÀeÔLÔL�5ÐVÐRVÐVÙÜ�N‰NÐiÔknÐoxÓkyÔzØˆØò 	\ˆAÜ�w‰w�~‰~˜aÔ Ø—‘Ð3°A°3°aÐ8Õ9ä—‘ÐWÐYZÕ[ð		\ð
 	�‰Ñ<°tÔ<Ô<ÙØˆKØ�f‰}˜tŸy™y¨Ó/Ñ/Ð2aÑaÐaùò= GùÚMùÚ;÷	)ñ 	)üò GJøô ò Ü�‰ÐWÐbfˆÔgØŠðús…   ‚H' †H�H¡H' §H¸H½HÁH' ÁHÁHÁH' Á3HÂB1H' Ä2H"Å H' ÅH' ÅBH' Ç,H' ÈH' ÈHÈH' È'"IÉIc                  ó^  — e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   ded<   dZded<    eej                  ¬«      Z	ded<   dZ
ded<   dZded<   dZd	ed<   dZded<    ee¬«      Zded<   d'd„Zd(d„Zd)d„Zd*d„Zdddœ	 	 	 	 	 	 	 	 	 	 	 d+d„Zd,d „Zd-d!„Zd.d"„Zd/d#„Zd/d$„Zd0d%„Zd1d&„Zy)2Ú	_ChildRunzçState of one child run, shared by every phase of ``_run_single_child``.
    ``worktree_info`` stays None until isolation engages (``attach_worktree`` is
    then a no-op on every early error path); ``seed_workspace`` sets the rest.r   r/   rC   r   r&   r"   rÓ   úOptional[str]rÖ   Úchild_progress_cbNÚ	heartbeat)Údefault_factoryr   Úchild_startzOptional[Dict[str, str]]Úworktree_inforƒ   r�  rD  ré   Ú
wall_startry   Úparent_reads_snapshotc                óX   — t        t        j                  «       | j                  z
  d«      S )Nrê   )rë   rí   Ú	monotonicr  r	  s    r   Úelapsedz_ChildRun.elapsedÔ  s!   € Ü”T—^‘^Ó%¨×(8Ñ(8Ñ8¸!Ó<Ð<r   c                ó:   — |rt        | j                  d|¬«       yy)uß   Stream callback forwarding the child's reply text up the progress relay so gateway watch windows mirror it
        live (subagent.text â†’ message.delta). Inert under CLI/TUI: their progress handlers ignore non-tool events.zsubagent.text©ÚpreviewN)r   rÿ  )rû   Údeltas     r   Ú
relay_textz_ChildRun.relay_text×  s   € ñ Ü˜4×1Ñ1°?ÈEÖRð r   c                óæ   — | j                   }|€|S ddlm} 	 |j                  |«      |d<   |S # t        $ r9}t
        j                  d|«       |j                  |d|› �«      |d<   Y d}~|S d}~ww xY w)zWInspect + prune the child worktree, reporting into the entry (no-op without isolation).Nr   r>  Úworktreezworktree finalize failed: %szfinalize raised: )r  r‹   r?  Úfinalize_subagent_worktreerz   rZ   rÑ   Úunproven_worktree_payload)rû   Ú
entry_dictÚinfor?  r\   s        r   Úattach_worktreez_ChildRun.attach_worktreeÝ  sŒ   € à×!Ñ!ˆØˆ<ØÐÝ+ð	pØ%6×%QÑ%QÐRVÓ%WˆJ�zÑ"ð Ðøô ò 	pô �N‰NÐ9¸1Ô=Ø%6×%PÑ%PÐQUÐYjÐklÐjmÐWnÓ%oˆJ�zÕ"ØÐûð	pús   ˜. ®	A0·.A+Á+A0c                ó¦  — ddl }| j                  xs- d| j                  › d|j                  «       j                  dd › �| _        t        | j                  dd«      | _        t        d«      5  ddl
m}m}m}  || j
                   || j                  «      «        || j
                  | j                  «       ddd«       t        | j                  | j                  | j                  «      | _        | j                  �dt        d	«      5  dd
l
m}  || j
                  | j                  d   «       ddd«       ddlm} | j$                   || j                  «      z   | _        t'        j&                  «       | _        | j                  r.t+        t-        j.                  | j                  «      «      | _        yg | _        y# 1 sw Y   �ŒxY w# 1 sw Y   Œ›xY w)zžSeed cwd/container aliases and optional worktree isolation for the child;
        ``goal`` is extended with the worktree contract note when isolation engaged.r   Nz	subagent-r¶   é   Ú_current_task_idzChild cwd seed failed: %s)r@  Úrecord_session_cwdÚregister_container_aliaszworktree cwd seed failed: %s)r  rð  )Úbuild_worktree_context_note)ÚuuidrÖ   r&   Úuuid4Úhexr�  r-   rC   rD  r   rB  r@  r  r  rG  r  Útools.subagent_worktreer  rÓ   rí   r  ry   r   Úknown_readsr  )rû   Ú_uuidr@  r  r  Ú_rscr  s          r   Úseed_workspacez_ChildRun.seed_workspaceì  s„  € ó 	Ø!×-Ñ-Òf°9¸T¿_¹_Ð<MÈQÈuÏ{É{Ë}×O`ÑO`ÐacÐbcÐOdÐNeÐ1fˆÔÜ% d×&7Ñ&7Ð9KÈTÓRˆÔô Ð/Ó0ñ 	NßiÑiÙ˜t×1Ñ1±?À4×CVÑCVÓ3WÔXÙ$ T×%7Ñ%7¸×9LÑ9LÔM÷	Nô
 7°t×7HÑ7HÈ$×J]ÑJ]Ð_c×_oÑ_oÓpˆÔØ×ÑÐ)ÜÐ6Ó7ñ EÝJÙ�T×'Ñ'¨×);Ñ);¸FÑ)CÔD÷Eõ
 LØŸ	™	Ñ$?À×@RÑ@RÓ$SÑSˆDŒIÜŸ)™)›+ˆŒØZ^×ZmÒZm¤T¬*×*@Ñ*@À×ATÑATÓ*UÓ%VˆÕ"ÐsuˆÕ"÷	Nñ 	Nú÷Eð Eús   Á,AF:Ä'GÆ:GÇG)r(   r'   c               ó†   — t        | j                  d||xs |d   |d   |¬«       t        ||«       | j                  |«      S )z¸Shared tail of every failure path: emit ``subagent.complete`` (``status`` defaults to the entry's), note
        the steer text that won the race with the failure, report the worktree.úsubagent.completer'   r+   )r  r'   r+   r(   )r   rÿ  r8   r  )rû   r6   r7   r  r(   r'   s         r   Úfinish_failedz_ChildRun.finish_failed  sQ   € ô
 	Ø×"Ñ"Ð$7ÀÐQWÒQjÐ[`ÐaiÑ[jØ"Ð#5Ñ6Àõ	
ô 	˜U JÔ/Ø×#Ñ# EÓ*Ð*r   c                ó^   — | j                   r t        | j                   | j                  «      S dS )zTClose steer acceptance (see ``_merge_late_steer``); returns late steer text, if any.N)rÖ   r   r/   r	  s    r   Úclose_steeringz_ChildRun.close_steering  s(   € àIM×IYÒIYÔ'¨×(8Ñ(8¸$¿*¹*ÓEÐcÐ_cÐcr   c                óž  — |€|j                  «        yt        j                  «       |z   }||dt        z
  z  z
  }d}t	        | j
                  «      }	 t        j                  «       }||z
  }	|	dk  ryt        t        |	«      }
|st        |
t        ||z
  d«      «      }
|j                  |
¬«       |j                  «       ryt	        | j
                  «      }||k7  r+|}t        j                  «       |z   }||dt        z
  z  z
  }d}nJ|sHt        j                  «       |k\  r1d}t        | j
                  ||t        j                  «       z
  z
  |«       Œý)u  Wait for the worker or the stale verdict, where ``child_timeout`` bounds INACTIVITY, not total runtime.

        A configured cap used to be a dispatch-to-death stopwatch, so it only ever killed children the runtime had
        already judged healthy: all 75 reported deaths happened while waiting on an in-flight LLM completion, none
        mid-tool (#116001). A provider serving multi-minute completions is progress â€” the child's activity clock
        ticks during the wait and the request is bounded by the per-call stale watchdog â€” so the budget restarts on
        every sign of progress, exactly the signals the heartbeat's stale verdict reads. Genuinely frozen children
        keep two authorities: this budget (when configured) and the heartbeat's stale threshold.
        Ng      ð?FTr   ré   )Útimeout)r  rí   r  Ú_BUDGET_WARNING_FRACTIONrç   r/   ÚminÚ_LIVENESS_POLL_SECONDSrì   rP   râ   )rû   rù   rU  rÞ   ÚdeadlineÚwarn_atÚwarnedÚfingerprintrÈ   Ú	remainingr  Úcurrents               r   Úwait_liveness_awarez_ChildRun.wait_liveness_aware  s6  € ð Ð Ø�L‰LŒNØÜ—>‘>Ó# mÑ3ˆØ˜]¨cÔ4LÑ.LÑMÑMˆØˆÜ1°$·*±*Ó=ˆØÜ—.‘.Ó"ˆCØ  3™ˆIØ˜AŠ~ØÜÔ-¨yÓ9ˆDÙÜ˜4¤ W¨s¡]°CÓ!8Ó9�Ø�L‰L ˆLÔ&Ø�~‰~ÔØÜ1°$·*±*Ó=ˆGØ˜+Ò%Ø%�ÜŸ>™>Ó+¨mÑ;�Ø" ]°cÔ<TÑ6TÑ%UÑU�Ø‘Ù¤§¡Ó 0°GÒ ;Ø�Ü" 4§:¡:¨}ÀÌ4Ï>É>ÓK[Ñ@[Ñ/\Ð^kÔlð' r   c                óT  ‡ ‡‡‡‡— ddl m}m}m} ddlm} ‰ j                  ‰ j                  cŠ} |«       } |d| |«       f¬«      }ddiŠt        t        ‰dd«      xs g «      }|rt        ‰ j                  |‰«      n‰ j                  Šˆˆ ˆˆfd	„}	|j                  t        j                  «       j                  |	«      }
‰ j                   �‰ j                   j"                  nt%        j&                  «       Š|
j)                  ˆfd
„«       d}	 ‰ j+                  ‰|
|«       |
j-                  «       s!t        ‰ j                   dd«      }t/        «       ‚|
j1                  «       ddf|j3                  d¬«       S # t4        $ r}|}Y d}~nd}~ww xY w	 |j3                  d¬«       n# |j3                  d¬«       w xY w‰ j7                  «       }t9        ‰«       t;        |t.        t<        f«      }|�|n|}‰ j?                  «       }t@        jC                  d||rdndtE        |«      jF                  › �|«       d}tI        d«      5  tK        ‰jM                  «       jO                  dd«      xs d«      }ddd«       n# 1 sw Y   nxY w|xr |dk(  }d}|rYtQ        ‰|tS        |xs d«      tS        |«      ‰jO                  d«      ‰ j                  ¬«      }|rt@        jC                  d||«       |stU        |«      }n|�d|› d|d›d�}n|rd|› d�}n	d|› d|› d�}|r|d|› �z  }|rdnd}||d|||||r|nd|r|nd|rd n|rd!nd|rtW        ‰«      ndt        ‰d"d«      |d#œ}‰ jY                  |||rd$|› d%�n
tU        |«      ¬&«       |xr |
j-                  «        }|rt[        ‰|
«       d||fS )'uÒ  Run the child's conversation on a daemon worker: ``(result, None, False)`` or ``(None, error_entry,
        close_deferred)`` on timeout/exception.

        Hard timeout is off by default (``result(timeout=None)``; stuck children are the heartbeat's job). Daemon
        worker: an abandoned timed-out child on a non-daemon thread would block interpreter exit at atexit join. The
        worker installs a non-interactive approval callback (deny/approve per delegation.subagent_auto_approve) so
        dangerous-command prompts never fall back to ``input()`` and deadlock the parent TUI. On failure: steer
        acceptance closes BEFORE the stop signal (a concurrent steer is drained into the entry or rejected, never
        lost); a 0-API-call timeout gets a diagnostic dump; a worker that still owns the child gets ``child.close()``
        via a Future done-callback (``close_deferred=True``) â€” closing here would race its still-unwinding finally
        path.
        r   )Ú_get_child_timeoutÚ_get_subagent_approval_callbackÚ_set_subagent_approval_cb)ÚDaemonThreadPoolExecutorr™   )Úmax_workersÚinitializerÚinitargsrµ  NÚ_delegate_imagesc            	     óú   •— t        j                  «       ‰d<   ddlm}   | t	        t        ‰dd«      xs d«      «      5  ‰j                  ‰‰j                  ‰j                  ¬«      cd d d «       S # 1 sw Y   y xY w)Nrµ  r   r�  r-  rƒ   rƒ  )	r›   Úcurrent_threadrŠ  r‚  r"   r-   r‹  r�  r  )r‚  r/   rû   r„  Úworker_thread_holders    €€€€r   Ú_run_with_thread_capturez7_ChildRun.await_child.<locals>._run_with_thread_captureV  sr   ø€ Ü(1×(@Ñ(@Ó(BÐ  Ñ%ÝHÙ(¬¬W°U¸LÈ"Ó-MÒ-SÐQSÓ)TÓUñ Ø×-Ñ-Ø!-°t×7IÑ7IÐ[_×[jÑ[jð .ó ÷÷ ò ús   ¿(A1Á1A:c                ó$   •— ‰j                  «       S r!   )r  )Ú_frù   s    €r   rÃ   z'_ChildRun.await_child.<locals>.<lambda>d  s   ø€ ¨G¯K©K«M€ r   rú   Fr  zSubagent %d %s after %.1fsz	timed outzraised rä   ré   )r/   r&   rÒ   r+   r©   rÓ   u;   Subagent %d 0-API-call timeout â€” diagnostic written to %sz'Subagent stopped making progress after u!    API call(s) â€” no activity for Úgz@s (heartbeat stale threshold); the pending worker was abandoned.zSubagent timed out after u˜   s without making any API call â€” the child never reached its first LLM request (prompt construction, credential resolution, or transport may be stuck).zs with u®    API call(s) completed â€” no progress in that window (no completed call, tool change, or activity-clock tick): a stalled provider request or an unresponsive network request.z Diagnostic: r)  r)   Úbefore_first_llm_callÚafter_llm_callsr%   )r&   r'   r(   r)   r¾  r*   r+   rÒ   Útimed_out_after_secondsÚtimeout_phaseÚlast_event_ager,   Údiagnostic_pathzTimed out after r¼   r
  ).r  r5  r6  r7  Útools.daemon_poolr8  r/   r&   ry   r-   rû  rÓ   ÚsubmitÚcontextvarsÚcopy_contextÚrunr   rù   r›   rø   rV  r3  rT  ÚFuturesTimeoutErrorro  Úshutdownrz   r'  rQ   r   r   r  rZ   rÑ   rå  r   r   r   rÀ   rŸ   rÚ   r   r"   rï   r%  rY  )rû   r5  r6  r7  r8  r&   rÞ   ÚexecutorÚ_imagesr@  ÚfutureÚstale_afterÚwait_excr}   Ú_late_pending_steerÚ
is_timeoutÚtimeout_causer0   Úchild_api_callsÚbefore_first_callrI  Ú_errr'   Ú_error_entryÚclose_deferredr/   rù   r„  r?  s   `                        @@@@r   Úawait_childz_ChildRun.await_child<  sþ  ü€ ÷ 	yÑxÝ>Ø ŸJ™J¨¯©ÐˆˆzÙ*Ó,ˆÙ+ØÐ'@ÑLkÓLmÐKoô
ˆð HKÈDÀkÐä”w˜uÐ&8¸$Ó?ÒEÀ2ÓFˆÙT[Ô5°d·i±iÀÈ%ÔPÐae×ajÑajˆ÷	ð —‘¤×!9Ñ!9Ó!;×!?Ñ!?ÐAYÓZˆð
 -1¯N©NÐ,F�$—.‘.×(Ò(ÌIÏOÉOÓL]ˆØ× Ñ Ó!9Ô:à'+ˆð
	*Ø×$Ñ$ W¨f°mÔDØ—;‘;”=Ü% d§n¡nÐ6OÐQUÓV�Ü)Ó+Ð+Ø—=‘=“? D¨%Ð/ð
 ×Ñ 5ÐÕ)øô	 ò 	*Ø!)�Cûð	*úØð ×Ñ 5ÐÕ)øˆH×Ñ 5ÐÕ)úà"×1Ñ1Ó3ÐÜ˜5Ô!Ü Ô&9¼<Ð%HÓIˆ
à'2Ð'>™ÀMˆØ—<‘<“>ˆÜ�‰Ð3°ZÑPZÁÐbiÔjnÐorÓjs×j|Ñj|Ði}Ð`~ð  AIô  	JØˆÜ�D‹\ñ 	^Ü! %×"<Ñ"<Ó">×"BÑ"BÐCSÐUVÓ"WÒ"\Ð[\Ó]ˆO÷	^÷ 	^ñ 	^úð 'Ò?¨?¸aÑ+?ÐØ)-ˆÙÜ?Ø¨
ä % mÒ&:°sÓ ;ÌeÐT\ËoØ2×6Ñ6°sÓ;À$Ç)Á)ô	ˆOñ Ü—‘Ð\Ð^hÐjyÔzÙÜ�s“8‰DØÐ$à9¸/Ð9JÐJkØ˜q�/Ð!aðcñ ñ à+¨M¨?ð ;mð nñ ð ,¨M¨?¸'À/ÐARð SGð Hð ñ
 Ø�m OÐ#4Ð5Ñ5ˆDÙ(‘¨gˆà$°À4ÐRVÐgmØ(¸hÙ0:™}ÀÙ3=¡xÀ4Ù8IÑ4ÑdnÑO`Ðtxñ ?IÔ3°EÔ:ÈdÜ" 5Ð*:¸DÓAØ.ñ
ˆð 	×Ñ˜<Ð)<ÑhrÐHXÐYaÐXbÐbcÑFdÔx{Ð|ó  yAÐô  	BØ#Ò9¨F¯K©K«MÐ(9ˆÙÜ& u¨fÔ5Ø�\ >Ð1Ð1s7   ÄAE6 Å6	FÅ?FÆF" ÆFÆF" Æ"F6È?.I6É6I?c           	     ó.  — | j                   r| j                  syt        dd¬«      5  t        j                  | j                   | j
                  | j                  «      }|r0t        |j                  «       D ��ch c]  }|D ]  }|’Œ Œ c}}«      ng }|s
	 ddd«       yddj                  |dd «      z   t        |«      dkD  rdt        |«      dz
  › d	�nd
z   dz   }|j                  d«      r|d   |z   |d<   n||d<   ddd«       yc c}}w # 1 sw Y   yxY w)uÈ   Warn the parent when this child wrote files the parent had already read. Checks writes by ANY non-parent
        task_id (not just this child's) so nested orchestratorâ†’worker chains are covered too.Nz%file_state sibling-write check failedTr:   uX   

[NOTE: subagent modified files the parent previously read â€” re-read before editing: râ  r  z (+z more)rƒ   r4   r(   Ústale_paths)rD  r  r   r   Úwrites_sincer  rÎ   ÚvaluesrÐ   r…   rŸ   )rû   r6   Úsibling_writesrõ  ré  Ú	mod_pathsÚreminders          r   Úappend_sibling_write_reminderz'_ChildRun.append_sibling_write_reminder°  s&  € ð ×#Ò#¨×(BÒ(BØÜÐ;ÀdÔKñ 	1Ü'×4Ñ4°T×5HÑ5HÈ$Ï/É/Ð[_×[uÑ[uÓvˆNÙ[iœ¨~×/DÑ/DÓ/F×V eÐPUÒVÈ1¢ÐV ÓVÔWÐoqˆIÙØ÷		1ð 	1ð mØ—)‘)˜I b q˜MÓ*ñ+ä7:¸9³~ÈÒ7I�Sœ˜Y›¨!Ñ+Ð,¨FÑ3ÈrñSð ñð ð �y‰y˜Ô#Ø#(¨Ñ#3°hÑ#>��iÒ à'0��mÑ$÷	1ð 	1ùãV÷	1ð 	1ús%   §ADÁ7DÂDÂADÄDÄDc                ó^  — t        t        | j                  dd«      xs g «      }|r||d<   t        d«      5  ddlm}m} |j                  | j                  «      }|rV|D �cg c]G  }|j                  |j                  dd t        t        j                  «       |j                  z
  «      dœ‘ŒI c}|d<   |j                  | j                  «      }|r@|D �cg c]1  }|j                  |j                  dd |j                   ||d	«      d
œ‘Œ3 c}|d<   ddd«       yc c}w c c}w # 1 sw Y   yxY w)aO  Name the child's background processes on the result BEFORE ``cleanup`` kills them: handed-off ones now
        belong to the parent (their completion lands in the parent's chat); anything else still running is about to be
        terminated, and the parent must hear that from the runtime rather than trust a child's "watcher running".Ú_handed_off_processesNÚhanded_off_processesr   )Úprocess_registryÚ_output_tailéÈ   )r-  ÚcommandÚruntime_secondsÚorphaned_processeséX  )r-  rm  Ú	exit_codeÚoutput_tailÚunread_completions)ry   r-   r/   r   Útools.process_registryrj  rk  Úrunning_owned_byr�  r^  rm  rë   rí   r1  Úunread_completions_owned_byrq  )rû   r6   Úhandedrj  rk  Úleftoverr¼   Úunreads           r   Úaccount_background_processesz&_ChildRun.account_background_processesÅ  s4  € ô ”g˜dŸj™jÐ*AÀ4ÓHÒNÈBÓOˆÙØ,2ˆEÐ(Ñ)Ü�D‹\ñ 	KßMØ'×8Ñ8¸×9KÑ9KÓLˆHÙð &ö/'àð $%§4¡4°A·I±I¸d¸s°OÔX]Ô^b×^gÑ^gÓ^iÐlm×lxÑlxÑ^xÓXyÓzò/'�Ð*Ñ+ð &×AÑAÀ$×BTÑBTÓUˆFÙð DJö/Kà>?ð $%§4¡4°A·I±I¸d¸s°OÐRS×R]ÑR]Ù$0°°CÓ$8ó:ò/K�Ð*Ñ+÷	Kð 	Kùò/'ùò
/K÷	Kð 	Kús*   ·*D#Á!ADÂ-'D#Ã6DÄ
D#Ä
D#Ä#D,c                óþ  — | j                   sy| j                  }|d   }g }t        d«      5  t        t	        j
                  | j                  «      «      dd }ddd«       i }t        d«      5  t	        j                  d| j                  g «      }ddd«       |r|dd n|j                  dd«      |d   ||r|dd n|j                  dd«      t        t        |d	d
«      «      t        t        |dd
«      «      t        t        |dd
«      «      t        |d   «      |t        |j                  «       D ��	�
ch c]  \  }}	|| j                  k(  sŒ|	D ]  }
|
’Œ Œ  c}
}	}«      dd t        |dd¬«      dœ}|j                  d«      r|d   |d<   t        |dd«      }|�"t        d«      5  t        |«      |d<   ddd«       t!        | j                   dfi |¤Ž y# 1 sw Y   �Œ|xY w# 1 sw Y   �ŒRxY wc c}
}	}w # 1 sw Y   ŒBxY w)z¼Fire ``subagent.complete`` with the per-branch observability payload (tokens, cost, files touched,
        tool-output tail); every field is optional and degrades gracefully on the client.Nr(   r˜   rƒ   é    r)   r'   iô  rº  r   r»  Úsession_reasoning_tokensr*   r  rp  )Úmax_entriesÚ	max_chars)r  r'   r+   r(   Úinput_tokensÚoutput_tokensÚreasoning_tokensr*   Ú
files_readÚfiles_writtenrr  rÅ  r¸  rÃ  r$  )rÿ  r/   r   ry   r   r  r�  ra  r  rŸ   r   r-   rÎ   rž   r   r   r   )rû   ro  r6   r0   r/   r(   Ú_files_readÚ_files_written_mapÚtidrõ  ré  Úcomplete_kwargsÚ	_cost_usds                r   Úemit_completez_ChildRun.emit_completeÙ  s"  € ð ×%Ò%ØØ—
‘
ˆØ˜	Ñ"ˆØˆÜ�D‹\ñ 	PÜœz×5Ñ5°d×6HÑ6HÓIÓJÈ3ÈBÐOˆK÷	Pà#%ÐÜ�D‹\ñ 	RÜ!+×!8Ñ!8¸¸T¿_¹_ÈbÓ!QÐ÷	Rñ )0�w˜t ‘}°U·Y±Y¸wÈÓ5KØ˜H‘oØ (Ù(/�w˜t ‘}°U·Y±Y¸wÈÓ5KÜ ¤¨Ð0GÈÓ!KÓLÜ!¤'¨%Ð1LÈaÓ"PÓQÜ $¤W¨UÐ4NÐPQÓ%RÓ SÜ˜e KÑ0Ó1Ø%Ü#Ð9K×9QÑ9QÓ9S÷  %Að  %A©:¨3°ÐWZÐ^b×^pÑ^pÓWpÐzò  %AÐuv¢Qð  %A Qô  %Aó  Bð  CFð  DFð  GÜ/°ÀAÐQTÔUñ+
ˆð �9‰9Ð%Ô&à05Ð6FÑ0GˆOÐ,Ñ-Ü˜EÐ#?ÀÓFˆ	ØÐ Ü˜“ñ ?Ü.3°IÓ.>� 
Ñ+÷?ä�t×-Ñ-Ð/BÑVÀoÓV÷3	Pñ 	Pú÷	Rñ 	Rüô %A÷?ð ?ús/   ¬,GÁ-"GÄ2G,Å
G,Æ#G3ÇGÇG)Ç3G<c          
     óP  — | j                   }|j                  «        | j                  rt        | j                  |¬«       |�'|�%t	        d«      5  |j                  |«       ddd«       ddl}t        |dd«      }t        |t        «      rt        |«      |_
        t        | j                  |«       |st        |d«       t	        d«      5  ddlm}  |t!        t        |d	d
«      xs d
«      «       ddd«       t	        d«      5  ddlm}	 |	j'                  d¬«      }
t!        t        |d	d
«      xs d
«      }|	j(                  j+                  |	j-                  «       |¬«      }|
�|r|s|
j/                  d|i«       ddd«       y# 1 sw Y   �Œ$xY w# 1 sw Y   Œ¡xY w# 1 sw Y   yxY w)uo  Finally-path teardown (idempotent, never raises). Order matters: stop heartbeat â†’ drop registry entry â†’
        release credential lease â†’ restore the parent's process-global tool names â†’ detach from the parent's
        interrupt list â†’ close the child (unless a timed-out worker still owns it) â†’ pop the child's Relay scope if
        no turn is active.)r3  Nz&Failed to release credential lease: %sr   Ú_delegate_saved_tool_namesz,Failed to close child agent after delegationz0Failed to dispose child execute_code kernels: %s)Ú$shutdown_kernels_for_delegated_childr-  rƒ   z4Failed to close child Relay session after delegation)Úrelay_runtimeF)Úcreate)Úprofile_keyr-  Úchild_session_id)r/   r
  rÖ   r   r   ri  Úmodel_toolsr-   r   ry   Ú_last_resolved_tool_namesr]   rC   r?   Útools.code_kernelr�  r"   r3  rŽ  Úget_runtimeÚSESSION_COORDINATORÚhas_active_turnÚcurrent_profile_keyÚunregister_subagent)rû   r   rj  r_  r]  r/   r’  Úsaved_tool_namesr�  rŽ  Úruntimer‘  Úchild_turn_is_actives                r   Úcleanupz_ChildRun.cleanupü  s£  € ð
 —
‘
ˆØ�‰Ôð ×ÒÜ  ×!1Ñ!1¸Õ?àÐ! nÐ&@ÜÐ@ÓAñ 9Ø×(Ñ(¨Ô8÷9ó
 	Ü" 5Ð*FÈÓMÐÜÐ&¬Ô-Ü48Ð9IÓ4JˆKÔ1ä�d×'Ñ'¨Ô/ñ Ü˜Ð NÔOô ÐFÓGñ 	^ÝNÙ0´´W¸UÀLÐRTÓ5UÒ5[ÐY[Ó1\Ô]÷	^ô ÐJÓKñ 	TÝ+Ø#×/Ñ/°uÐ/Ó=ˆGÜ"¤7¨5°,ÀÓ#CÒ#IÀrÓJÐØ#0×#DÑ#D×#TÑ#TØ)×=Ñ=Ó?ÐL\ð $Uó $Ð ð Ð"Ñ'7Ñ@TØ×+Ñ+Ð-?ÐAQÐ,RÔS÷	Tð 	T÷19ñ 9ú÷$	^ð 	^ú÷	Tð 	Tús%   ÁFÃ	'FÄA7FÆFÆFÆF%)r  r   )r  r"   r  r  )r  úDict[str, Any]r  rž  r  )r6   rž  r7   rþ  r  r"   r(   r"   r'   rþ  r  rž  )r  rþ  )rù   zthreading.EventrU  r   rÞ   úOptional[float]r  r  )r  z?tuple[Optional[Dict[str, Any]], Optional[Dict[str, Any]], bool])r6   rž  r  r  )ro  rž  r6   rž  r0   r   r  r  )
r   rñ   rj  r   r_  r   r]  rË  r  r  )r   r!  r"  r#  rz  r   r   rí   r  r  r  r�  rD  r  ry   r  r  r  r  r"  r%  r'  r3  r^  rf  rz  rŠ  r�  r5   r   r   rý  rý  À  s  … ñRð ƒJØÓØƒOØ
ƒIØÓØÓØ€IˆsÓÙ¨t¯~©~Ô>€K�Ó>Ø.2€MÐ+Ó2Ø€M�3ÓØ$(€N�MÓ(Ø€J�ÓÙ"'¸Ô"=Ð˜4Ó=ó=óSóóvð6 acð  }Añ
+Ø#ð
+Ø1>ð
+ØLOð
+ØZ]ð
+Ølyð
+à	ó
+ódó$móLr2óh1ó*Kó(!WôF-Tr   rý  )r   )r   r   r   r   r  r   )r   r   r  rþ  )r.   r   r'   r"   r)   r"   r/   r   r0   r   r  rž  )r6   rž  r7   rþ  r  r  )r/   r   r>   r"   r  r  )rC   r   rD   r"   r/   r   r  r  )rC   r   r/   r   r  r  )r/   r   r_   r"   rN   r"   r  r  )rf   r   rg   r"   r  rw  )r{   r"   r  rw  )r/   r   r  rw  )r©   úOptional[threading.Thread]r  rw  )r/   r   r&   r   rÒ   r   r+   r   r©   r   rÓ   r"   r  rþ  )rÝ   r   rÞ   r   r  r"   )r/   r   rÝ   r   rÞ   r   r  r  )r/   r   r  Útuple)r/   r   r  rŸ  )r/   r   rC   r   r&   r   r  rñ   )r/   r   rC   r   rÓ   r"   r5  rþ  r6  r   r7  r   r  rþ  )rC   r   rD  r   rÖ   rþ  )r/   r   rU  r   r  r  )r/   r   r  ztuple[Any, Optional[str]])ro  rž  rÖ   rþ  r/   r   r  r  )r/   r   ro  rž  r&   r   r�  r"   rŽ  r   r  rt  )r‡  r   r  zlist[Dict[str, Any]])r/   r   ro  rž  r&   r   r0   r   ru  rt  r  rž  )rÚ  r"   r  rË  )rÓ   r"   rò  rw  r  r   )Jr#  Ú
__future__r   ÚloggingrL  rŒ   rï  r›   rí   Úconcurrent.futuresr   rO  Útypingr   r   r   r   Úagent.interrupt_compatr	   Údataclassesr
   r   r‹   r   Útools.delegate_tool_progressr   r   Útools.delegate_tool_registryr   r   r   r   Útools.delegate_tool_resultsr   r   r   r   Ú	getLoggerrZ   r   r#   r1   r8   r?   rF   rU   r]   rQ   rk   rÍ   r~   r�   r¯   rÚ   r,  r*  rß   râ   rç   rï   rñ   r%  r:  rG  rY  rl  rr  rt  r—  r¯  rÖ  rÛ  rû  rý  r5   r   r   ú<module>r¬     sF  ðñPõ #ã Û Û Û 	Û Û Ý Bß ,Ó ,Ý 9ß (Ý ß ?÷ó ÷ó ð 
ˆ×	Ñ	Ð0Ó	1€ôFó5ôóbóó:ó%ó*Kð E^õ .ózðÐ ó
$óMó(vð85Øð5Ø"ð5Ø5:ð5ØNSð5à-ð5à58ð5ð ó5ðv Ð ð Ð óó=ó	ió÷Hñ HóV7ð$Øð$Ø!ð$Ø),ð$ØCPð$Øcfð$àð$ð ó$óLó*ó<&ó4lð ÷ð ó ðð(LØð(LØ&ð(LØ47ð(LØHKð(LØ_bð(Làó(LóTð@aØðaØ&ðaØ47ðaØCHðaØR`ðaàóaóHBó,ð^ ÷hTð hTó ñhTr   