Ë
    ãß²j#Y  ã                   ó°  — d Z ddlZddlmZ ddlmZ dZdddœZ ed	d	¬
«       G d„ d«      «       Zd„ Z	de
defd„Zd2d„Zdefd„Zdefd„Zd3d„ZdZdedefd„Zd2d„Zdededede
deddfd„Zded edefd!„Zdeddfd"„Zded ede
defd#„Zd$edefd%„Zdedefd&„Zdedefd'„Zd(Zdefd)„Zd*edefd+„Z  G d,„ d-e«      Z!dedd.fd/„Z"dedefd0„Z#dedd.fd1„Z$y)4a  Human-readable rendering of ``ProcessRegistry.completion_queue`` events (completion,
watch_match, watch_disabled, watch_overflow_*, async_delegation) into the
``[IMPORTANT: ...]`` / ``[ASYNC DELEGATION ...]`` text the CLI drain loop, gateway and
TUI inject into the agent conversation.é    N)Ú	dataclass)Úsuppress)Ú	completedÚsuccessz3marked lost because the process backend disappearedzfailed to start)ÚlostÚfailed_startT)ÚfrozenÚslotsc                   óZ   — e Zd ZU dZeeeef   df   ed<   defd„Z	dedz  fd„Z
defd„Zy)	ÚProcessNotificationBatchzBKeep completion identity until the owning surface starts its turn..ÚnotificationsÚreturnc           
      ó’   — | j                   D ��cg c]*  \  }}|j                  |j                  dd«      «      s||f‘Œ, c}}S c c}}w )NÚ
session_idÚ )r   Úis_completion_consumedÚget)ÚselfÚregistryÚeventÚtexts       úI/home/ubuntu/.hermes/hermes-agent/tools/process_registry_notifications.pyÚ_livezProcessNotificationBatch._live   sL   € Ø15×1CÑ1C÷ U¡+ %¨Ø×6Ñ6°u·y±yÀÈrÓ7RÔSð ˜’ó Uð 	Uùó Us   �/ANc                 óÈ   — | j                  |«      D ��cg c]  \  }}|‘Œ	 }}}|sy t        |«      dk(  r|d   S dt        |«      › d�}dj                  |g|¢­«      S c c}}w )Né   r   ú[IMPORTANT: z� background processes completed. Treat these results as one batch and give one consolidated response; preserve failures and actionable results.]z

)r   ÚlenÚjoin)r   r   Ú_eventr   ÚmessagesÚheaders         r   ÚrenderzProcessNotificationBatch.render   st   € Ø-1¯Z©Z¸Ó-A×B™\˜V T’DÐBˆÑBÙØÜˆx‹=˜AÒØ˜A‘;ÐØ ¤ X£ ð 0?ð ?ˆð �{‰{˜FÐ. XÑ.Ó/Ð/ùó Cs   •Ac                 óh   — t        | j                  |«      D ��cg c]  \  }}|‘Œ	 c}}«      S c c}}w ©N)Úprocess_completion_display_textr   )r   r   r   Ú_texts       r   Údisplay_textz%ProcessNotificationBatch.display_text#   s)   € Ü.È$Ï*É*ÐU]ÓJ^×/_¹,¸%À²Ó/_Ó`Ð`ùÓ/_s   š.
)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚtupleÚdictÚstrÚ__annotations__Úlistr   r"   r'   © ó    r   r   r      sJ   … áLà˜˜t S˜yÑ)¨3Ð.Ñ/Ó/ðU ó Uð	0 #¨¡*ó 	0ða¨ô ar2   r   c              #   óÆ   K  — g }| D ]F  \  }}|j                  dd«      dk(  r|j                  ||f«       Œ/|rt        |«      –— g }||ff–— ŒH |rt        |«      –— yy­w)zIGroup consecutive completions only; watches and delegations are barriers.ÚtypeÚ
completionN)r   Úappendr,   )r   Úbatchr   r   s       r   Úgroup_process_notificationsr8   '   st   è ø€ à€EØ$ò #‰ˆˆtØ�9‰9�V˜\Ó*¨lÒ:Ø�L‰L˜% ˜Õ'áÜ˜E“lÒ"Ø�Ø˜4�=Ð"Ó"ð#ñ Ü�E‹lÓð ùs   ‚AA!Úsecondsr   c                 óö   — 	 t        t        d| «      «      }|dk  r|› d�S t	        |d«      \  }}|dk  r|› d�|r|› d�z   S dz   S t	        |d«      \  }}|› d�|r|› d�z   S dz   S # t        t        f$ r Y yw xY w)z5Human-friendly elapsed string ('18m', '2h3m', '45s').r   ú?é<   ÚsÚmr   Úh)ÚintÚmaxÚ	TypeErrorÚ
ValueErrorÚdivmod)r9   r=   r>   r?   s       r   Ú_format_agerE   7   s«   € ðÜ”�A�w“Ó ˆð 	ˆ2‚vØ��AˆwˆÜ�!�R‹=�D€A€qØˆ2‚vØ��Aˆw¡Q˜Q˜C˜q˜'Ñ/Ð/¨BÑ/Ð/Ü�!�R‹=�D€A€qØˆS�ˆ7¡˜˜˜1�gÑ+Ð+¨Ñ+Ð+øô ”zÐ"ò Ùðús   ‚A& Á&A8Á7A8ú	list[str]c                  óL   — 	 ddl m}  t        | «      S # t        $ r g d¢cY S w xY w)uÁ  Model-not-found phrases from ``agent.error_classifier`` (the failover path's
    own list, so nothing drifts); a minimal built-in set if the import fails.

    Imported from ``agent.error_classifier`` so the batch renderer applies the SAME classification the
    failover path consumes â€” no hand-copied pattern list to drift. Fails open to a minimal built-in set so a
    classifier import problem never hides the per-task blocks. See #97667.
    r   ©Ú_MODEL_NOT_FOUND_PATTERNS)zis not a valid modelzmodel not foundÚmodel_not_found)Úagent.error_classifierrI   r0   Ú	ExceptionrH   s    r   Ú_model_not_found_patternsrM   F   s.   € ðNÝDÜÐ-Ó.Ð.øÜò NÚMÒMðNús   ‚ “#¢#c                  óH   — 	 ddl m}   | «       xs i S # t        $ r i cY S w xY w)zLActive delegation config; ``{}`` on any error. Lazy: delegate_tool is heavy.r   )Ú_load_config)Útools.delegate_toolrO   rL   )Ú_cfgs    r   Ú_delegation_configrR   U   s*   € ðÝ<Ù‹vŠ|˜ÐøÜò ØŠ	ðús   ‚ “! !c                 óÄ   ‡‡— t        |xs i j                  d«      xs d«      j                  «       Š‰syt        «       Šd„ | xs g D «       }t	        ˆˆfd„|D «       «      S )zöTrue when a result reflects a config-level model_not_found rejection: needs a
    model-not-found phrase AND the currently-configured model name in the same text,
    so a stale task failing on a removed model is not mis-attributed to the config.Úmodelr   Fc              3   ó¨   K  — | ]J  }d j                  d„ |j                  d«      |j                  d«      fD «       «      j                  «       –— ŒL y­w)Ú c              3   ó8   K  — | ]  }|sŒt        |«      –— Œ y ­wr$   )r.   )Ú.0Úxs     r   ú	<genexpr>z8_delegation_model_not_found.<locals>.<genexpr>.<genexpr>f   s   è ø€ ÒN ÊA”c˜!—fÑNùs   ‚ŠÚerrorÚsummaryN)r   r   Úlower)rX   Úrs     r   rZ   z._delegation_model_not_found.<locals>.<genexpr>f   s?   è ø€ ÒnÐ[\ˆS�X‰XÑN q§u¡u¨W£~°q·u±u¸YÓ7GÐ&HÔNÓN×TÑT×VÑnùs   ‚AAc              3   óT   •‡K  — | ]  Š‰‰v xr t        ˆfd „‰D «       «      –— Œ  y­w)c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr$   r1   )rX   Úpr   s     €r   rZ   z8_delegation_model_not_found.<locals>.<genexpr>.<genexpr>g   s   øè ø€ Ò$A°1 Q¨$¤YÑ$Aùs   ƒN)Úany)rX   r   rT   Úpatternss    @€€r   rZ   z._delegation_model_not_found.<locals>.<genexpr>g   s(   ùè ø€ ÒTÀdˆu˜ˆ}ÒA¤Ó$A¸Ô$AÓ!AÓAÑTùs   „$()r.   r   r]   rM   rb   )ÚresultsÚconfigÚtextsrT   rc   s      @@r   Ú_delegation_model_not_foundrg   ^   s\   ù€ ô �’˜2×"Ñ" 7Ó+Ò1¨rÓ2×8Ñ8Ó:€EÙØÜ(Ó*€HÙnÐ`gÒ`mÐkmÔn€EÜÔTÈeÔTÓTÐTr2   c                 ó(  — t        «       }t        | |«      sy|j                  d«      xs d}|j                  d«      xs d}d|› d|› d�d	d
g}t        t        «      5  ddlm}  ||«      s|j                  d«       ddd«       |S # 1 sw Y   |S xY w)uR   Config-level model_not_found notice lines, or None (fail-open) â€” once per batch.NrT   r;   Úproviderzconfigured provideru<   âš  SUBAGENT MODEL REJECTED: the configured Subagent Model "z" was rejected by provider "z#" (HTTP 400: not a valid model ID).zFEvery task in this batch failed for this reason before doing any work.uX   Check Settings â†’ Advanced â†’ Subagent Model (or: hermes config get delegation.model).r   )Úget_fallback_chainz>No fallback chain is configured, so no failover was attempted.)rR   rg   r   r   rL   Úhermes_cli.fallback_configrj   r6   )rd   re   rT   ri   Úlinesrj   s         r   Ú"_delegation_model_not_found_noticerm   j   s­   € äÓ!€FÜ& w°Ô7ØØ�J‰J�wÓÒ& 3€EØ�z‰z˜*Ó%Ò>Ð)>€Hð	Øˆ7Ð.¨x¨jð 9,ð	,ð 	QØbðd€Eô 
”)Ó	ñ [ÝAÙ! &Ô)Ø�L‰LÐYÔZ÷[ð €L÷	[ð €Lús   Á BÂBu•   [TRUNCATED â€” subagent hit its iteration cap; the summary below may be incomplete. Verify before relying on it, or re-dispatch the unfinished part.]Úentryc                 ób   — t        | j                  d«      xs | j                  d«      dk(  «      S )NÚ	truncatedÚexit_reasonÚmax_iterations)Úboolr   )rn   s    r   Ú_is_truncatedrt   „   s*   € Ü�—	‘	˜+Ó&ÒV¨%¯)©)°MÓ*BÐFVÑ*VÓWÐWr2   c                 ó*   — t        | «      }|rdg|¢S g S )zKBlank + model_not_found notice block, or [] when the notice does not apply.r   )rm   )rd   Únotices     r   Ú_notice_linesrw   ˆ   s   € ä/°Ó8€FÙ"ˆBˆ=�ˆ=Ð*¨Ð*r2   ÚevtÚtitleÚintroÚcompleted_atÚ	with_goalc          	      ó„  — ||dg}| j                  d«      }t        |t        t        f«      rMt	        j
                  dt	        j                  |«      «      }|j                  d|› dt        ||z
  «      › d�«       |r(|j                  d| j                  dd«      xs d› �«       | j                  d	«      r|j                  d
| d	   › �«       | j                  d«      r&|j                  ddj                  | d   «      › �«       |j                  d| j                  d«      xs d› d| j                  d«      xs d› �«       |S )zZShared preamble: title, intro, blank, dispatch time, [goal], context/toolsets, role+model.r   Údispatched_atz%Y-%m-%d %H:%M:%SzDispatched: ú (z ago)zOriginal goal: ÚgoalÚcontextzContext you provided: Útoolsetsz
Toolsets: ú, zRole: ÚroleÚleafz
   Model: rT   r;   )
r   Ú
isinstancer@   ÚfloatÚtimeÚstrftimeÚ	localtimer6   rE   r   )rx   ry   rz   r{   r|   rl   r~   Útss           r   Ú	_preamblerŒ   Ž   s   € à�E˜2Ð€EØ—G‘G˜OÓ,€MÜ�-¤#¤u Ô.Ü�]‰]Ð.´·±¸}Ó0MÓNˆØ�‰�| B 4 r¬+°lÀ]Ñ6RÓ*SÐ)TÐTYÐZÔ[ÙØ�‰� s§w¡w¨v°rÓ':Ò'@¸bÐ&AÐBÔCØ
‡w�wˆyÔØ�‰Ð-¨c°)©nÐ-=Ð>Ô?Ø
‡w�wˆzÔØ�‰�z $§)¡)¨C°
©OÓ"<Ð!=Ð>Ô?Ø	‡L�L�6˜#Ÿ'™' &›/Ò3¨VÐ4°J¸s¿w¹wÀwÓ?OÒ?VÐSVÐ>WÐXÔYØ€Lr2   Údeleg_idc           
      óÐ  — | j                  d«      xs i gdd xs i g\  }| j                  d«      xs g |j                  dd«      | j                  d«      xs t        | j                  d«      xs g «      }}}|t        |«      k  r||   n|j                  dd	«      }t        |j                  d
«      xs d	«      j                  «       j	                  dd«      dd }d|› d|dz   › d|› d�d|rd|› �nd	d|j                  dd«      › d|j                  dd«      › d�|rd|› �nd	z   g}|j                  d«      r|j                  d|d   › �«       dj                  d„ |D «       «      S )zXOne child of a still-running fan-out failed: say which, why, and that the batch goes on.rd   Nr   ÚgoalsÚ
task_indexr   Ún_tasksr€   r   r[   Ú
rV   i�  u"   [ASYNC DELEGATION TASK FAILED â€” z, task ú/ú]a  One subagent in a background fan-out you dispatched has failed while its siblings are still running. The batch's consolidated results will still arrive when the last sibling finishes; this is an early warning so you can re-dispatch or investigate now instead of then.zTask: úStatus: Ústatusr;   ú   Duration: Úduration_secondsr=   z
Error: Úlive_transcriptzLive transcript: c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr$   r1   )rX   Úlines     r   rZ   z._format_task_failure_notice.<locals>.<genexpr>¯   s   è ø€ Ò4˜dªt”TÑ4ùs   ‚Š)r   r   r.   ÚstripÚreplacer6   r   )	rx   r�   r^   r�   ÚidxÚnr€   Úerrrl   s	            r   Ú_format_task_failure_noticer¡   Ÿ   s‚  € à�G‰G�IÓÒ& 2 $¨¨Ð+Ò3°¨t�D€QØ—G‘G˜GÓ$Ò*¨¨A¯E©E°,ÀÓ,BÀCÇGÁGÈIÓDVÒDuÔZ]Ð^a×^eÑ^eÐfmÓ^nÒ^tÐrtÓZu�ˆ3€EØœs 5›zÒ)ˆ5�Š:¨q¯u©u°V¸RÓ/@€DÜ
ˆa�e‰e�G‹nÒ" Ó
#×
)Ñ
)Ó
+×
3Ñ
3°D¸#Ó
>¸tÀÐ
D€Cà
,¨X¨J°g¸cÀA¹g¸YÀaÈÀsÈ!ÐLð	Mñ  ˆ&��‰ RØ
�1—5‘5˜ 3Ó'Ð(¨°a·e±eÐ<NÐPSÓ6TÐ5UÐUVÐWÑpsÐ]fÐgjÐfkÑ[lÐy{Ñ|ð€Eð 	‡u�uÐÔØ�‰Ð(¨Ð+<Ñ)=Ð(>Ð?Ô@Ø�9‰9Ñ4 eÔ4Ó4Ð4r2   c                 ó€  — | j                  d«      sg S d| d   › d�g}| j                  d«      xs i }| j                  d«      xs i j                  «       D ]=  \  }}|j                  d|› d|› �«       |j                  |«      sŒ/|d|› d	�||   d
gz  }Œ? | j                  d«      r|j                  d| d   › �«       |S )zªOwner-died recovery diagnostics (``recover_abandoned_delegations``): last persisted
    status, per-task transcript paths, their verbatim tails and the owner's git state.Úlast_known_statuszLast persisted unit status: z~ (before owner exit; not current liveness). Unrecorded outcomes remain unknown; inspect evidence before retrying side effects.Útranscript_tailsÚtask_transcriptszTask index z! transcript (may be incomplete): z--- last lines of task z transcript ---z--- end ---Úgit_state_hintz Owner working tree at recovery: )r   Úitemsr6   )rx   rl   ÚtailsÚindexÚpaths        r   Ú_recovery_linesr«   ²   sï   € ð �7‰7Ð&Ô'Øˆ	Ø+¨CÐ0CÑ,DÐ+Eð Fbð bð c€Eà�G‰GÐ&Ó'Ò-¨2€EØŸ™Ð 2Ó3Ò9°r×@Ñ@ÓBò e‰ˆˆtØ�‰�{ 5 'Ð)JÈ4È&ÐQÔRØ�9‰9�UÕØÐ/°¨w°oÐFÈÈeÉÐVcÐdÑd‰Eðeð ‡w�wÐÔ Ø�‰Ð7¸Ð<LÑ8MÐ7NÐOÔPØ€Lr2   c                 ó¨  — | j                  d«      xs g | j                  d«      xs g }}t        |«      xs t        |«      t        |«      xs t        |«      }}| j                  d«      }|�	d|› d|› d�n|› d�}t        | d|› d	�d
|› d�|d¬«      }	|	dxx   d| j                  d| j                  dd«      «      › d�z  cc<   |	t        | «      z  }	| j                  d«      r |s|	dd| d   › �gz  }	dj	                  |	«      S |	t        |«      z  }	t        |d„ ¬«      D �]Ÿ  }
|
j                  dd«      t        |
«      }}|
j                  dd«      |
j                  d«      |
j                  d«      }}}|t        |«      k  r||   n|
j                  dd«      }|rd n|t        v rd!nd"}d#|› d$|d%z   › d&|› �|rd'|› �ndz   d(|› �z   |
j                  d)«      rd*|
d)   › �ndz   |
j                  d«      �	d+|
d   › d�ndz   |rd,ndz   }|	d|d-z   gz  }	|t        v r+|r)|r|	j                  t        «       |	j                  |«       nE|r"|r|	j                  d.|› d'|› d/�«       |	d0|gz  }	n!|	j                  d1|› �|rd'|› �ndz   d/z   «       |
j                  d2«      r|	j                  d3|
d2   › �«       |	t        |
«      z  }	�Œ¢ dj	                  |	«      S )4zIConsolidated block for a delegate_task fan-out that finished as one unit.rd   r�   Úgroupzgroup 'z' (z subagent(s))z subagent(s)u%   [ASYNC DELEGATION BATCH COMPLETE â€” r”   u5   A background fan-out unit you dispatched earlier â€” u7   â€” has finished; its consolidated results are below. Any other units from the same delegate_task call report separately as they finish. You may have moved on since dispatching â€” act on these or re-dispatch if things have changed. If you are still waiting on siblings, end your turn after acting on this one.F©r|   éÿÿÿÿz   Total duration: Útotal_duration_secondsr˜   r;   r=   r[   z--- ERROR ---z)The batch did not complete successfully: r’   c                 ó&   — | j                  dd«      S )Nr�   r   ©r   )rY   s    r   ú<lambda>z*_format_batch_delegation.<locals>.<lambda>Ú   s   € ¨1¯5©5°¸qÓ+A€ r2   )Úkeyr�   r   r–   r\   r€   r   u   âš u   âœ“u   âœ—z--- z TASK r   r“   ú: z
  (status=Ú	api_callsz, api_calls=rƒ   u:   , TRUNCATED: hit max_iterations â€” work may be incompletez) ---ú(ú)úPartial output:u   (no summary â€” status=r™   z6Full live transcript (complete tool/assistant trace): )r   r   rŒ   r«   r   rw   Úsortedrt   Ú_DONEr6   Ú_TRUNCATED_SUMMARY_NOTEÚ_process_accounting_lines)rx   r�   r{   rd   r�   rŸ   Ún_unitr­   Úunitrl   r^   rž   Úr_truncatedÚr_statusÚ	r_summaryÚr_errorÚr_goalÚiconr!   s                      r   Ú_format_batch_delegationrÆ   Ã   sH  € à—W‘W˜YÓ'Ò-¨2¨s¯w©w°wÓ/?Ò/EÀ2ˆU€Gä�E“
Ò*œc '›l¬C°«LÒ,F¼CÀ»J€v€AØ�G‰G�GÓ€EØ8=Ð8IˆW�U�G˜3˜v˜h mÑ4ÐRXÐQYÐYeÐOf€DÜØØ
/°¨z¸Ð;Ø
?À¸vð F?ð 	?ð 	 ô'€Eð 
ˆ"ƒIÐ& s§w¡wÐ/GÈÏÉÐQcÐehÓIiÓ'jÐ&kÐklÐmÑmƒIØ	Œ_˜SÓ!Ñ!€EØ
‡w�wˆwÔ¡Ø�/Ð%NÈsÐSZÉ|ÈnÐ#]Ð^Ñ^ˆØ�y‰y˜ÓÐð 
Œ]˜7Ó#Ñ#€EÜ�GÑ!AÔBó .ˆØŸ5™5 ¨qÓ1´=ÀÓ3Cˆ[ˆØ'(§u¡u¨X°sÓ';¸Q¿U¹UÀ9Ó=MÈqÏuÉuÐU\Ë~˜W�)ˆØ"¤S¨£ZÒ/��s’°Q·U±U¸6À2Ó5FˆÙ#‰u°8¼uÑ3D©%È%ˆØ˜˜˜f S¨1¡W I¨Q¨q¨cÐ2Áv¸¸6¸(±mÐSUÑVÐ[eÐfnÐeoÐYpÑpØ89¿¹¸kÔ8J�| A k¡NÐ#3Ñ4ÐPRñTà67·e±eÐ<NÓ6OÐ6[�r˜!Ð.Ñ/Ð0°Ñ2Ðacñeñ VaÑQÐfhñjˆð 	�"�f˜wÑ&Ð'Ñ'ˆØ”uÑ¡ÙØ—‘Ô4Ô5Ø�L‰L˜Õ#ÙÙØ—‘˜q  
¨"¨W¨I°QÐ7Ô8ØÐ'¨Ð3Ñ3‰Eà�L‰LÐ2°8°*Ð=ÑSZÀ2ÀgÀYÁÐ`bÑcÐfiÑiÔjØ�5‰5Ð"Ô#Ø�L‰LÐQÐRSÐTeÑRfÐQgÐhÔiØÔ*¨1Ó-Ñ-Šð-.ð. �9‰9�UÓÐr2   r^   c                 ój  — g }| j                  d«      xs g D ]O  }|j                  d|j                  d«      › d|j                  dd«      dd › d	|j                  d
d«      › d�«       ŒQ | j                  d«      xs g }|r:|j                  dt        |«      › d�dj                  d„ |D «       «      z   dz   «       | j                  d«      xs g D ]`  }|j                  d|j                  d«      › d|j                  dd«      dd › d|j                  d«      › d|j                  dd«      › �«       Œb |S )uÞ   Runtime-truth lines about a child's background processes: what it handed to you (you own it now, its
    completion lands here) and what it left running (terminated at teardown â€” never trust a child's "watcher running").Úhanded_off_processeszHanded off to you: r   r   Úcommandr   Néx   u   ) â€” Únotez9. You own it now; its completion notice will arrive here.Úorphaned_processeszChild left zi background process(es) running that were TERMINATED with it (subagent process notices never reach you): ú; c              3   ó”   K  — | ]@  }|j                  d «      › d|j                  dd«      dd › d|j                  d«      › d�–— ŒB y­w)	r   ú `rÉ   r   Néd   z` (Úruntime_secondszs)r²   )rX   Úos     r   rZ   z,_process_accounting_lines.<locals>.<genexpr>ÿ   sY   è ø€ ò  !IÐ{| A§E¡E¨,Ó$7Ð#8¸¸1¿5¹5ÀÈBÓ;OÐPTÐQTÐ;UÐ:VÐVYÐZ[×Z_ÑZ_Ð`qÓZrÐYsÐsuÔ!vñ  !Iùs   ‚AAz4. Re-launch in this session anything you still need.Úunread_completionszChild's process rÏ   rÐ   z` finished (exit code Ú	exit_codez4) but the child never read its result; output tail:
Úoutput_tail)r   r6   r   r   )r^   rl   r?   ÚorphansÚus        r   r½   r½   ô   s‰  € ð €EØ�U‰UÐ)Ó*Ò0¨bò PˆØ�‰Ð*¨1¯5©5°Ó+>Ð*?¸rÀ!Ç%Á%È	ÐSUÓBVÐW[ÐX[ÐB\ÐA]Ð]cÐde×diÑdiÐjpÐrtÓduÐcvð wOð Oõ 	PðPð �e‰eÐ(Ó)Ò/¨R€GÙØ�‰�{¤3 w£< .ð 1Dð Dà—y‘yñ  !Ið  AHô  !Ió  IñIð NñNô 	Oð �U‰UÐ'Ó(Ò.¨Bò }ˆØ�‰Ð'¨¯©¨lÓ(;Ð'<¸B¸q¿u¹uÀYÐPRÓ?SÐTXÐUXÐ?YÐ>ZÐZpØŸ™˜kÓ*Ð+Ð+`Ðab×afÑafÐgtÐvxÓayÐ`zð|õ 	}ð}ð €Lr2   c                 ó”  — | j                  dd«      }| j                  d«      xs t        j                  «       }| j                  d«      rt        | |«      S | j                  d«      st        | j                  d«      t        «      rt        | ||«      S | j                  d«      xs d| j                  d	«      | j                  d
«      }}}t        | «      }t        | d|› d�d|d¬«      }|t        | g«      d|› d| j                  dd«      › d| j                  dd«      › d�|rdndz   dgz   z  }|t        v r+|r)|r|j                  t        «       |j                  |«       nW|dk(  r|j                  d|rd|› �ndz   «       n-|j                  d|› d �|rd!|› �ndz   «       |t        | «      z  }|r|d"|gz  }d!j                  |«      S )#zóSelf-contained re-injection for an async-delegation completion: the FULL
    original task source (goal, context, toolsets, role, model), dispatch time, status
    and result, so an agent deep in unrelated context can act on it or re-dispatch.Údelegation_idÚunknownr{   Útask_failure_noticeÚis_batchrd   r–   r   r\   r[   u   [ASYNC DELEGATION COMPLETE â€” r”   zÈA background subagent you dispatched earlier has finished. You may have moved on since dispatching it; the full task source is below so you can act on the result or re-dispatch if things have changed.Tr®   r•   z   API calls: r¶   r   r—   r˜   r;   r=   u;    [TRUNCATED: hit max_iterations â€” work may be incomplete]r   z--- RESULT ---Úinterruptedz.The subagent was interrupted before completingrµ   ú.z3The subagent did not complete successfully (status=z).r’   r¹   )r   rˆ   r¡   r†   r0   rÆ   rt   rŒ   rw   r»   r6   r¼   r«   r   )rx   r�   r{   r–   r\   r[   rp   rl   s           r   Ú_format_async_delegationrß     sç  € ð �w‰w�¨	Ó2€HØ—7‘7˜>Ó*Ò9¬d¯i©i«k€LØ
‡w�wÐ$Ô%Ü*¨3°Ó9Ð9Ø
‡w�wˆzÔœj¨¯©°Ó);¼TÔBÜ'¨¨X°|ÓDÐDØ ŸW™W XÓ.Ò=°+¸s¿w¹wÀyÓ?QÐSV×SZÑSZÐ[bÓSc�UˆG€FÜ˜cÓ"€IÜØØ
)¨(¨°1Ð5ð	Kð 	 ô&€Eð 
Œ]˜C˜5Ó!Ø
�6�(˜.¨¯©°¸aÓ)@Ð(AÀÈsÏwÉwÐWiÐknÓOoÐNpÐpqÐrÙLUÑHÐ[]ñ	_àð%ñ ñ €Eð ”�™7ÙØ�L‰LÔ0Ô1Ø�‰�WÕà�]Ò"Ø�L‰LÐIÑ]bÈrÐRWÐQXÉ\ÐhkÑlÕmà�L‰LØEÀfÀXÈRÐPÑdiÐVXÐY^ÐX_ÑT`ÐoqÑrôtà”_ SÓ)Ñ)ˆEÙØÐ'¨Ð1Ñ1ˆEØ�9‰9�UÓÐr2   c           	      óì  — | j                  d«      }t        |t        «      r!|D �cg c]  }t        |t        «      sŒ|‘Œ c}ng }|xs | g}| j                  d«      xs g }g g }}ddddddddd	œ}|D ]ß  }|j                  d
«      xs |j                  d«      rdnd}	|	t        v rt        |«      rdndn|j                  |	d«      }
|j                  |
«       |j                  dd«      }d|cxk  rt        |«      k  rn n||   n|j                  dd«      }|j                  dj                  t        |xs d«      j                  «       «      «       Œá t        |«      dk(  rd|d   › d|d   › �S t        t        |«      «      dk(  r|d   nd}dj                  t        | j                  d«      xs d«      j                  «       «      xs dj                  |«      }d|› d|› dt        |«      › d�S c c}w )zLCompact UI title; the separate model notification retains all task evidence.rd   r�   ÚFailedÚ	CancelledÚInterruptedz	Timed OutÚStalledÚUnknown)Úfailedr[   Ú	cancelledrÝ   ÚtimeoutÚstalledrÚ   Úrejectedr–   r[   ræ   r   Ú
IncompleteÚ	Completedr�   r   r€   r   rV   zBackground taskr   zSubagent Task rµ   zFinished with Issuesr­   rÍ   zSubagent Tasks r   z tasks))r   r†   r0   r-   r»   rt   r6   r   r   r.   ÚsplitÚset)rx   Úraw_resultsr^   rd   r�   ÚlabelsÚtitlesÚstatus_labelsÚresultr–   Úlabelr©   r€   Úoutcomery   s                  r   Úasync_delegation_display_textrö   .  sá  € à—'‘'˜)Ó$€KÜAKÈKÔY]ÔA^˜+Ö=�Q¬°A´tÕ)<ŠqÓ=Ðdf€GØÒ˜#˜€GØ�G‰G�GÓÒ" €EØ˜ˆF€FØ'°(ÈØ$1¸kÐV_Ø )°xñA€Mð ò HˆØ—‘˜HÓ%Ò[°f·j±jÀÔ6I©(È{ˆØLRÔV[ÉO¤¨vÔ!6‘¹KØ×Ñ˜f lÓ3ð 	à�‰�eÔØ—
‘
˜<¨Ó+ˆØ  EÔ6¬C°«JÕ6ˆu�UŠ|¸F¿J¹JÀvÈrÓ<RˆØ�‰�c—h‘hœs 4Ò#<Ð+<Ó=×CÑCÓEÓFÕGðHô ˆ7ƒ|�qÒØ  q¡	˜{¨"¨V°A©Y¨KÐ8Ð8Üœs 6›{Ó+¨qÒ0ˆf�QŠiÐ6L€GØ�H‰H”S˜Ÿ™ Ó)Ò/¨RÓ0×6Ñ6Ó8Ó9ÒN¸T¿Y¹YÀvÓ=N€EØ˜W˜I R¨ w¨b´°W³°¸gÐFÐFùò' >s
   ¦G1¼G1Úprocess_completec                 óŠ   — dj                  t        | xs d«      j                  «       «      }t        |«      dkD  r|d d dz   S |S )NrV   r   éP   éM   ú...)r   r.   rí   r   )rÉ   Úcmds     r   Ú_short_commandrý   J  sB   € Ø
�(‰(”3�w’} "Ó%×+Ñ+Ó-Ó
.€CÜ" 3›x¨"š}ˆ3ˆs�ˆ8�eÑÐ5°#Ð5r2   Úeventsc                 ód  — t        | «      dk7  rt        | «      › d�S | d   }|j                  d«      xs d|j                  dd«      }}|dk(  rd	}n|t        v r
|d
k(  rdnd}n	|dk(  rdnd}t        |j                  d«      «      }|dgt        ¢­vr|dk7  rd|› d�nd}|r
d|› |› d|› �S d|› |› �S )z[Compact UI title for one or more process completions; the model text keeps the full output.r   z Background Processes Finishedr   Úcompletion_reasonÚexitedrÔ   r;   ÚkilledÚ
Terminatedr   ÚLostzFailed to StartÚFinishedrá   rÉ   z (exit r¸   r   zBackground Process rµ   )r   r   Ú_REASON_STATUSrý   )rþ   rx   ÚreasonrÔ   rõ   rü   Údetails          r   r%   r%   O  sé   € ä
ˆ6ƒ{�aÒÜ�f“+�Ð<Ð=Ð=Ø
�‰)€CØŸ™Ð 3Ó4Ò@¸À#Ç'Á'È+ÐWZÓB[ˆI€FØ�ÒØ‰Ø	”>Ñ	!Ø" fÒ,‘&Ð2C‰à )¨Q¢‘*°HˆÜ
˜Ÿ™ Ó+Ó
,€CØ'-°hÐ5PÄÑ5PÑ'PÐU^ÐbcÒUcˆw�y�k Ñ#Ðik€FÙ=@Ð   	¨&¨°°C°5Ð9ÐmÐH[Ð\cÐ[dÐekÐdlÐFmÐmr2   c            	       ót   ‡ — e Zd ZU dZeed<   eed<   eed<   d
dedededefˆ fd„Zedededd fd	„«       Z	ˆ xZ
S )ÚTimelineNotificationzšQueued model text that stays string-compatible, plus the display kind and compact human
    title the surface paints instead of the raw notification wall.r'   Údisplay_kindÚnotification_categoryr   c                 óR   •— t         ‰| �  | |«      }||_        ||_        ||_        |S r$   )ÚsuperÚ__new__r'   r  r  )Úclsr   r'   r  r  ÚinstanceÚ	__class__s         €r   r  zTimelineNotification.__new__h  s0   ø€ Ü‘7‘? 3¨Ó-ˆØ ,ˆÔØ ,ˆÔØ)>ˆÔ&Øˆr2   r   r   c                 óR   — ddl m}  | |t        |«      d ||«      rd«      S d«      S )Nr   )Údiagnostic_process_eventÚasync_delegation_completeÚ
diagnosticró   )Úagent.notification_presentationr  rö   )r  r   r   r  s       r   Úfor_delegationz#TimelineNotification.for_delegationo  s:   € åLÙ�4Ô6°uÓ=Ð?ZÙ#;¸EÔ#B�<óRð 	RØHPóRð 	Rr2   )ró   )r(   r)   r*   r+   r.   r/   r  Úclassmethodr-   r  Ú__classcell__)r  s   @r   r
  r
  `  sn   ø… ñFð ÓØÓØÓñ˜3ð ¨cð Àð Ð]`õ ð ðR #ð R¨dð RÐ7Mò Ró ôRr2   r
  z
str | Nonec                 óè  — t        | j                  d«      xs | j                  d«      xs d«      }|j                  d«      syd}t        t        «      5  ddlm}  ||«      }ddd«       |sd|› d	�S t        |j                  d
«      xs d«      j                  «       |j                  d«      }}t        |«      dkD  r|dd dz   n|}d|› �|rd|› �ndz   dz   |rd|› d�z   S dz   S # 1 sw Y   Œ…xY w)u	  One-line provenance for a subagent-owned process event, else None. Such a process
    outlives the child and lands in the PARENT conversation, which would otherwise see an
    anonymous output wall. Keyed on ``owner_task_id`` â€” ``task_id`` may be the session key.Úowner_task_idÚtask_idr   zsa-Nr   )Úget_subagent_attributionzStarted by subagent z (delegate_task).r€   rÙ   rÊ   éu   rû   z of delegation rÞ   z Task: "ú")	r.   r   Ú
startswithr   rL   rP   r  rœ   r   )rx   r  Úinfor  r€   Údelegs         r   Ú_delegation_attribution_liner$  v  s  € ô �#—'‘'˜/Ó*ÒF¨c¯g©g°iÓ.@ÒFÀBÓG€GØ×Ñ˜eÔ$ØØ€DÜ	”)Ó	ñ 1Ý@Ù'¨Ó0ˆ÷1ñ à% g YÐ.?Ð@Ð@Ü�d—h‘h˜vÓ&Ò,¨"Ó-×3Ñ3Ó5°t·x±xÀÓ7Pˆ%€DÜ!$ T£¨S¢ˆ4��ˆ:˜Ò°d€DØ" 7 )Ð,ÉU°/À%ÀÑ0IÐXZÑ[Ð^aÑaÙ%)�˜$˜˜qÐ!ñ3ð 4Ø/1ñ3ð 4÷1ð 1ús   ÁC(Ã(C1c                 óÆ   — | j                  d«      xs d}|dk(  rd| j                  d«      xs d› �S t        j                  |«      xs | j                  dd«      d	k(  rd
S dS )Nr   r  r  zterminated by Útermination_sourceÚHermesrÔ   r;   r   zcompleted normally)r   r  )rx   r  s     r   Ú_completion_statusr(  Š  sl   € Ø�W‰WÐ(Ó)Ò5¨X€FØ�ÒØ §¡Ð(<Ó =Ò IÀÐJÐKÐKÜ×Ñ˜fÓ%ÒoÀ#Ç'Á'È+ÐWZÓB[Ð_`ÒB`Ð*>ÐoÐfnÐor2   c                 óè  — | j                  dd«      }|dv rd| j                  dd«      › d�S |dk(  rt        | «      S | j                  d	d
«      | j                  dd
«      }}t        | «      }| j                  d«      rd| d   › �}|r|› d�nd}|dk(  rr| j                  d«      xs d}d|› d| j                  dd«      › dt        t	        | j                  d«      xs d«      «      › d| j                  dd«      › d|› d|› d|› d�S |dk(  rV| j                  dd«      }d |› d!| j                  d"d«      › d#|› d|› d$| j                  dd«      › �
|rd%|› d&�z   dz   S dz   dz   S | j                  d'd«      }| j                  dd«      }|d(v rd)nd}	|r't        |t        «      rt        |«      d*kD  r	d+|d,d- z   }n| j                  d.«      rd/| d.   › d0|› d1|› �}d |› d2t        | «      › d3|› |	› d4|› d|› d5|› d�S )6zEFormat a completion_queue event into an ``[IMPORTANT: ...]`` message.r4   r5   )Úwatch_disabledÚwatch_overflow_trippedÚwatch_overflow_releasedr   Úmessager   r”   Úasync_delegationr   rÚ   rÉ   Úhandoff_notez=Handed off to you by a subagent before it finished. Purpose: r’   Ú	heartbeatÚoutputz((no new output since the last heartbeat)z[Background process z heartbeat #Úseqr;   u    â€” still running after Úelapsedr   z
 (next in Úintervalz)s; you will also be told when it exits).
z	Command: z
Output since last heartbeat:
Úwatch_matchÚ
suppressedz[IMPORTANT: Background process z matched watch pattern "Úpatternz".
z
Matched output:
z
(z/ earlier matches were suppressed by rate limit)rÔ   >   éñÿÿÿú-15Ú143é�   z	, SIGTERMiX  ue   ...(output trimmed â€” subagent-owned process; see the delegation's live transcript for full output)
i¨ýÿÿNÚ
output_cutz
...(first u6    characters cut â€” process(action="log", session_id="z") has the full output)
rV   z (exit code z).
z	
Output:
)	r   rß   r$  rE   r‡   r†   r.   r   r(  )
rx   Úevt_typeÚ_sidÚ_cmdÚ_attributionÚattributionÚ_outÚ_supÚ_exitÚ_signals
             r   Úformat_process_notificationrF  ‘  s¬  € à�w‰w�v˜|Ó,€Hð ÐZÑZØ˜cŸg™g i°Ó4Ð5°QÐ7Ð7ØÐ%Ò%Ü'¨Ó,Ð,Ø—‘˜ yÓ1°3·7±7¸9ÀiÓ3Pˆ$€DÜ/°Ó4€LØ
‡w�wˆ~ÔØVÐWZÐ[iÑWjÐVkÐlˆÙ)5�\�N "Ñ%¸2€KØ�;ÒØ�w‰w�xÓ ÒNÐ$Nˆà" 4 &¨°S·W±W¸UÀCÓ5HÐ4IÐIbÜœ5 §¡¨Ó!3Ò!8°qÓ9Ó:Ð;¸:ÀcÇgÁgÈjÐZ]ÓF^ÐE_ð `6àˆm˜9 T FÐ*JÈ4È&ÐPQðSð	Tð
 �=Ò Ø�w‰w�| QÓ'ˆà-¨d¨VÐ3LÈSÏWÉWÐU^Ð`cÓMdÐLeÐejØˆm˜9 T FÐ*=¸c¿g¹gÀhÐPRÓ>SÐ=TðVáNR��T�FÐIÐJñ\à^añbð	cð Y[ñ\à^añbð	cð �G‰G�K Ó%€EØ�7‰7�8˜RÓ €DØ"Ð&>Ñ>‰kÀB€Gñ œ
 4¬Ô-´#°d³)¸c²/ð>à�4�5ˆkññ 	ð 
�‰�Ô	à˜S Ñ.Ð/ð 0 Ø $˜vÐ%?À¸vðGˆð *¨$¨¨qÔ1CÀCÓ1HÐ0IÈÐV[ÐU\Ð]dÐ\eÐeiØˆ-�y   k°$°°qð	:ð;r2   )r   rF   )r   zlist[str] | None)%r+   rˆ   Údataclassesr   Ú
contextlibr   r»   r  r   r8   r‡   r.   rE   rM   r-   rR   rs   rg   rm   r¼   rt   rw   rŒ   r¡   r«   rÆ   r0   r½   rß   rö   ÚPROCESS_COMPLETE_DISPLAY_KINDrý   r%   r
  r$  r(  rF  r1   r2   r   ú<module>rJ     sÛ  ðñ+ó
 Ý !Ý à €ØOÐarÑs€ñ �$˜dÔ#÷að aó $ðaò0ð ,˜ð , 3ó ,óNð˜Dó ð	U°Dó 	Uóð*ð ðX˜ð X $ó Xó+ð�4ð  ð ¨Cð ¸uð ÐTXð Ð]hó ð"5 Tð 5°Sð 5¸Só 5ð&˜ð  +ó ð". $ð .°#ð .ÀUð .Èsó .ðb ð ¨$ó ð&$ $ð $¨3ó $ðNG tð G°ó Gð2 !3Ð ð6˜só 6ð
n¨Dð n°Só nô"R˜3ô Rð,4 dð 4¨|ó 4ð(p˜Dð p Só pð,; Tð ,;¨lô ,;r2   