+
    lHàj†[  ã                  óB  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
 ^ RIHtHt ^ RIHtHtHtHtHt ]P(                  ! R4      tR R ltR	 R
 ltR^RR/R R llt]! 0 R6m4      t]! 0 R7m4      tR8R R lltR8R R lltR8R R lltR R ltR R lt Rt!Rt"Rt#R R lt$R R  lt%R! R" lt&R# R$ lt'R% R& lt(R' R( lt)]PT                  ! 4       t+]PX                  ! 4       t-]PX                  ! 4       t.R) t/R* R+ lt0R, R- lt1R. R/ lt2R0 R1 lt3R2 R3 lt4R9R4 R5 llt5R# ):zmSubagent result post-processing: summary budget/spill, tool-trace summaries, lifecycle hooks and cost rollup.)ÚannotationsN)ÚAnyÚDictÚListÚOptional)ÚurlsplitÚ
urlunsplit)Úparent_copyÚredact_child_resultÚredact_child_textÚredact_child_valueÚredact_summaryztools.delegate_toolc               ó    € V ^8„  d   QhRRRR/# )é   Úcontentr   ÚreturnÚstr© )Úformats   "Ú@/home/ubuntu/.hermes/hermes-agent/tools/delegate_tool_results.pyÚ__annotate__r      s   € ÷ ñ  Sð ¨Sñ ó    c                ó  € V f   R# \        V \        4      '       d   V # \        V \        4      '       d   RP                  R V  4       4      # \        V \        4      '       d   \
        P                  ! V R\        R7      # \        V 4      # )z…Stable text for tool-result content. Some OpenAI-compatible paths return
content-block lists; observability must never crash on them.Ú Ú
c              3  ó&  "  € T F‡  p\        V\        4      '       d/   \        VP                  R 4      \        4      '       d
   VR ,          M=\        V\        4      '       d   \        P
                  ! VR\        R7      M
\        V4      x € K‰  	  R# 5i)ÚtextF©Úensure_asciiÚdefaultN)Ú
isinstanceÚdictÚgetr   ÚjsonÚdumps)Ú.0Úitems   & r   Ú	<genexpr>Ú*_stringify_tool_content.<locals>.<genexpr>   sk   é € ð 
ñ  �ô ' t¬T×2Ò2´zÀ$Ç(Á(È6ÓBRÔTW×7XÒ7XˆD�ŽLÜFPÐQUÔW[×F\ÒF\”—’˜D¨u¼cÕBÜ�T“ôó  ùs   ‚BBFr   )r    r   ÚlistÚjoinr!   r#   r$   )r   s   &r   Ú_stringify_tool_contentr+      sw   € ð ‚ÙÜ�'œ3×ÒØˆÜ�'œ4× Ò Ø�y‰yñ 
ñ  ó	
ó 
ð 	
ô �'œ4× Ò Ü�zŠz˜'°¼sÔCÐCÜˆw‹<Ðr   c               ó    € V ^8„  d   QhRRRR/# )r   r   r   r   Úboolr   )r   s   "r   r   r   "   s   € ÷ Oñ O cð O¨dñ Or   c                ój  € \        V 4      p V '       g   R# V P                  4       P                  R4      '       dŒ    \        P                  ! V 4      p\        V\        4      '       d_   VP                  R4      '       gF   \        VP                  R4      ;'       g    R4      P                  4       P                  4       R9   d   R# V P                  4       '       d4   V P                  4       ^ ,          P                  4       P                  4       MRpVP                  R	4      #   \
         d    Rp Lßi ; i)
zåConservative error detector for tool-result previews: structured JSON with
an ``error`` key or an error/failed ``status``, or a first line starting with a
classic error marker. (Substring "error" alone painted normal output red.)FNÚerrorÚstatusr   T)Ú{Ú[>   r/   ÚfailedÚfailureÚtimeout)zerror:zfailed:z
traceback z
exception:)r+   ÚlstripÚ
startswithr#   ÚloadsÚ	Exceptionr    r!   r"   r   ÚstripÚlowerÚ
splitlines)r   ÚparsedÚfirsts   &  r   Ú_looks_like_error_outputr?   "   sî   € ô & gÓ.€GßÙØ‡~�~Ó×"Ñ" :×.Ò.ð	Ü—Z’Z Ó(ˆFô �fœd×#Ò#Ø�J‰J�w×Ò¤3 v§z¡z°(Ó';×'AÐ'A¸rÓ#B×#HÑ#HÓ#J×#PÑ#PÓ#RÐVÔ#áØ7>×7IÑ7I×7KÒ7KˆG×ÑÓ  Õ#×)Ñ)Ó+×1Ñ1Ô3ÐQS€EØ×ÑÐMÓNÐNøô ô 	ØŠFð	ús   ¼D" Ä"D2Ä1D2Úmax_entriesÚ	max_charsi@  c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úresultúdict[str, Any]r@   ÚintrA   r   úlist[dict[str, Any]]r   )r   s   "r   r   r   5   s*   € ÷ ñ  ð Àð ÐVYð Ðeyñ r   c               óÖ  € \        V \        4      '       d   V P                  R4      MRp\        V\        4      '       g   . # V UUu/ uF²  p\        V\        4      '       g   K  VP                  R4      R8X  g   K3  VP                  R4      ;'       g    .  F`  qUP                  R4      '       g   K  VR,          \	        VP                  R4      ;'       g    / P                  R4      ;'       g    R	4      bKb  	  K´  	  ppp. p\        V4       FÀ  p\        V4      V8¼  d    M¯\        V\        4      '       d   VP                  R4      R	8w  d   KC  \        \        VP                  R
4      ;'       g    R4      RR7      pTP                  VP                  R4      ;'       g    RR	4      p	VP                  R	V	RVRV R\        V4      /4       KÂ  	  VP                  4        V# u uppi )a^  Last N tool-call results ``{tool, preview, is_error}`` from a child's conversation (the overlay's "Output"
section), chronological order. Content blocks are flattened first so a block-wrapped "Error: ..." is still
flagged; line structure is preserved (capped at ``max_chars``) so the overlay shows real output rather than a
whitespace-collapsed blob.ÚmessagesNÚroleÚ	assistantÚ
tool_callsÚidÚfunctionÚnameÚtoolr   r   F©ÚforceÚtool_call_idÚpreviewÚis_error)r    r!   r"   r)   r   ÚreversedÚlenr   r+   Úappendr?   Úreverse)
rC   r@   rA   rH   ÚmsgÚtcÚname_by_call_idÚtailr   Ú	tool_names
   &$$       r   Ú_extract_output_tailr^   5   s�  € ô
 *4°F¼D×)AÒ)Aˆv�z‰z˜*Ô%Àt€HÜ�h¤×%Ò%Øˆ	ñ ôáˆCœz¨#¬t×4ô 	Ø9<¿¹À»ÈKÑ9Wô 	à—'‘'˜,Ó'×-Ð-¨2Ò-ˆB·±¸·ô 	Hˆˆ4�”#�r—v‘v˜jÓ)×/Ð/¨R×4Ñ4°VÓ<×FÐFÀÓGÒGá-ñ 	Ùð ñ ð
 "$€DÜ˜Ö!ˆÜˆt‹9˜Ô#ÙÜ˜#œt×$Ò$¨¯©°«¸6Ô(AÙä#Ô$;¸C¿G¹GÀIÓ<N×<TÐ<TÐRTÓ$UÐ]bÔcˆØ#×'Ñ'¨¯©°Ó(?×(EÐ(EÀ2ÀvÓNˆ	Ø�‰�V˜Y¨	°7¸:¸IÐ3FÈ
ÔTlÐmtÓTuÐvÖwñ "ð 	‡L�L„NØ€Kùó!s*   ÁG%Á$G%Á<G%ÂG%Â2$G%ÃG%Ã0G%c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úkeyr   Úvaluer   rQ   r-   r   r   )r   s   "r   r   r   U   s(   € ÷ ñ ˜sð ¨3ð °tð Àsñ r   c                ó€  a a€ \        V\        4      '       d5   VV 3R lVR,           4        Uu. uF
  q3f   K  VNK  	  ppT;'       g    R# \        V\        4      '       d	   V'       g   R# \        VSR7      R,          pS \        9   dœ    \        V4      pVP                  '       d|   VP                  '       dj   VP                  pV'       g   R# RV9   d   RV R2MTpVP                  e   V RVP                   2MTp	\        VP                  W–P                  R	R	34      # V# V# u upi   \         d     R# i ; i)
z<Keep bounded side-effect targets while dropping URL secrets.c              3  ó>   <"  € T F  p\        SVS4      x € K  	  R # 5i©N)Ú_sanitize_tool_target)r%   r&   rQ   r`   s   & €€r   r'   Ú(_sanitize_tool_target.<locals>.<genexpr>X   s!   øé € Ð$dÑYcÐQUÔ%:¸3ÀÀe×%LÐ%LÓYcùs   ƒ:Né   NNrP   :Ni   NÚ:r2   Ú]r   )r    r)   r   r   Ú_TOOL_INPUT_URL_KEYSr   ÚschemeÚnetlocÚhostnameÚportr   ÚpathÚ
ValueError)
r`   ra   rQ   r&   ÚcleanedÚboundedr=   rm   Úhostrl   s
   f&f       r   re   re   U   s  ù€ ä�%œ×ÒÝ$dÐY^Ð_bÖYcÔ$dÓyÑ$d˜D—4�4Ñ$dˆÐyØ�ˆ˜$ÐÜ�eœS×!Ò!¯ÙÜ ¨UÔ3°EÕ:€GØ
Ô"Ô"ð	Ü˜gÓ&ˆFØ�}�}ˆ} §§ Ø!Ÿ?™?�ßÙð +.°¬/˜˜8˜* A‘¸x�Ø4:·K±KÒ4K˜D˜6  6§;¡; -Ñ0ÐQU�Ü! 6§=¡=°&¿+¹+ÀrÈ2Ð"NÓOÐOð €Nˆ7€Nùò) zøô$ ô 	Úð	ús)   ¯D)¹D)Â.D. Â<D. ÃAD. Ä.D=Ä<D=c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚmappingrD   rQ   r-   r   r   )r   s   "r   r   r   n   s!   € ÷ 	ñ 	˜~ð 	°dð 	Ànñ 	r   c                ó´   € / pV P                  4        FA  w  r4\        V4      P                  4       pV\        9   g   K+  \	        WTV4      pVf   K=  WbV&   KC  	  V# )zNKeep only known side-effect target keys, each sanitized (URL secrets dropped).)Úitemsr   r;   Ú_TOOL_INPUT_TARGET_KEYSre   )ru   rQ   ÚtargetsÚraw_keyra   r`   rq   s   &&     r   Ú_sanitize_targetsr{   n   sT   € à €GØ!Ÿ-™-ž/‰ˆÜ�'‹l× Ñ Ó"ˆØÔ)Ö)Ü+¨C¸Ó>ˆGØÔ"Ø&˜“ñ *ð €Nr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úkeysr   ry   rQ   r-   r   rD   r   )r   s   "r   r   r   y   s(   € ÷ ñ ˜ð  sð °4ð À>ñ r   c           	     óð   € R\        V \        4      '       d5   V R,           Uu. uF   p\        \        V4      VR7      R,          NK"  	  upM. R\        V\        4      '       d   \        W4      /# / /# u upi )zÑ``{argument_keys, targets}`` with bounded, sanitized contents (empty on bad shapes). ``force=False`` for the
parent's own tool_trace copy (honours the opt-out); lifecycle hooks re-sanitize with ``force=True``.Úargument_keys:Né@   NrP   :Né€   Nry   )r    r)   r   r   r!   r{   )r}   ry   rQ   r`   s   &&& r   Ú_input_summaryr‚   y   s|   € ð 	ÔblÐmqÔsw×bxÒbxÐTXÐY\ÖT]Ó^ÑT]ÈSÔ+¬C°«H¸EÔBÀ4×HÐHÑT]Ò^ð  AØ¼
À7ÌD×8QÒ8QÔ$ WÓ4ðð àWYðð ùÚ^s   £&A3c               ó    € V ^8„  d   QhRRRR/# )r   Ú	argumentsr   r   rD   r   )r   s   "r   r   r   �   s   € ÷ Sñ S¨ð S°ñ Sr   c                ó  €  \        V \        4      '       d   \        P                  ! V 4      MRp\        V\        4      '       g   \        . / 4      # \        \        R V 4       4      VRR7      #   \        \
        3 d    Rp LUi ; i)zFSummarize argument names and side-effect targets without raw payloads.Nc              3  ó8   "  € T F  p\        V4      x € K  	  R # 5ird   )r   )r%   r`   s   & r   r'   Ú,_summarize_tool_arguments.<locals>.<genexpr>‰   s   é € Ð <±V¨c¤ S§ ³Vùs   ‚FrP   )	r    r   r#   r8   Ú	TypeErrorrp   r!   r‚   Úsorted)r„   r=   s   & r   Ú_summarize_tool_argumentsrŠ   �   st   € ðÜ*4°YÄ×*DÒ*D”—’˜IÔ&È$ˆô �fœd×#Ò#Ü˜b "Ó%Ð%Üœ&Ñ <±VÓ <Ó<¸fÈEÔRÐRøô	 ”zÐ"ô ØŠðús   ‚.A0 Á0BÂBc               ó    € V ^8„  d   QhRRRR/# )r   Ú
tool_tracer   r   rF   r   )r   s   "r   r   r   ‹   s   € ÷ ñ °ð Ð9Mñ r   c                óH  € \        V \        4      '       g   . # R R lp. pV  Fû  p\        V\        4      '       g   K  \        VP	                  R4      ;'       g    R4      P                  4       pVP	                  R4      p\        V\        4      '       d   TM/ pTP                  R\        VP	                  R4      ;'       g    R4      R,          R	\        VP	                  R
4      VP	                  R4      4      RV! VR4      RV! VR4      RVR9   d   TMR/4       Ký  	  V# )zXDetached, metadata-only tool history for lifecycle hooks (input summaries re-sanitized).c               ó    € V ^8„  d   QhRRRR/# )r   r`   r   r   rE   r   )r   s   "r   r   Ú6_subagent_stop_tool_call_history.<locals>.__annotate__�   s   € ÷ lñ l˜sð l sñ lr   c                ó¸   € V P                  V^ 4      p\        V\        \        34      '       d,   \        V\        4      '       g   \        ^ \        V4      4      # ^ # )é    )r"   r    rE   Úfloatr-   Úmax)r&   r`   ra   s   && r   Ú_byte_countÚ5_subagent_stop_tool_call_history.<locals>._byte_count�   sG   € Ø—‘˜˜aÓ ˆÜ%/°¼¼U°|×%DÒ%DÌZÐX]Ô_c×MdÒMdŒs�1”c˜%“jÓ!ÐkÐjkÐkr   r0   ÚunknownÚinput_summaryr]   rO   :Né   NÚ
tool_inputr   ry   Úinput_bytesÚ
args_bytesÚoutput_bytesÚresult_bytes>   Úokr/   )r    r)   r!   r   r"   r;   rW   r‚   )rŒ   r”   Úhistoryr&   r0   Úsummarys   &     r   Ú _subagent_stop_tool_call_historyr¡   ‹   sþ   € ä�j¤$×'Ò'Øˆ	õlð %'€GÛˆÜ˜$¤×%Ò%ÙÜ�T—X‘X˜hÓ'×4Ð4¨9Ó5×;Ñ;Ó=ˆØ—(‘(˜?Ó+ˆÜ'¨´×6Ò6‘'¸BˆØ�‰Øœ˜TŸX™X fÓ-×:Ð:°Ó;¸DÕAØœ.¨¯©°_Ó)EÀwÇ{Á{ÐS\ÓG]Ó^Ø™; t¨\Ó:¸NÉKÐX\Ð^lÓLmØ ¨/Ô 9‘f¸yð	
ö 	ñ ð €Nr   iÀ]  ç      à?iÐ  c               ó$   € V ^8„  d   QhRRRRRR/# )r   Ú
task_indexrE   r    r   r   úOptional[str]r   )r   s   "r   r   r   ­   s!   € ÷ ñ  sð °Sð ¸]ñ r   c                ój  €  ^ RI Hp ^ RIpV! RR4      pVP                  RRR7       VRV  RVP                  P	                  4       P                  R	4       R
2,          p^ RIHp V! V\        VRV4      RR7       \        V4      #   \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i)u  Write the full summary under ``cache/delegation`` (mounted read-only into remote backends via
``credential_files._CACHE_DIRS``, so the parent's terminal/``read_file`` can page it on any backend). Absolute
path, or None on failure â€” the trimmed head+tail is still returned regardless.)Úget_hermes_dirNzcache/delegationÚdelegation_cacheT)ÚparentsÚexist_okzsubagent-summary-Ú-z%Y%m%d_%H%M%S_%fz.txt)Úwrite_text_exclusiveÚforcedF)Úprivatez,Failed to spill subagent summary to file: %s)Úhermes_constantsr§   ÚdatetimeÚmkdirÚnowÚstrftimeÚtools.spill_safetyr¬   Úgetattrr   r9   ÚloggerÚdebug)r¤   r    r§   Ú_dtÚ	cache_dirro   r¬   Úexcs   &&      r   Ú_spill_summary_to_filer»   ­   s§   € ðÝ3ÛÙ"Ð#5Ð7IÓJˆ	Ø�‰ ¨tˆÔ4ØÐ.¨z¨l¸!¸C¿L¹L×<LÑ<LÓ<N×<WÑ<WÐXjÓ<kÐ;lÐlpÐqÕqˆÝ;ñ
 	˜T¤7¨7°H¸gÓ#FÐPUÕVÜ�4‹yÐøÜô Ü�‰ÐCÀSÔIÝûðús   ‚BB ÂB2ÂB-Â-B2c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r    r   ÚcaprE   r¤   r   ztuple[str, Optional[str]]r   )r   s   "r   r   r   Â   s/   € ÷ `ñ ` sð `°ð `À#ð `ÐJcñ `r   c                óò   € \        V R4      '       d   \        V 4      M\        V RR4      p\        W#4      pV'       d   ^ RIHp V! V4      p\        \        V 4      W4      p\        V\        W1V4      4      V3# )a+  ``(model_text, spill_path)`` for one over-budget summary: a ~75% head / ~25% tail window snapped to line
boundaries (so the opening AND the closing outcomes/files-changed/issues both survive), the full text spilled
to disk, and a footer giving the exact ``read_file offset=`` for the omitted middle.r­   T)Úto_agent_visible_cache_path)	Úhasattrr   r   r»   Útools.credential_filesr¿   Ú_head_tail_with_footerr   r	   )r    r½   r¤   r­   Ú
spill_pathr¿   Ú
model_texts   &&&    r   Ú_trim_summary_with_footerrÅ   Â   sn   € ô ,3°7¸H×+EÒ+EÔ˜wÔ'Ì>ÐZaÐcgÐimÓKn€FÜ'¨
Ó;€JßåFÙ0°Ó<ˆ
Ü'¬¨G«°cÓF€JÜ�zÔ#9¸&ÀzÓ#RÓSÐU_Ð_Ð_r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r    r   r½   rE   rÃ   r¥   r   r   )r   s   "r   r   r   Ó   s/   € ÷ eñ e Cð e¨cð e¸}ð eÐQTñ er   c           
     óŽ  € \        V 4      p\        VR ,          4      pW,
          pV RV W) R rvVP                  R4      pW„R,          8”  d   VRV pVP                  R4      p^ Tu;8:  d   VR,          8  d   M MWx^,           R pRRR\        V4      R R\        V4      R RVR R	2.p	V'       dM   V	P	                  R
V 24       V	P	                  RV RVP                  \        ^
4      4      ^,            R24       MV	P	                  R4       V	P	                  R4       VR,           V,           RP                  V	4      ,           # )g      è?Nr   r¢   r   zShowing Ú,z chars (head) + z chars (tail) of u:    total â€” trimmed to protect the parent's context window.zFull subagent output saved to: z,To read the omitted middle: read_file path="z	" offset=zV limit=200  (the file is the complete summary; raise/lower offset to page through it).zWFull output could not be stored to disk; the head+tail above is all that was preserved.u+   

[... middle omitted â€” see footer ...]

uE   â”€â”€â”€â”€â”€â”€â”€â”€ [SUMMARY TRUNCATED] â”€â”€â”€â”€â”€â”€â”€â”€uo   â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€)rV   rE   ÚrfindÚfindrW   ÚcountÚchrr*   )
r    r½   rÃ   Úoriginal_lenÚhead_budgetÚtail_budgetÚheadr\   ÚnlÚfooter_liness
   &&&       r   rÂ   rÂ   Ó   sZ  € Ü�w“<€LÜ�c˜D•j“/€KØÕ#€KØ˜˜+Ð&¨°°Ð(>ˆ$Ø	�‰�DÓ	€BØ	˜#ÕÔØ�C�RˆyˆØ	�‰�4‹€BØˆBÖ"�˜sÕ"×"Ø˜•F�Gˆ}ˆà
Ð;Ø
”3�t“9˜Q�-Ð/´°D³	¸!¨}ð =Ø˜1ÐÐWð	Yð€L÷
 à×ÑÐ=¸j¸\ÐJÔKØ×ÑØ:¸:¸,ð GØ—j‘j¤ R£Ó)¨AÕ-Ð.ð /?ð@õ	
ð 	×ÑÐuÔvØ×Ñ˜
Ô#ØÐCÕCÀdÕJÈTÏYÉYÐWcÓMdÕdÐdr   c               ó   € V ^8„  d   QhRR/# )r   r   úOptional[int]r   )r   s   "r   r   r   ð   s   € ÷ ñ °ñ r   c                óX  € \        V RR4      p\        V\        \        34      '       d   V^ 8”  d   \        V4      # \        V RR4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRp\        V\        \        34      '       d   V^ 8”  d   \        V4      # R# )a&  The parent's current prompt size: the aggregator's own last ``prompt_tokens`` (pre-MoA-fold), else
the last provider usage. ``None`` when no request has completed yet: the caller then applies the
static ceiling only. Treating "no usage yet" as zero handed a 190K/200K parent a 384K-char budget.Ú_last_prompt_size_tokensNÚ_last_turn_usageÚprompt_tokens)rµ   r    rE   r’   r!   r"   )Úparent_agentÚsizeÚ
last_usageÚuseds   &   r   Ú_parent_prompt_size_tokensrÝ   ð   sŒ   € ô �<Ð!;¸TÓB€DÜ�$œœe˜×%Ò%¨$°¬(Ü�4‹yÐÜ˜Ð'9¸4Ó@×FÐFÀB€JÜ.8¸ÄT×.JÒ.Jˆ:�>‰>˜/Ô*ÐPT€DÜ�$œœe˜×%Ò%¨$°¬(Ü�4‹yÐÙr   c               ó    € V ^8„  d   QhRRRR/# )r   Ún_summariesrE   r   rÔ   r   )r   s   "r   r   r   þ   s   € ÷ ñ ¸3ð À=ñ r   c                óî  €  \        V RR4      p\        VRR4      p\        V\        4      '       d   V^ 8:  d   R# \        V 4      pVf   R# V\        V4      ,
          \        \        VR^ 4      ;'       g    ^ 4      ,
          pV^ 8:  d   \        # \        V\
        ,          4      \        ^V4      ,          p\        \        V^,          4      #   \         d    \        P                  RRR7        R# i ; i)uÐ  Per-summary char budget from the parent's *remaining* context headroom (context length âˆ’ the parent's
current prompt size âˆ’ the compressor's output reserve), a fraction of it split across the batch at ~4
chars/token. None when the parent's context state is unknown â€” caller then uses the static ceiling only.

"Current prompt size" is the last API call's ``prompt_tokens`` (``_last_turn_usage``), never
``session_prompt_tokens``: that field is the running SUM over every call in the session, so after a
few hundred calls it exceeds any context window and every summary collapsed to the 2,000-char floor
(measured: all 1,393 child summaries in one run, each spilled to disk, the orchestrator working from
the stub).Úcontext_compressorNÚcontext_lengthÚ
max_tokensz!Summary budget computation failedT©Úexc_info)
rµ   r    rE   rÝ   Ú_MIN_SUMMARY_CHARSÚ_SUMMARY_HEADROOM_FRACTIONr“   r9   r¶   r·   )rÙ   rß   Ú
compressorrâ   Úused_tokensÚheadroom_tokensÚper_summary_tokenss   &&     r   Ú_parent_summary_char_budgetrì   þ   sá   € ðÜ˜\Ð+?ÀÓFˆ
Ü  Ð-=¸tÓDˆÜ˜.¬#×.Ò.°.ÀAÔ2EÙÜ0°Ó>ˆØÒÙØ(¬3¨{Ó+;Õ;¼cÄ'È*ÐVbÐdeÓBf×BkÐBkÐjkÓ>lÕlˆØ˜aÔÜ%Ð%Ü  Ô3MÕ!MÓNÔRUÐVWÐYdÓReÕeÐÜÔ%Ð'9¸AÕ'=Ó>Ð>øÜô Ü�‰Ð8À4ˆÔHÚðús#   ‚7C »C ÁAC Â=C Ã"C4Ã3C4c               ó    € V ^8„  d   QhRRRR/# )r   ÚresultsrF   r   ÚNoner   )r   s   "r   r   r     s   € ÷ 
ñ 
Ð#7ð 
È$ñ 
r   c           	     óB  € ^ RI Hp V  Uu. uFU  p\        V\        4      '       g   K  \        VP	                  R4      \
        4      '       g   KB  VR,          '       g   KS  VNKW  	  ppV'       g   R#  \        V! 4       P	                  R\        4      4      pV\        V\        V4      4      3 Uu. uF  qf'       g   K  V^ 8”  g   K  VNK  	  ppV'       g   R# \        V4      pV F�  p	V	R,          p
\        V
4      V8:  d   K  \        W¨V	P	                  RR4      4      w  r¼W¹R&   RV	R&   V'       d   WÉR&   \        P                  R	V	P	                  RR
4      \        V
4      TT;'       g    R4       K�  	  R# u upi   \        \        3 d    \        p ELi ; iu upi )a(  Trim subagent summaries in-place so a batch can't overflow the parent's context window (full text spilled to
disk). Per-summary cap = MIN(dynamic headroom budget, static ``delegation.max_summary_chars`` ceiling; 0 =
disabled); over-cap summaries become head+tail plus a pointer to the spill file.)Ú_load_configr    NÚmax_summary_charsr¤   TÚsummary_truncatedÚsummary_full_pathu9   [subagent-%s] summary trimmed %d â†’ ~%d chars (spill=%s)Ú?Únoneéÿÿÿÿ)Útools.delegate_toolrñ   r    r!   r"   r   rE   ÚDEFAULT_MAX_SUMMARY_CHARSrˆ   rp   rì   rV   ÚminrÅ   r¶   r·   )rî   rÙ   rñ   ÚrÚ	summariesÚstatic_ceilingÚcÚ
candidatesr½   Úentryr    rÄ   rÃ   s   &&           r   Ú_apply_summary_budgetr    sq  € õ 1Ù#Ór™G�q¤z°!´T×':”¼zÈ!Ï%É%ÐPYÓJZÔ\_×?`”ÐefÐgp×eqÑeq—�™G€IÐrßÙð3Ü™\›^×/Ñ/Ð0CÔE^Ó_Ó`ˆð -Ô.IÈ,ÔX[Ð\eÓXfÓ.gÑhÓxÑh˜Ólm”!ÐrsÐvwÑrw—!�!Ñh€JÐxßÙÜ
ˆj‹/€CÛˆØ˜	Õ"ˆÜˆw‹<˜3ÔÙÜ!:¸7ÈÏÉÐS_ÐacÓIdÓ!eÑˆ
Ø%ˆiÑØ%)ˆÐ!Ñ"ßØ)3Ð%Ñ&Ü�‰ØGÈÏÉÐS_ÐadÓIeÔgjÐkrÓgsÐuxØ× Ð ˜&ö	
ó ùò søô
 ”zÐ"ô 3Ü2‹ð3üâxs:   ‹E9¨"E9ÁE9Á E9Á3$E> Â0	FÂ>FÃFÅ>FÆFc                 óÜ   € ^ RI Hp ^ RIp\        ;_uu_ 4        \	        VP
                  4      p V! R/ V B pW2n         RRR4       XXn        V#   Y2n        i ; i  + '       g   i     L$; i)zCBuild a child without leaking its resolved toolset into the parent.)Ú_build_child_agentNr   )rø   r  Úmodel_toolsÚ_CHILD_CONSTRUCTION_LOCKr)   Ú_last_resolved_tool_namesÚ_delegate_saved_tool_names)Úkwargsr  r  Úparent_tool_namesÚchilds   ,    r   Ú$_build_child_preserving_parent_toolsr  ;  s`   € å6Ûß	!Ö	!Ü  ×!FÑ!FÓGÐð	FÙ&Ñ0¨Ñ0ˆEà4EÕ1÷ 
"ð (9€EÔ$Ø€Løð 5FÕ1ú÷ 
"×	!ús!   ™A°A¸AÁAÁAÁA+	c               ó   € V ^8„  d   QhRR/# )r   r   zthreading.RLockr   )r   s   "r   r   r   H  s   € ÷ ñ ¨ñ r   c                ó2  € V f   \         # \        V RR4      pVe   V# \        ;_uu_ 4        \        V RR4      pVf   \        P                  ! 4       p Wn        RRR4       V#   \         d    \         u uuRRR4       # i ; i  + '       g   i     T# ; i)zRPer-parent lock serializing lifecycle side effects (created once under the guard).NÚ_subagent_finalization_lock)Ú"_PARENT_FINALIZATION_FALLBACK_LOCKrµ   Ú_PARENT_FINALIZATION_LOCK_GUARDÚ	threadingÚRLockr  r9   )rÙ   Úlocks   & r   Ú_parent_finalization_lockr  H  s”   € àÒÜ1Ð1Ü�<Ð!>ÀÓE€DØÒØˆß	(Ö	(Ü�|Ð%BÀDÓIˆØŠ<Ü—?’?Ó$ˆDð:Ø;?Ô8÷ 
)ð €Køô ô :Ü9Ñ9÷ 
)Ò	(ð:ú÷ 
)Ö	(ð €Kús)   ¬'BÁA$Á$BÁ5BÂBÂBÂB	c               ó   € V ^8„  d   QhRR/# )r   r   rï   r   )r   s   "r   r   r   Y  s   € ÷ ñ ÐPTñ r   c           
     óæ  € V'       d   \        VR R4      MRpV'       g   R# V  F·  p VP                  RR
4      p\        V\        4      ;'       d     ^ Tu;8*  ;'       d    \	        V4      8  Mu pTP                  V'       d   W,          R,          MR\        VP                  RR4      ;'       g    RRR7      \        VP                  V4      RR4      R	7       K¹  	  R#   \         d     KË  i ; i)Ú_memory_managerNr¤   Úgoalr   r    TrP   Ú
session_id)ÚtaskrC   Úchild_session_idr÷   )rµ   r"   r    rE   rV   Úon_delegationr   r9   )rî   Ú	task_listÚchild_by_indexrÙ   Úmemoryr   r¤   Úin_ranges   &&&&    r   Ú_notify_memory_managerr!  Y  sË   € ß?KŒW�\Ð#4°dÔ;ÐQU€FßÙÛˆð		ØŸ™ <°Ó4ˆJÜ! *¬cÓ2×WÐW°q¸J×7WÔ7WÌÈYËÔ7WˆHØ× Ñ ß6>�YÕ*¨6Ö2ÀBÜ(¨¯©°9¸bÓ)A×)GÐ)GÀRÈtÔTÜ!(¨×);Ñ);¸JÓ)GÈÐWYÓ!Zð !ö ó	 øô ô 	Úð	ús#   ¨7C!Á #C!Â-C!Â2)C!Ã!C0Ã/C0c               ó   € V ^8„  d   QhRR/# )r   r   r’   r   )r   s   "r   r   r   i  s   € ÷ ñ Èñ r   c                óî  €  ^ RI Hp RpV  EF  pVP                  RR4      pVP                  RR4      p V'       d   V\	        V4      ,          pTf   KI   TP                  TP                  RR4      4      pT! R\        TRR4      \        TR	R
4      ;'       g    R
\        TRR4      T\        TP                  R4      4      TP                  R4      \        TP                  R4      4      \        TP                  R4      ;'       g    ^ R,          4      R7	       EK  	  V#   \         d    Rp EL*i ; i  \
        \        3 d     Lúi ; i  \         d    \        P                  RRR7        EKg  i ; i)z—Pop the model-hidden ``_child_role`` / ``_child_cost_usd`` fields from every
entry, fire ``subagent_stop`` per child, and return the summed child cost.)Úinvoke_hookNç        Ú_child_roleÚ_child_cost_usdr¤   Úsubagent_stopr  Ú_current_turn_idr   r    r0   rŒ   Úduration_secondsiè  )Úparent_session_idÚparent_turn_idr  Ú
child_roleÚchild_summaryÚchild_statusÚtool_call_historyÚduration_msz$subagent_stop hook invocation failedTrä   r÷   )Úhermes_cli.pluginsr$  r9   Úpopr’   rˆ   rp   r"   rµ   r   r¡   rE   r¶   r·   )	rî   r  rÙ   r$  Úchildren_cost_totalr   r-  Ú
child_costr
  s	   &&&      r   Ú_fire_subagent_stop_hooksr6  i  sk  € ðÝ2ð ÐÜˆØ—Y‘Y˜}¨dÓ3ˆ
Ø—Y‘YÐ0°#Ó6ˆ
ð	ßØ#¤u¨ZÓ'8Õ8Ð#ð ÒÙð	PØ"×&Ñ& u§y¡y°¸rÓ'BÓCˆEÙØ´7¸<ÈÐW[Ó3\Ü& |Ð5GÈÓL×RÐRÐPRÜ!(¨°¸dÓ!CÐPZÜ0°·±¸9Ó1EÓFØ"ŸY™Y xÓ0Ü"BÀ5Ç9Á9È\ÓCZÓ"[Ü §¡Ð+=Ó!>×!CÐ!CÀ!ÀtÕ KÓL÷ð ñ ð. Ðøô5 ô Ø‹ðûô œ:Ð&ô 	Ùð	ûô ô 	PÜ�L‰LÐ?È$ˆL×OÐOð	Pús5   ‚D" µD6ÁCEÄ"D3Ä2D3Ä6E
Å	E
Å"E4Å3E4c               ó    € V ^8„  d   QhRRRR/# )r   r4  r’   r   rï   r   )r   s   "r   r   r   Š  s   € ÷ Cñ C¸Uð CÀtñ Cr   c                ó.  € VR8:  d   R#  \        \        V RR4      ;'       g    R4      pW!,           V n        \        V RR4      R9   d   RV n        \        V RR4      R9   d
   R	V n        R# R#   \
         d    \        P                  R
RR7        R# i ; i)zvFold the children's spend into the parent's session cost (source/status
only set when the parent had none of its own).r%  NÚsession_estimated_cost_usdÚsession_cost_sourcerö   ÚsubagentÚsession_cost_statusr–   Ú	estimatedzSubagent cost rollup failedTrä   >   Nr   rö   >   Nr   r–   )r’   rµ   r9  r:  r<  r9   r¶   r·   )rÙ   r4  Úcurrents   && r   Ú_rollup_children_costr?  Š  s›   € ð ˜cÔ!ÙðCÜœ Ð.JÈCÓP×WÐWÐTWÓXˆØ29Õ2OˆÔ/Ü�<Ð!6¸Ó?ÐCUÔUØ/9ˆLÔ,Ü�<Ð!6¸	ÓBÐF[Ô[Ø/:ˆLÖ,ñ \øäô CÜ�‰Ð2¸Tˆ×BðCús   ‹A. ¤AA. Á."BÂBc               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rî   rF   r  Úchildrenz%list[tuple[int, dict[str, Any], Any]]r   rï   r   )r   s   "r   r   r   ™  s4   € ÷ nñ nØ!ðnØ.BðnØNsðnð 
ñnr   c                óº  € \        V4      ;_uu_ 4        V UUUu/ uF  w  rEqdVbK
  	  ppppV  FØ  p\        VP                  VP                  R4      4      RR4      p	VP                  R4      p
\        T
\	        V	\
        4      ;'       g    RV9   R4      pVP                  \        W‰RR7      4       \	        V
\        4      '       g   K›  \	        VP                  R4      \        4      '       g   KÂ  \        VR,          V4      VR&   KÚ  	  \        W4       \        WWs4       \        V\        WV4      4       RRR4       R# u upppi   + '       g   i     R# ; i)	z@Apply host-owned summary, memory, hook, and cost contracts once.r¤   Ú_delegate_output_schemaNr    Úschema_validTFrP   )r  rµ   r"   r   r    r!   Úupdater
   r   r	   r  r!  r?  r6  )rî   r  rA  rÙ   ÚindexÚ_taskr
  r  r   Úschemar    r­   s   &&&&        r   Ú_finalize_child_resultsrI  ™  s  € ô
 
# <×	0Õ	0ÙBJÕKÁ(Ñ+>¨5¸ š,Á(ˆÒKÛˆEÜ˜^×/Ñ/°·	±	¸,Ó0GÓHÐJcÐeiÓjˆFð —i‘i 	Ó*ˆGÜ# G¬Z¸ÄÓ-E×-`Ð-`ÈÐ[`ÑI`ÐbfÓgˆFØ�L‰LÔ,¨UÀ%ÔHÔIÜ˜'¤3×'Ô'¬J°u·y±yÀÓ7KÌS×,QÔ,QÜ#.¨u°YÕ/?ÀÓ#H��iÓ ñ ô 	˜gÔ4Ü˜w°>ÔPÜ˜lÔ,EÀgÐ_kÓ,lÔm÷ 
1Ñ	0ùÜK÷ 
1×	0Ð	0ús)   ”E	›E©BE	Ã
"E	Ã1AE	ÅE	Å	E	c               ó$   € V ^8„  d   QhRRRRRR/# )r   r¤   rE   r  r   r   rD   r   )r   s   "r   r   r   ®  s"   € ÷ ñ  Sð °ð ÐWeñ r   c                óÄ   € ^ RI Hp V! WW#4      pVP                  RV 4       RV/p\        V.\	        V 4       Uu. uF  pRR/NK	  	  upV.,           WV3.V4       V# u upi )zFRun one child and apply the same host lifecycle used by delegate_task.)Ú_run_single_childr¤   r  r   )rø   rL  Ú
setdefaultrI  Úrange)r¤   r  r
  rÙ   rL  rC   r  Ú_s   &&&&    r   Ú_run_child_lifecyclerP  ®  sz   € å5Ù˜z°ÓE€FØ
×Ñ�l JÔ/Ø�Dˆ>€DÜ˜V˜H¼UÀ:Ô=NÓ&OÑ=N¸¨°£|Ñ=NÑ&OÐSWÐRXÕ&XÐ\fÐnsÐ[tÐZuð  xDô  EØ€Mùò 'Ps   ºA
>   ÚcwdÚdstÚsrcÚurlro   ÚurlsÚendpointÚnew_pathÚold_pathÚ	directoryÚ	file_pathÚsource_pathÚtarget_pathÚdestination_path>   rT  rU  rV  )T)NN)6Ú__doc__Ú
__future__r   Úloggingr#   r  Útypingr   r   r   r   Úurllib.parser   r   Útools.delegation_redactionr	   r
   r   r   r   Ú	getLoggerr¶   r+   r?   r^   Ú	frozensetrx   rj   re   r{   r‚   rŠ   r¡   rù   rç   ræ   r»   rÅ   rÂ   rÝ   rì   r  ÚLockr  r  r  r  r  r  r!  r6  r?  rI  rP  r   r   r   Ú<module>rg     s  ðÙ så "ã Û Û ß ,Ó ,ß -÷õ ð 
×	Ò	Ð0Ó	1€õõ$Oð&Àrð Ð\`÷ ñ4 $ò %ó Ð ñ !Ò!<Ó=Ð ÷÷2	÷õSõð4 "Ð ð !Ð ð Ð õõ*`õ"eõ:õõ6
ð< #,§.¢.Ó"2Ð Ø%.§_¢_Ó%6Ð "Ø$Ÿ?š?Ó,Ð òõõ"õ õBCõn÷*ñ r   