
    *jH                       U d 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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ZddlZddlmZ ddlmZ  ej        e          ZddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7 ddl8m9Z9 dd	l:m;Z; dd
l<m=Z= ddl>m?Z? ddl@mAZAmBZB  ejC                    ZDdZEdeFdz  deFdz  deFdz  deGeFdz  eFdz  eFdz  f         fdZHdeFdeFdeIfdZJd ZK	 ddlLmMaM n# eN$ r daMY nw xY wd ZOdeFdeIfdZPddeQdeQfdZRdZSdT                                ZUd eeV         deFfd!ZW	 dd"eeF         d eeV         deFfd#ZX ejY        d$          ZZd%eFdeFfd&Z[de\eV         fd'Z]d(eFdefd)Z^d*Z_deVfd+Z`d,d-d.d/eFd0eFd1eFdeVfd2Zad3eVdebfd4Zcde\eF         fd5Zdd%eFde\eV         fd6Zed3eVdeVfd7Zf	 dd3eeV         deVfd8Zgd9eVdeVfd:Zhd;e\d<eQdeIfd=ZideFfd>ZjdeFfd?Zkdd@eFdz  deFfdAZlddBdCdDeFdEeIdeVfdFZmddeFdHeFdIeFdeVfdJZndeIfdKZoddeFd@eFdz  deFfdMZpdLdNdeFddfdOZqddPZrdBdLdQdReIdeFddfdSZsdeFfdTZtddUl@muZumvZv ddVlwmxZx h dWZydXZzh dYZ{dZZ|h d[Z}d\ Z~d] Zdd^Zdd_Zd`eVdz  daeFdbeFdceFdeVf
ddZdeeVdeFfdfZdgeFddfdhZdbeFde\eF         fdiZdeFfdjZ edkh           edlh           edmh           edmh           ednh           edoh           edph          dqZeVedz  eeF         f         edr<   dsedteFdeIfduZdveVdeFfdwZddxdyeFdzeFdaeFdveVfd{Zd%eFdeFfd|Zd%eFdeFfd}Zd%eFdeFfd~Zd%eFdeIfdZdeFfdZ ejY        d          Z ejY        d          Z ejY        d          Z ejY        d          ZdseFdeFfdZdseFdeFfdZdBdd%eFdeIdeFfdZdeIfdZd Zd Zd ZdeQfdZdeFdeIfdZdeFdeFdeGeFe\eF         f         fdZddeFdeFdeFdeIfdZdeVfdZdeIfdZddebdebfdZddeFdeFdeFdeQfdZddeFdeFdeFdeQfdZd1eFdeIfdZd1eFdeIfdZdeFfdZdeFfdZdBddeIdeGeFeFf         fdZ	 	 	 ddeFdeFdeFdeFdeFdeGeeF         eFf         fdZdeFdeFdeGeeF         eFf         fdZdeFdeFdeGeeF         eFeFf         fdZddBddeFdeFdeIdeGeeF         eFeFf         fdZddbeFd1eFdeFdeFdeFddfdZdeFdeFdeeF         fdZdeFdeIfdZddbeFdeFdeFdeFfdZddbeFdeFdeFdeFfdZdeFddfdZd Zd ZdeIfdZdeIfdZddxdveVfdZd Zd Zd Zd Zd Zd Zd ZdÄ ZdĄ Zdń ZdƄ ZdǄ ZdȄ ZdɄ ZȐd	deFdz  deQdeFdz  fd̈́Zd΄ Zdτ ZdЄ Zdф Zd҄ Zdӄ ZdԄ ZdՄ Zdք Zdׄ Zd؄ Zdل Zdڄ ZdeIfdۄZdZdZdZedߜdeQdeQfdZddededdeQdeQdeQdeQdeQdeVfdZefdeQdeFfdZݐd
deQdeVfdZdeQdeQfdZߐddZdeVdeGfdZdddeVdeQdz  deIfdZd ZdeIfdZd Zd ZdeFfdZdeVdeIfdZddZ	 ddBddBddZdeVdeIfdZdeFdeIfd ZdS (  zt
Hermes Web UI -- SSE streaming engine and agent thread runner.
Includes Sprint 10 cancel support via CANCEL_FLAGS.
    N)Path)Optional)
get_configSTREAMSSTREAMS_LOCKCANCEL_FLAGSAGENT_INSTANCESSTREAM_PARTIAL_TEXTSTREAM_REASONING_TEXTSTREAM_LIVE_TOOL_CALLSSTREAM_GOAL_RELATEDPENDING_GOAL_CONTINUATIONSTREAM_LAST_EVENT_IDLOCKSESSIONSSESSION_DIR_get_session_agent_lock_set_thread_env_clear_thread_envregister_active_runupdate_active_rununregister_active_runSESSION_AGENT_LOCKSSESSION_AGENT_LOCKS_LOCKresolve_model_provider"resolve_custom_provider_connectionmodel_with_provider_contextload_settings)redact_session_data_redact_text)is_context_compression_markervisible_messages_for_anchor)meter)RunJournalWriter)$append_turn_journal_event_for_stream)prompt_cache_hit_percent)get_state_db_session_messages(reconciled_state_db_messages_for_sessionz	dummy-keyresolved_providerresolved_api_keyresolved_base_urlreturnc                     t          | t                    r|                     d          s| ||fS t          |           \  }}|s|r|}|s|r|}|rd} |st          }| ||fS )a  Return provider/key/base_url overrides for ``custom:*`` endpoints.

    Hermes Agent treats named custom providers as routing hints around an
    OpenAI-compatible base URL.  Local OpenAI-compatible servers often run
    without authentication, so a missing key should not fail before the first
    request; pass a harmless placeholder to the SDK and let the endpoint accept
    it or return its own auth error.
    zcustom:custom)
isinstancestr
startswithr   _KEYLESS_CUSTOM_API_KEY)r)   r*   r+   _cp_key_cp_bases        0/Users/bertmahoney/hermes-webui/api/streaming.py*_resolve_custom_provider_runtime_overridesr6   =   s     (#.. F3D3O3OPY3Z3Z F "24EEE:;LMMGX # #" % %$ 7
 % 	76.0AAA    kindmessagec                 
   t          | pd                                                                          }t          |pd                                                                          }|dk    od|v pd|v pd|v pd|v pd|v S )zNReturn True if an agent lifecycle status should surface as a fallback warning. 	lifecyclezrate limitedzswitching to fallbackzfalling backzfallback activatedztrying fallbackr0   striplower)r8   r9   kms       r5   _is_fallback_lifecycle_messagerB   ]   s    DJB%%''AGMr  ""((**A	[ 	
a &&!+&"& $q(& !A%	r7   c                  P    dD ]"} 	 t          |            # t          $ r Y w xY wdS )a  Import tools.skills_tool and tools.skill_manager_tool outside any lock.

    First-time module imports can trigger heavy initialisation (disk I/O,
    transitive imports, plugin discovery).  Performing those imports while
    holding ``_ENV_LOCK`` serialises every concurrent session behind the
    slowest import.  Prewarming ensures the modules are already in
    ``sys.modules`` before the lock is acquired, so the lock body only
    does lightweight attribute patching.

    We cannot place these at module top-level because ``tools.*`` lives
    in the hermes-agent package which may not be on ``sys.path`` at
    import time (Docker volume-mount ordering).  A dedicated helper
    keeps the lazy-import try/except in one place and makes the intent
    explicit.
    )ztools.skills_toolztools.skill_manager_toolN)
__import__ImportError)	_mod_names    r5   _prewarm_skill_tool_modulesrG   m   sT      G  		y!!!! 	 	 	D	 s   
##AIAgentc                  R    t           	 ddlm }  | a n# t          $ r Y nw xY wt           S )a^  Return AIAgent class, retrying the import if the initial attempt failed.

    auto_install_agent_deps() in server.py may install missing packages after
    this module is first imported (common in Docker with a volume-mounted agent).
    Re-attempting the import here picks up the newly installed packages without
    requiring a server restart.
    Nr   rH   )rI   	run_agentrE   )_clss    r5   _get_ai_agentrM      sL     	111111GG 	 	 	D	Ns    
err_textc                     t          | pd                                          }d|v p?d|v p;d|v p7d|v p3d|v p/d|v p+d|v p'd	|v p#d
|v pd|v pd|v pd|v pd|v pd|v pd|v od|v od|v S )zAReturn True when provider text looks like quota/usage exhaustion.r;   zinsufficient creditzcredit balancezcredits exhaustedzmore creditszcan only affordzfewer max_tokensquota_exceededzquota exceededzexceeded your current quotazplan limit reachedusage_limit_exceededzusage limit exceededzreached the limit of messageszused up your usageplanlimitreached)r0   r?   )rN   
_err_lowers     r5   _is_quota_error_textrV      s   X^$$**,,J+ 	Xz)	X*,	X Z'	X 
*		X
 +	X z)	X z)	X )J6	X  :-	X "Z/	X "Z/	X +j8	X  :-	X j VW
%:VyJ?V!r7   x   defaultc                     	 t                      }|                    di                               d|           }t          |          }|dk    r| S |S # t          $ r | cY S w xY w)z;Resolve clarify timeout from config, with bounded fallback.clarifytimeoutr   )r   getint	Exception)rX   cfgrawtimeout_secondss       r5   _clarify_timeout_secondsrb      sx    llggi$$((G<<c((aN   s   AA A A"!A")task cancelledtask canceledresponse interrupteda  
WebUI progress guidance:
- Match the normal Hermes messaging style; do not add extra status updates solely because this is a browser session.
- For long multi-step work that uses tools, you may provide brief user-visible progress updates before continuing with tool calls.
- Each update should say what you are about to check, what you just confirmed, or why the next tool call is needed.
- Keep updates concise, factual, and in the user's language. One or two short sentences are enough.
- Do not reveal hidden reasoning, chain-of-thought, private scratchpads, secrets, raw logs, or long tool output.
- For direct answers or very short tasks, skip progress updates and answer normally.
surface_contextc                 $   t          | t                    sdS g d}d}|D ]\\  }}|                     |          }|!t          |                                          nd}|r|                    d| d|            ]d                    |          S )ad  Return safe WebUI session metadata for the agent's ephemeral context.

    Messaging gateways inject platform/channel context before each run. Browser
    sessions do not have a chat platform wrapper, so provide an explicit, small
    surface description here instead of relying on the model to infer where it
    is running from the transcript alone.
    r;   )zWebUI session context:zp- This browser session is not the same live transcript as Telegram, Discord, Slack, or other messaging surfaces.z- Use durable memory, saved sessions, and available tools for cross-surface recall instead of assuming those transcripts are in this browser chat.))sourceSource)
session_idz
Session ID)profileProfile)	workspace	WorkspaceNz- : 
)r/   dictr\   r0   r>   appendjoin)rf   linesfieldskeylabelr`   values          r5   _webui_surface_context_promptry      s     ot,, r  E
F  0 0
U!!#&&$'OC    	0LL.e..u..///99Ur7   personality_promptc                 0   g }| r4|                     t          |                                                      t          |          }|r|                     |           |                     t                     d                    d |D                       S )zHBuild WebUI-only runtime instructions that are not persisted to history.

c              3      K   | ]}||V  	d S N .0parts     r5   	<genexpr>z1_webui_ephemeral_system_prompt.<locals>.<genexpr>   s'      666t666666r7   )rr   r0   r>   ry   _WEBUI_PROGRESS_PROMPTrs   )rz   rf   partssurface_prompts       r5   _webui_ephemeral_system_promptr      s    
 E 6S+,,22445552?CCN %^$$$	LL'(((;;66666666r7   z(?i)(api[_-]?key|token|password|secret)\s*[:=]\s*[^\s]+|\b(?:sk-[A-Za-z0-9_-]{16,}|ghp_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,})\b|[A-Za-z0-9_-]{24,}\.[A-Za-z0-9_-]{16,}\.[A-Za-z0-9_-]{16,}textc                     t                               dt          | pd                    }d                    |                                          dd         S )z@Return a short, non-secret diagnostic string for prefill status.z
[REDACTED]r;    N   )_SECRET_SHAPED_REsubr0   rs   split)r   cleans     r5   _redact_prefill_status_textr     sD    !!,DJB@@E88EKKMM""4C4((r7   c                 N   t          | t                    sg S g }| D ]}t          |t                    s|                    d          }|                    d          }|dvs)t          |t                    r|                                sp|                    ||d           |S )z5Normalize a prefill payload to role/content messages.rolecontent>   usersystem	assistantr   r   )r/   listrq   r\   r0   r>   rr   )rx   messagesitemr   r   s        r5   _valid_prefill_messagesr     s    eT"" 	H < <$%% 	xx((9%%666jRU>V>V6^e^k^k^m^m6'::;;;;Or7   r`   c                 
   t          t          |                                                     }|                                s@	 ddlm}  |            j        |z  }n&# t          $ r t          j                    |z  }Y nw xY w|S )Nr   )_get_config_path)	r   r0   
expanduseris_absolute
api.configr   parentr^   cwd)r`   pathr   s      r5   _resolve_prefill_pathr     s    C>>$$&&D %	%333333##%%,t3DD 	% 	% 	%8::$DDD	%Ks   A  B ?B i   c                      dddg ddS )Nnot_configurednoner;   r   statusrh   rw   r   message_countr   r   r7   r5   _prefill_not_configuredr   %  s    &&2SUhijjjr7   fileloaded)rh   r   file_rawrh   r   c                v   t          |           }|j        pd}|                                s	d||g dddS 	 t          t	          j        |                    d                              }||||t          |          dS # t          $ r-}d||g dt          t          |                    dcY d }~S d }~ww xY w)	Nzprefill fileerrorr   zprefill file not foundr   rh   rw   r   r   r   utf-8encodingr   )r   nameexistsr   jsonloads	read_textlenr^   r   r0   )r   rh   r   r   rw   r   excs          r5   _load_prefill_messages_filer   )  s-    **DI'E;;== L!VeQSfg  sK  L  L  	LY*4:dnngn6V6V+W+WXX FUPXknowkxkxyyy Y Y Y!VeQSfg  sN  OR  SV  OW  OW  sX  sX  Y  Y  	Y  	Y  	Y  	Y  	Y  	YYs   A	B 
B8"B3-B83B8config_datac                     t          j        dd          p#t          |                     d          pd          }	 t	          dt          t          |pd          d                    S # t          $ r Y dS w xY w)N,HERMES_WEBUI_PREFILL_MESSAGES_SCRIPT_TIMEOUTr;   %webui_prefill_messages_script_timeout皙?   g      >@g      @)osgetenvr0   r\   maxminfloatr^   )r   r`   s     r5   _prefill_script_timeoutr   5  s    
)BB
G
G  O3{  `G  PH  PH  PN  LN  LO  LOC3E#(OOT22333   sss   ,A( (
A65A6c                    t          | t          t          f          rd | D             S t          j        t          | pd                    }|sg S t          |          dk    r%t          t          |d                             |d<   |S )Nc                 J    g | ] }t          |          t          |          !S r   r0   r   s     r5   
<listcomp>z+_prefill_script_command.<locals>.<listcomp>?  s)    777dSYY7D		777r7   r;      r   )r/   r   tupleshlexr   r0   r   r   )r`   r   s     r5   _prefill_script_commandr   =  s    #e}%% 877c7777KCI2''E 	 5zzQ,U1X6677aLr7   c                 &   t          | pd                                          }|sg S 	 t          j        |          }n# t          $ r d }Y nw xY wt          |t                    r|                    d          }t          |          }|r|S d|dgS )Nr;   r   r   r   )	r0   r>   r   r   r^   r/   rq   r\   r   )r   strippedpayloadr   s       r5   $_messages_from_prefill_script_outputr   J  s    4:2$$&&H 	*X&&   '4   *++j))&w//H (3344s   > AAc                 N   t          j        dd          p|                     d          }|st                      S t	          |          }|rt          |d                   j        nd}|s	dd|g ddd	S 	 t          j        |d
t          j	        t          j	        t          |           d          }nS# t          j        $ r dd|g ddd	cY S t          $ r-}dd|g dt          t          |                    d	cY d }~S d }~ww xY w|j        dk    r.t          |j        p|j        p	d|j                   }dd|g d|d	S t%          |j                            d                    t(          k    rdd|g ddt(           dd	S t+          |j                  }dd||t%          |          dS )N$HERMES_WEBUI_PREFILL_MESSAGES_SCRIPTr;   webui_prefill_messages_scriptr   zprefill scriptr   scriptzprefill script is emptyr   TF)r   stdoutstderrr[   checkzprefill script timed outzprefill script exited r   zprefill script output exceeded z bytesr   r   )r   r   r\   r   r   r   r   
subprocessrunPIPEr   TimeoutExpiredr^   r   r0   
returncoder   r   r   encode_PREFILL_SCRIPT_OUTPUT_LIMITr   )r   
script_rawcommandrw   procr   errr   s           r5   _load_prefill_messages_scriptr   Z  s}   A2FFz+//ZyJzJzJ )&(((%j11G%,BD!!2BE O!XSUhi  uN  O  O  	O[~??+K88
 
 
 $ P P P!XSUhi  uO  P  P  	P  	P  	P [ [ [!XSUhi  uP  QT  UX  QY  QY  uZ  uZ  [  [  	[  	[  	[  	[  	[  	[[!)$+*r*rHraeapHrHrss!XSUhitwxxx
4;g&&''*FFF[7S[[[
 
 	
 4DK@@H(UPXknowkxkxyyys$   4;B0 0D 
	D "C;5D ;D c                 P   t          | t                    r| nt                      }t          |          }|                    d          dk    r|S t          j        dd          p#t          |                    d          pd          }|rt          |          S t                      S )ah  Load configured WebUI session prefill messages.

    Supports the same bounded JSON-file shape used by Hermes Agent.  WebUI also
    supports its own explicitly opt-in script hook so admins can bridge Joplin,
    Obsidian, Notion, llm-wiki, or another local notes source into ephemeral
    turn context without baking any one note provider into the WebUI.
    r   r   HERMES_PREFILL_MESSAGES_FILEr;   prefill_messages_file)
r/   rq   r   r   r\   r   r   r0   r   r   )r   r_   script_contextr   s       r5   _load_webui_prefill_contextr     s     $K66
H++JLLC2377N(##'777y7<<kCGGLcDdDdDjhj@k@kH 5*8444"$$$r7   prefill_contextc                 *   |                      dd          |                      dd          |                      dd          t          |                      d          pd          d	|                      d
          rd
|                      d
d          ini S )zBStrip message bodies before sending context status to the browser.r   r   rh   r   rw   r;   r   r   )r   rh   rw   r   r   )r\   r]   )r   s    r5   _public_prefill_context_statusr     s     "%%h0@AA!%%h77 $$Wb11_00AAFQGG	 
 ;J:M:Mg:V:V^G_(("5566\^ r7   all_messages
prev_countc                     t          |           |k    r| |d         }nt          |           |k     rdS dS t          d |D                       S )u!  Return True if *new* messages (beyond ``prev_count``) contain an
    assistant message with non-empty content.

    ``all_messages`` is ``result.get('messages')`` which includes the full
    conversation history.  ``prev_count`` is ``len(_previous_context_messages)``
    — the number of messages present before the current turn started.  Only
    messages at index >= prev_count are inspected so that historical assistant
    replies don't mask a silent failure on the current turn.

    If ``len(all_messages) < prev_count`` (an edge-case shrink), there is no
    reliable new-message slice to inspect. Treat that as "no new assistant
    reply" so stale historical assistant replies cannot mask a silent failure.
    When ``len == prev_count``, there are no new messages and we return False.
    NFc              3      K   | ]S}|                     d           dk    o5t          |                     d          pd                                          V  TdS )r   r   r   r;   N)r\   r0   r>   r   rA   s     r5   r   z+_has_new_assistant_reply.<locals>.<genexpr>  so         	
f$LQUU9-=-=-C)D)D)J)J)L)L     r7   )r   any)r   r   
candidatess      r5   _has_new_assistant_replyr     st     <:%%!*++.

	\		Z	'	'u
 u       r7   c                      	 t          t                      pi                     d          pd                                          } n.# t          $ r! t
                              dd           d} Y nw xY w| pdS )zBReturn the configured assistant display name for user-facing copy.bot_namer;   z-Failed to load bot_name for cancellation copyTexc_infoHermes)r0   r   r\   r>   r^   loggerdebug)r   s    r5   _preferred_agent_display_namer     s    MOO)r..z::@bAAGGII   DtTTT 8s   AA (A21A2c                     t          t          | dd          pd                                          }|r-|dk    r'|d d                                         |dd          z   S t	                      S )Nrk   r;   rX   r   )r0   getattrr>   upperr   )sessionrk   s     r5   )_preferred_agent_display_name_for_sessionr    sq    ''9b117R88>>@@G 17i''rr{  ""WQRR[00(***r7   
agent_namec                 p    t          | pt                                                                pd}d| dS )Nr   z)The run was cancelled by the user before z( finished. No provider failure occurred.)r0   r   r>   )r  r   s     r5   _cancelled_turn_hintr    s=    z<:<<==CCEEQDeteeeer7   Fsilent_failureerr_strr	  c                   t          | pd          } |                                 }|t          |          j        nd}d|v pd|v pd|v pd|v pd|v pd|v pd	|v p|duo|d
v }| o5d|v p1d|v p-d|v p)d|v p%d|v p!d|v pd|v p|duot          |          j        dv }|rddt	                      dS |rddddS t          |           }| od| v p|duod|v pd|v pd|v pd|v pd|v pd|v }d | v pd!|v pd"|v pd#|v pd$|v pd%|v pd&|v pd'|v }	| od(|v pd)| v p|duod*|v }
|rd+d,d-dS |
rd.d/d0dS |rd1d2d3dS |	rd4d$d5dS |rd6d7d8dS d9d:ddS );zClassify provider/agent failure text for WebUI apperror UX.

    Keep this string-based until hermes-agent exposes stable structured
    provider error classes for Codex OAuth plan limits.
    r;   Nzcancelled by userzcanceled by userzuser cancelledzuser canceledrc   rd   cancellederror)CancelledErrorCanceledErrorzinterrupted by userre   zoperation interruptedzoperation was interruptedzoperation abortedzrequest was aborted
aborterror)KeyboardInterrupt
AbortErrorzTask cancelled	cancelled)rw   typehintResponse interruptedinterruptedzZThe run stopped before a provider response completed. If you did not cancel it, try again.401AuthenticationErrorauthenticationunauthorizedzinvalid api keyinvalid_api_keyzno cookie auth credentials404z	not foundzdoes not existzmodel not foundmodel_not_foundzinvalid modelzdoes not match any known modelzunknown modelz
rate limit429RateLimitErrorzOut of creditsquota_exhaustedzYour provider account is out of credits or usage. Top up, wait for the plan window to reset, or switch providers via `hermes model`.zRate limit reached
rate_limitzaRate limit reached. The fallback model (if configured) was also exhausted. Try again in a moment.Authentication failedauth_mismatchThe selected model may not be supported by your configured provider or your API key is invalid. Run `hermes model` in your terminal to update credentials, then restart the WebUI.zModel not foundzThe selected model was not found by the provider. Check the model ID in Settings or run `hermes model` to verify it exists for your provider.zNo response from providerno_responsezThe provider returned no content and no error. This often means a usage/rate limit was hit silently. Check provider status, switch providers via `hermes model`, or try again in a moment.Errorr   )r0   r?   r  __name__r  rV   )r
  r   r	  rU   	_exc_name_is_cancelled_is_interrupted	_is_quota_is_auth_is_not_found_is_rate_limits              r5   _classify_provider_errorr/    s    '-R  GJ&)oS		""2Iz) 	R+	Rz)	R j(	R z)		R
 j(	R z)	R tOP	-P P   
	
!Z/ _%3_&*4_ +j8_ #j0	_
 %
2_ z)_ 4]DII$6:]$]   
%(**
 
 	

  
+!p
 
 	

 %W--I 	
W :4F$9Y$F::-: +: !J.	:
 !J.: ,z9  	 	)*$	)z)	) 
*	) 
*		)
 j(	) ,z9	) j(  $m 
"mew&6m3d?;lO_clOl   
%% [
 
 	

  
) w
 
 	

  
,# I
 
 	

  
&% d
 
 	

  
0 " Q
 
 	
 gr:::r7   r;   err_typer  c                    t          | pd          }|r!t          |                                          nd}|p||d}|r||d<   |r;|}t          |          dk    r|dd                                         dz   }|r||d<   |S )	zABuild a bounded, redacted apperror payload with provider details.r;   )r9   r  r  i  Ni     …details)r0   r    r>   r   rstrip)r9   r0  r  _message_safe_messager   _detailss          r5   _provider_error_payloadr8  <  s    7=b!!H6>FL**00222BM - 98LLG  * x==4--//%7H 	*!)GINr7   c           	         t          t          | dd          pg           D ]Y}t          |t                    s|                    d          dk    r dS |                    d          dk    rO|                    d          }d}t          |t
                    r|}nt          |t                    r}g }|D ]c}t          |t                    rL|                    t          |                    d	          p|                    d          pd                     dd
                    |          }|	                                
                                t          fdt          D                       r dS [dS )zHReturn True if a visible cancel/interrupted marker is already persisted.r   Nr   r   Fr   r   r;   r   rp   c              3       K   | ]}|v V  	d S r~   r   )r   pattern
normalizeds     r5   r   z-_session_has_cancel_marker.<locals>.<genexpr>`  s(      LLw*$LLLLLLr7   T)reversedr  r/   rq   r\   r0   r   rr   rs   r>   r?   r   _CANCEL_MARKER_PATTERNS)r  msgr   r   r   r   r<  s         @r5   _session_has_cancel_markerr@  L  s}   T::@bAA  #t$$ 	776??f$$55776??k))'')$$gs## 	$DD&& 	$E U UdD)) ULLTXXf%5%5%R)9L9L%RPR!S!STTT99U##DZZ\\''))
LLLL4KLLLLL 	44	5r7   Task cancelled.c                     t          | pd                                          }|                    d          s|dz  }d| dt          |           dS )zFReturn cancelled-turn copy matching the verbose provider-error layout.rA  .z**Task cancelled:** 

**)r0   r>   endswithr  )r9   r  r5  s      r5   _cancelled_turn_contentrG  e  sp    7//006688HS!! C	0x 	0 	0 ,,	0 	0 	0r7   r9   c                x   t          |            d| _        d| _        g | _        d| _        t          |           st          |           }| j                            dt          ||          dt          |pd                                          dt          t          j                              d           dS dS )aA  Persist a user-cancelled terminal state without provider-error wording.

    cancel_stream() usually writes this marker first, but the streaming thread can
    later unwind through the silent-failure or exception path. Those paths must
    not append a misleading provider no-response error after an explicit cancel.
    Nr   TrA  Cancellation detailsr   r   _errorprovider_detailsprovider_details_label	timestamp)+_materialize_pending_user_turn_before_erroractive_stream_idpending_user_messagepending_attachmentspending_started_atr@  r  r   rr   rG  r0   r>   r]   time)r  r9   r  s      r5   _persist_cancelled_turnrV  p  s     0888#G#'G "$G!%G%g.. 	>wGG
.w
CC #G$@/@ A A G G I I&<TY[[))!
 !
 	 	 	 	 		 	r7   c                     d| _         d| _        g | _        d| _        	 ddl}|                    | j                                      d           dS # t          $ r  t          
                    dd           Y dS w xY w)zERemove transient /btw session state after a cancel without saving it.Nr   T
missing_okz.Failed to clean up ephemeral cancelled sessionr   )rQ  rR  rS  rT  pathlibr   r   unlinkr^   r   r   )r  rZ  s     r5   !_cleanup_ephemeral_cancelled_turnr\    s    #G#'G "$G!%GVW\""))T)::::: V V VEPTUUUUUUVs   2A &A<;A<	ephemeralr9   r^  c                    |rt          |            dS t          | |           	 |                                  dS # t          $ r  t                              dd           Y dS w xY w)z?Finalize a cancelled turn for persistent or ephemeral sessions.NrH  z Failed to persist cancelled turnTr   )r\  rV  saver^   r   r   )r  r^  r9   s      r5   _finalize_cancelled_turnra    s     )'222GW5555H H H H7$GGGGGGHs   < &A&%A&c                     ddl } ddl}dg}|                    d           |                    d|j                    | j                            d          }|r|                    d|            n|                    d           d	 |j        D             }|rw|                    d
           |dd         D ]}|                    d|            t          |          dk    r)|                    dt          |          dz
   d           n|                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           |                    d           d                    |          S )u  Return a multi-line diagnostic string for the "AIAgent not available" path.

    The bare ImportError ("AIAgent not available -- check that hermes-agent is
    on sys.path") leaves users guessing at which python is running, where it's
    looking, and what to fix. We assemble the same evidence a maintainer would
    ask for first (issue #1695): the python that's running, the agent_dir env
    var if set, the sys.path entries that mention 'hermes', and the most-common
    fix (`pip install -e .` in the agent dir).

    Kept as a separate helper so it stays out of the hot path until we actually
    need to raise — building it on every successful import would be wasted work.
    r   Nz?AIAgent not available -- check that hermes-agent is on sys.pathr;   z  python:  HERMES_WEBUI_AGENT_DIRz  HERMES_WEBUI_AGENT_DIR: z#  HERMES_WEBUI_AGENT_DIR: (not set)c                 j    g | ]0}d |                                 v sd|                                 v .|1S )hermesagent)r?   r   ps     r5   r   z0_aiagent_import_error_detail.<locals>.<listcomp>  s<    VVVaAGGII(=(=AGGIIAUAUAUAUAUr7   z+  sys.path entries mentioning hermes/agent:   z    - z    ... and z morez0  sys.path: (no entries mention hermes or agent)zD  Most common fix: install the agent in editable mode so its modulesz  appear on sys.path:z    cd /path/to/hermes-agentz    pip install -e .z  Then restart the WebUI.zI  Full troubleshooting: docs/troubleshooting.md ("AIAgent not available")rp   )	r   sysrr   
executableenvironr\   r   r   rs   )_os_sysrt   	agent_dirrelevantentrys         r5   _aiagent_import_error_detailrr    s#    NOE	LL	LL0t00111 899I <=)==>>>>:;;; WV49VVVH IBCCCbqb\ 	+ 	+ELL)%))****x==1LL@H(9@@@AAAGHHH	LL	LLWXXX	LL()))	LL	LL/000	LL'(((	LL	LL,---	LL	LL\]]]99Ur7   )get_session
title_from)set_last_workspace>   r   r   r   refusal
tool_callstool_call_idreasoning_contenti  @>   
used_modelused_providerrequested_modelrequested_provider)llm_gatewaygatewaymetadataresponse_metadatarouting_metadatausage>   r   modelscorereasonr   attemptproviderselectedrO  
latency_msattempt_indexselection_reasonc                    | d S t          | t          t          t          t          f          rSt          |                                           }|sd S t          | t          t          t          f          r| n	|d d         S d S )Nr   )r/   r0   r]   r   boolr>   )rx   r   s     r5   _clean_gateway_routing_scalarr    sy    }t%#sE4011 N5zz!! 	4"53t*<==Muu4:M4r7   c                 2    t           t                    sd S t           fdt          D                       s(t                               d          t
                    r S t          D ],}                     |          }t          |          }|r|c S -d S )Nc              3       K   | ]}|v V  	d S r~   r   )r   r@   r   s     r5   r   z1_find_gateway_metadata_payload.<locals>.<genexpr>  s'      
A
AA1<
A
A
A
A
A
Ar7   routing)r/   rq   r   _GATEWAY_ROUTING_TOP_LEVEL_KEYSr\   r   _GATEWAY_ROUTING_CONTAINER_KEYS_find_gateway_metadata_payload)r   rv   nestedfounds   `   r5   r  r    s    gt$$ t

A
A
A
A!@
A
A
AAA ZPWP[P[\ePfPfhlEmEm .  S!!.v66 	LLL	4r7   c                 
   t          |           }|sdS i }t          D ]+}t          |                    |                    }||||<   ,d|vrt          |          }|||d<   d|vrt          |          }|||d<   g }	|                    d          }
t	          |
t
                    ro|
dd         D ]d}t	          |t                    si }t          D ]+}t          |                    |                    }||||<   ,|r|	                    |           e|	r|	|d<   t          |                    d          pd          
                                                                }t          |                    d          pd          
                                                                }t          |                    d          pd          
                                                                }t          |                    d          pd          
                                                                }t          |o|o||k              }t          |o|o||k              }d	 |	D             }d
 |D             }t          d |	D                       }t          |pt          |          dk    p|          }|                    d          s|                    d          s|	s|s|sdS ||d<   ||d<   ||d<   |S )a.  Return safe LLM Gateway routing metadata, or None when absent.

    LLM Gateway response metadata can contain provider/model routing details,
    but WebUI must only persist display-safe scalars and a bounded routing list.
    Secrets or provider-specific request objects are deliberately ignored.
    Nr|  r}  r     r{  r;   rz  c                     g | ]_}|                     d           t          |                     d           pd                                                                          `S )r  r;   r\   r0   r>   r?   r   as     r5   r   z7_normalize_gateway_routing_metadata.<locals>.<listcomp>6  sk       55AEE*#$$**,,2244  r7   c                     h | ]}||S r   r   rg  s     r5   	<setcomp>z6_normalize_gateway_routing_metadata.<locals>.<setcomp>;  s    #H#H#H!a#HA#H#H#Hr7   c              3      K   | ]N}t          |                    d           pd                                                                          dv V  OdS )r   r;   >   r   failedr[   rejectedN)r0   r\   r>   r?   r  s     r5   r   z6_normalize_gateway_routing_metadata.<locals>.<genexpr><  sk       " " 	AEE(OO!r""((**00226``" " " " " "r7   r   provider_changedmodel_changedhas_failover)r  r  r  r\   r/   r   rq   _GATEWAY_ROUTING_ATTEMPT_KEYSrr   r0   r>   r?   r  r   r   )r   r|  r}  srcr<  rv   rx   fallback_modelfallback_providerr  raw_routingr  clean_attemptr{  requested_provider_normrz  requested_model_normr  r  attempted_providersdistinct_attempted_providersfailed_before_selectionr  s                          r5   #_normalize_gateway_routing_metadatar    s    )
1
1C tJ. $ $-cggcll;;#JsO
**6GG%,:J():--9:LMM(/@J+,G'')$$K+t$$ 
."3B3' 		. 		.Ggt,, M4 / /5gkk#6F6FGG$).M#& .}--- ( '
9
77=2>>DDFFLLNNM!*..1E"F"F"L"MMSSUU[[]]Z^^L117R88>>@@FFHHJz~~.?@@FBGGMMOOUUWWMr.Er-[rJrssc(<cOcAcddM   
 $I#H/B#H#H#H ! " "" " "   (lC0L,M,MPQ,QlUlmmL 	''+5>>,+G+GKRVfjw t%5J!""/J!-J~r7   c           
         g }t          |t                    r|                    |                    d          |                    d          |                    d          |                    d          |                    d          |                    d          |g           dD ](}| $|                    t          | |d                      )|D ]}t          |||          }|r|c S d S )	Nr~  r  r  r  r  r  )llm_gateway_metadatagateway_metadatalast_response_metadatar  r  
last_usager|  r}  )r/   rq   extendr\   rr   r  r  )rf  resultr|  r}  r   attr	candidater<  s           r5   !_extract_gateway_routing_metadatar  L  s   J&$ 	JJ}%%JJy!!JJz""JJ*++JJ)**JJw
 	 	 	 	: 	: geT488999  	8+1
 
 


  		4r7   profile_runtime_envrm   rj   profile_homec           	      z    t          | pi           }|                    t          |          d||d|d           |S )aA  Build thread-local agent env with per-run values overriding profile defaults.

    Profile runtime env may include TERMINAL_CWD from config.yaml. Passing it as
    **kwargs alongside an explicit TERMINAL_CWD raises TypeError before the
    agent starts, so merge into one dict first and let the active workspace win.
    1webui)TERMINAL_CWDHERMES_EXEC_ASKHERMES_SESSION_KEYHERMES_SESSION_IDHERMES_SESSION_PLATFORMHERMES_HOME)rq   updater0   )r  rm   rj   r  envs        r5   _build_agent_thread_envr  m  sV     "(b
)
)CJJI('#*#     Jr7   evtc           	      v   t          | t                    sdS |                     d          dk    rdS |                     dd          }|                     dd          }|                     dd          }|                     d          pd}t          |          dk    r|d	d         d
z   }d| d| d| d| d	S )zCFormat a completed background process notification for agent input.r;   r  
completionrj   r   	exit_codeoutput  Nz
... (truncated)z[IMPORTANT: Background process z completed (exit code z).
Command: z	
Output:
])r/   rq   r\   r   )r  _sid_cmd_exit_outs        r5   _format_process_notificationr    s    c4   r
wwv,&&r77<$$D779b!!DGGK$$E778"D
4yy4ETE{00	$ 	 	e 	 		 		 	 	r7   
process_idc                     	 | j         5  | j                            |           ddd           dS # 1 swxY w Y   dS # t          $ r  t                              dd           Y dS w xY w)zEBest-effort bridge to the agent registry's private completion marker.Nz*Failed to mark process completion consumedTr   )_lock_completion_consumedaddr^   r   r   )process_registryr  s     r5   !_mark_process_completion_consumedr    s    R# 	B 	B155jAAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B R R RADQQQQQQRs'   > 1> 5> 5> &A('A(c                    | sg S 	 ddl m} n# t          $ r g cY S w xY wg }g }t          |dd          }|g S 	 	 |                                }n=# t
          j        $ r Y n!t          $ r t                              dd           Y nw xY wt          |t                    r$t          |                    d          pd	          nd	}|s|                    |           	 |                    |          r|                    |          }n# t          $ r d}Y nw xY wt          |d
d          | k    r|                    |           t          |          }|r%|                    |           t!          ||           I|D ]E}	 |                    |           # t          $ r  t                              dd           Y  nw xY w|S )a0  Return completion notifications that belong to this WebUI session.

    The agent registry completion queue is process-wide and events do not carry
    the WebUI session key directly. Look up the live process session before
    delivery so completions from other tabs remain queued for their owners.
    r   )r  completion_queueNTz(Failed to drain process completion queuer   rj   r;   session_keyz*Failed to requeue process completion event)tools.process_registryr  r^   r  
get_nowaitqueueEmptyr   r   r/   rq   r0   r\   rr   is_completion_consumedr  r  put)	rj   r  notificationsskipped_eventsr  r  evt_sidr   notifications	            r5   "_drain_webui_process_notificationsr    sr     	;;;;;;;   			  "M!#N/1CTJJ	I	"--//CC{ 	 	 	E 	 	 	LLCdLSSSE	 7Ad6K6KS#cggl++1r222QS 	!!#&&&	66w?? #''00DD 	 	 	DDD	4--;;!!#&&&3C88 	I  ...-.>HHH5I8   	  %%%% 	 	 	LLEPTLUUUEE	 sM    A B	!%B	B	 D 6D DDF&GGc                 2   t          | t                    r`t          |                     d          p+|                     d          p|                     d          pd                                          S t          | pd                                          S )Nr   filenamer   r;   )r/   rq   r0   r\   r>   )atts    r5   _attachment_namer    s{    #t \3776??Rcggj&9&9RSWWV__RPRSSYY[[[syb>>!!!r7   z	image/pngz
image/jpegz	image/gifz
image/webpz	image/bmpimage/svg+xml)s   PNG

s   s   GIF87as   GIF89as   RIFFs   BMN_IMAGE_MAGICr   mimec                    |                     d          sdS |                    dd          d         }|dk    rdS 	 |                     d          5 }|                    d	          }d
d
d
           n# 1 swxY w Y   n# t          $ r Y dS w xY wt
                                          D ]#\  }}||                     |          r||v r dS $dS )zCheck that the file's first bytes match the expected image MIME type.

    Uses simple magic-number detection (no external dependency). SVG is
    allowed through because it is text-based and has no binary signature.
    image/F;r   r   r  Trb   N)r1   r   openreadOSErrorr  items)r   r  	mime_basefhheadmagicmimess          r5   _is_valid_imager    s+    ??8$$ u

3""1%IO##tYYt__ 	772;;D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   uu$**,,  u!7!7I<N<N445s5   B  A4(B  4A88B  ;A8<B   
BBr_   c                    |                      d          pi }t          |                     dd          pd                                                                          }|dvrd}|dk    rdS |dk    rdS |                      d          pi }|                     d          pi }t          |                     d	          pd
                                                                          }t          |                     d          pd
                                          }t          |                     d          pd
                                          }|dvs|s|rdS dS )a  Return ``"native"`` or ``"text"`` based on config, mirroring
    ``agent/image_routing.py:decide_image_input_mode``.

    The agent has this logic, but the WebUI's ``_build_native_multimodal_message``
    was unconditionally embedding images as native ``image_url`` parts, completely
    bypassing ``image_input_mode``.  This caused silent failures when the main model
    does not support images and the fallback model is also text-only (#21160-related).
    rf  image_input_modeauto)r  nativer   r  r   	auxiliaryvisionr  r;   r  base_url)r;   r  r  )r_   	agent_cfgmodeauxr  r  
model_namer  s           r5   _resolve_image_input_moder    s[      &BIy}}/88BFCCIIKKQQSSD---xxv~~v ''+


$"CWWX$"F6::j))/R006688>>@@HVZZ((.B//5577J6::j))/R006688H|##z#X#v
 8r7   r_   workspace_ctxmsg_textc          	         |s| |z   S |t          |          dk    r| |z   S d| |z   dg}t          |                                                                          }	 ddlm}  |            }||f}	n# t          $ r |f}	Y nw xY wd}
|pg D ]}t          |t                    st          |
                    d          pd                                          }|sR	 t          |                                                                          t          fd|	D                       s                                s                                j        }|dk    s|t           k    rt          |
                    d	          pd                                          p t#          j        j                  d         pd}|                    d
          rt+          |          s`t-          j                                                                      d          }n# t          $ r Y w xY w|                    ddd| d| id           |
dz  }
|
r|n| |z   S )uu  Build native multimodal content parts for current-turn image uploads.

    WebUI uploads files into the active workspace. For image files, pass the
    bytes to Hermes as OpenAI-style image_url data URLs so vision-capable main
    models can consume them in the same request. Non-image files intentionally
    stay as text path attachments so the agent can inspect them with file tools.

    When *cfg* is provided, respects ``agent.image_input_mode`` — if the resolved
    mode is ``"text"``, returns a plain string (attachments are not embedded) so
    the agent's text-mode pipeline (``vision_analyze``) handles images.
    Nr   )r  r   r   )_attachment_rootr   r;   c              3   B   K   | ]}                     |          V  d S r~   )is_relative_to)r   rr   s     r5   r   z3_build_native_multimodal_message.<locals>.<genexpr>O  s1      FF!t**1--FFFFFFr7   r  r  ascii	image_urlurlzdata:z;base64,)r  r  r   )r  r   r   resolve
api.uploadr  r^   r/   rq   r0   r\   r>   r   is_filestatst_size_NATIVE_IMAGE_MAX_BYTES	mimetypes
guess_typer   r1   r  base64	b64encode
read_bytesdecoderr   )r  r  attachmentsrm   r_   r   workspace_rootr  attachment_root_allowed_rootsimage_countr  raw_pathsizer  datar   s                   @r5    _build_native_multimodal_messager-    s     (x'' 4S99VCCx''mh&>??@E)__//1199;;N+//////**,,(/: + + +(*+K b  #t$$ 	swwv,"--3355 		>>,,..6688D FFFF~FFFFF <<>> 99;;&DqyyD#:::swwv,"--3355c):Nty:Y:YZ[:\:b`bD??8,, OD$4O4O #DOO$5$566==gFFDD 	 	 	H	!=!=!=t!=!=>
 
 	 	 	 	q=55]X%==s>    A5 5BB!AH(0H(*H(0A<H(.9H((
H65H6c                    | sdS t          |           }t          j        dd|t          j        t          j        z            }t          j        dd|t          j        t          j        z            }t          j        dd|t          j        t          j        z            }t          j        dd|t          j                  }t          j        dd|t          j                  }t          j        d	d|                                          }|S )
z:Remove common reasoning/thinking wrappers from model text.r;   z^\s*<think>.*?</think>\s*r   flagsz-^\s*<\|channel\|?>thought\n?.*?<channel\|>\s*z&^\s*<\|turn\|>thinking\n.*?<turn\|>\s*z1^\s*(the|ther)\s+user\s+is\s+asking[^\n]*(?:\n|$)a*  ^\s*(?:here(?:'s| is) (?:a |my )?(?:thinking|thought) (?:process|trace|through)\b[^\n]*\n?|let me (?:think|work|reason|analyze|walk) (?:through|about|this|step)\b[^\n]*\n?|i(?:'ll| will) (?:think|work|reason|analyze|break this down)\b[^\n]*\n?|(?:okay|alright|sure|of course),?\s+let me\b[^\n]*\n?)\s+)r0   rer   
IGNORECASEDOTALLr>   r   ss     r5   _strip_thinking_markupr7  e  s     rD		A 	+S!2=29;TUUUA
?ar}_a_hOhiiiA
8#qXZXaHabbbA
CS!SUS`aaaA 		C 	Qbm	 	 	A 	vsA$$&&AHr7   c                    | s| S t          |           }|                                }d|vrd|vr| S d}d| d}d| d}t          j        | d| d|t          j        t          j        z  	          }t          j        | d
d|t          j        t          j        z  	          }t          j        dd|t          j        	          }|                                S )u  Strip XML-style function_calls blocks that DeepSeek and similar models
    emit in their raw response text.  These blocks are processed separately as
    tool calls; leaving them in the assistant content causes them to render
    visibly in the chat bubble.

    Handles both complete blocks (<function_calls>…</function_calls>) and
    partial/orphaned opening tags that may appear at the tail of a stream.
    Also handles variants like <｜DSML｜function_calls> from DeepSeek on Bedrock.
    function_callsdsmlu   (?:\s*｜\s*DSML\s*[｜|]\s*)?<z</zfunction_calls>z>.*?r;   r/  z
(?:>|$).*$u   <\s*｜\s*DSML\s*[｜|]\s*)r0   r?   r2  r   r3  r4  r>   )r   r6  _lo_dsml_prefixopen_tag	close_tags         r5   _strip_xml_tool_callsr@  ~  s     D		A
''))Cs""vS'8'84L0L000H3l333I
%%)%%
	mbi'		 	 	A 	   
	mbi'		 	 	A 	,b!2=IIIA7799r7   c                 \   t          | pd          }t          j        dd|t          j                  }t          j        dd|t          j                  }|                    d          }t          j        dd|                                          }t          |          rdS |dd	         S )
z?Sanitize LLM-generated title text before persisting to session.r;   zB^\s*(?:[*_`~]+\s*)?(?:session\s+title|title)\s*:\s*(?:[*_`~]+\s*)?r/  z^\s*title\s*:\s*z
 	
"'`*_~r1  r   NP   )r7  r2  r   r3  r>   _looks_invalid_generated_titler5  s     r5   _sanitize_generated_titlerD    s    tzr**A
M
	m		 	 	A 	"B???A	 !!A
vsA$$&&A%a(( rSbS6Mr7   c                 z   t          | pd          }|                                sdS t          t          j        d|t          j                  pt          j        d|t          j                  pt          j        d|t          j                  pt          j        d|t          j                  pt          j        d|t          j                  pbt          j        d	|t          j                  pAt          j        d
|t          j                  p t          j        d|t          j                            S )Nr;   Tz/<think>|<\|channel\|>thought|<\|turn\|>thinkingr/  z^\s*(the|ther)\s+user\s+z^\s*user\s+\w+\s+z$\b(they|user)\s+want(s)?\s+me\s+to\bz(^\s*(i|we)\s+(should|need to|will|can)\bz^\s*let me\bz2^\s*here(?:'s| is) (?:a |my )?(?:thinking|thought)zA^\s*(ok|okay|done|all set|complete|completed|finished)\b[\s.!?]*$)r0   r>   r  r2  searchr3  r5  s     r5   rC  rC    s(   DJBA7799 t
	Dar}]]] 	s90!2=III	s9)1BMBBB	s 9<ar}UUU	s 9@!2=YYY		s
 9_ar}===	s 9JAUWUbccc	s 9Y[\dfdqrrr	 	 	r7   c                 :   t          | t                    rg }| D ]}t          |t                    st          |                    d          pd                                          }|dv rL|                    t          |                    d          p|                    d          pd                     t          d                    |          	                                          S t          t          | pd          	                                          S )z7Extract plain text from mixed message content payloads.r  r;   )r;   r   
input_textoutput_textr   r   rp   )
r/   r   rq   r0   r\   r?   rr   r7  rs   r>   )rx   r   rh  ptypes       r5   _message_textrK    s    % @ 	K 	KAa&& f+,,2244EAAASv!H!%%	2B2B!HbIIJJJ%dii&6&6&<&<&>&>???!#ekr"2"2"8"8":":;;;r7   z,^\s*\[Workspace::v1:\s*(?:\\.|[^\]\\])+\]\s*z^\s*\[Workspace:[^\]]+\]\s*z(\[Workspace::v1:\s*(?:\\.|[^\]\\])+\]\s*z\[Workspace:[^\]]+\]\s*c                 t    t          | pd                              dd                              dd          S )Nr;   \z\\r  z\])r0   replacer   s    r5   _escape_workspace_prefix_pathrP    s2    tzr??""40088eDDDr7   c                 (    dt          |            dS )Nz[Workspace::v1: z]
)rP  rO  s    r5   _workspace_context_prefixrR    s    F;DAAFFFFr7   include_legacyrT  c                    t          | pd          }t                              d|d          }|r#||k    rt                              d|d          }|                                S )zDRemove WebUI-injected workspace tags without eating user-typed text.r;   r   )count)r0   _WORKSPACE_PREFIX_REr   _LEGACY_WORKSPACE_PREFIX_REr>   )r   rT  rx   r   s       r5   _strip_workspace_prefixrY    sh    
OOE#''E';;H G(e++.222uA2FF>>r7   c                 (   t          | t                    r|                     d          dk    rdS d                    t	          |pd                                                    sdS t          |                     dd                    }t          |d          g}t          t          fD ]I}|
                    |          D ]1}|                    ||                                d	                    2Jt          fd
|D                       S )a  Match the current human turn even if an internal workspace tag leaked mid-text.

    Normal model-facing messages start with the workspace sentinel. A failed
    retry/merge path can also return an optimistic draft followed by the
    sentinel and the real prompt. Only treat that shape as the current turn
    when the text after the sentinel exactly matches the submitted prompt.
    r   r   Fr   r;   r   TrS  Nc              3      K   | ]>}d                      t          |pd                                                    k    V  ?dS )r   r;   N)rs   r0   r   )r   r  needles     r5   r   z0_looks_like_current_user_turn.<locals>.<genexpr>  sL      \\IsxxIO,,224455?\\\\\\r7   )r/   rq   r\   rs   r0   r   rK  rY  _WORKSPACE_PREFIX_ANY_RE_LEGACY_WORKSPACE_PREFIX_ANY_REfinditerrr   endr   )r?  r  r   r   r;  matchr\  s         @r5   _looks_like_current_user_turnrb    s    c4   CGGFOOv$=$=uXXc(.b))//1122F uB//00D)$tDDDEJ,.MN 2 2%%d++ 	2 	2Ed599;;<<01111	2\\\\Q[\\\\\\r7   c                    d}d}| pg D ]}t          |t                    s|                    d          }|dk    r0t          |                    d                    }|s|r|}\|r|r n]nU|dk    rO|rMt          |                    d                    }|                    d          r|rt	          |          r|r|}|r|r n|dd         |dd         fS )	zReturn (first_user_text, first_assistant_text) snippets for title generation.

    Prefer the first substantive assistant answer in the opening exchange,
    skipping empty placeholders and assistant tool-call preambles.
    r;   r   r   r   r   rw  N  )r/   rq   r\   rK  rC  r   	user_text	asst_textrA   r   r  s         r5   _first_exchange_snippetsrh    s*    II^  !T"" 	uuV}}6>>%aeeI&6&677I  %	 Y [  Y %aeeI&6&677I uu\"" I 9WXa9b9b  &%	 	 	ETcT?IdsdO++r7   c                    d}d}t          | pg           D ]}t          |t                    s|                    d          }|dk    rP|sNt	          |                    d                    }|                    d          r|rt          |          r~|r|}n.|dk    r(|s&t	          |                    d                    }|r|}|r|r n|dd         |dd         fS )	zReturn (last_user_text, last_assistant_text) snippets for title refresh.

    Walks the message list backwards to find the last user+assistant pair,
    skipping empty or tool-call-only assistant messages.
    r;   r   r   r   rw  r   Nrd  )r=  r/   rq   r\   rK  rC  re  s         r5   _latest_exchange_snippetsrj  %  s    IIhn"%%  !T"" 	uuV}};y%aeeI&6&677Iuu\"" I 9WXa9b9b  &%	V^^I^%aeeI&6&677I &%	 	 	ETcT?IdsdO++r7   c                 T   d}| pg D ]}t          |t                    r|                    d          dk    rp|                    dd          }t          |t                    rd                    d |D                       }t          |                                          r|dz  }|S )	z9Count the number of user messages (rough exchange count).r   r   r   r   r;   r   c              3      K   | ]H}t          |t                    |                    d           dk    0|                    dd          V  IdS )r  r   r;   Nr/   rq   r\   rg  s     r5   r   z#_count_exchanges.<locals>.<genexpr>H  s\      "y"yTUW[I\I\"yabafafgmananrxaxax155#4#4axaxaxax"y"yr7   r   )r/   rq   r\   r   rs   r0   r>   )r   rV  rA   r   s       r5   _count_exchangesrn  A  s    E^  a 	155==F#:#:eeIr**G'4(( z(("y"yg"y"y"yyy7||!!## 
Lr7   c                      	 ddl m}   |             }|                    dd          }t          |                                                                          r"t          |          dk    rt          |          ndS # t          $ r Y dS w xY w)z9Read the auto_title_refresh_every setting (0 = disabled).r   r   auto_title_refresh_every0)r   r   r\   r0   r>   isdigitr]   r^   )r   settingsvals      r5   _get_title_refresh_intervalrv  N  s    ,,,,,, =??ll5s;;s88>>++3355M#c((Q,,s3xxxAM   qqs   A<A? ?
BBcurrent_titlec           	      2   t          |d          pd}|sdS t          j        ddt          | pd                                                    }t          j        ddt          |dd         pd                                                    }|r|sdS ||k    S )z<Heuristic: title equals first-message substring placeholder.r;   Fr1  r   N@   )rt  r2  r   r0   r>   )rw  r   derivedcurrentr  s        r5   _is_provisional_titler|  Y  s    2&&,"G ufVS#m&9r":":;;AACCGvsC(:$;$;<<BBDDI ) uir7   rf  assistant_textc                 B    d| d d          d|d d          }ddg}||fS )NzUser question:
rd  z

Assistant answer:
a  Generate a short session title from this conversation start.
Use BOTH the user's question and the assistant's visible answer.
Return only the title text, 3-8 words, as a topic label.
Do not use markdown, bullets, labels, or prefixes like Session Title:.
Do not output a full sentence.
Do not output acknowledgements or completion phrases like OK, done, or all set.
Do not describe internal reasoning.
Bad: The user is asking..., OK, all set.
Good: Title Generation Test, Clarify Dialog Layout, GitHub Issue Triagea  Rewrite this conversation start as a concise noun-phrase title.
Use the actual topic, not the task outcome.
Return title text only.
Do not use markdown, bullets, labels, or prefixes like Session Title:.
Never output acknowledgements, completion status, or meta commentary.r   )rf  r}  qapromptss       r5   _title_promptsr  e  sJ    	ZIdsdO	Z	ZNSWTWSWDX	Z	ZBVTG( w;r7   r  r  r  c                    d                     t          | pd                                          t          |pd                                          t          |pd                                          g          }d|v pd|v S )Nr   r;   minimaxzminimaxi.com)rs   r0   r?   )r  r  r  r   s       r5   _is_minimax_router  ~  s    88HN!!##EKR  HN!!##  D
 6$ 66r7   c                  |    	 ddl m}   | d          }t          |t                    r|ni S # t          $ r i cY S w xY w)zEReturn title_generation auxiliary config, or an empty dict on errors.r   )_get_auxiliary_task_configtitle_generation)agent.auxiliary_clientr  r/   rq   r^   )r  tgs     r5   _get_aux_title_configr    sg    EEEEEE''(:;;D))1rrr1   			s   ), ;;c                     t                      } |                     dd          pd}|                     dd          pd}|                     dd          pd}t          |p|p|o|                                dk              S )zQReturn True when any auxiliary title_generation config field is meaningfully set.r  r;   r  r  r  )r  r\   r  r?   )r  r  r  r  s       r5   _aux_title_configuredr    s    		 	 Bvvj"%%+HFF7B%2Evvj"%%+HNNh&M8>>3C3Cv3MOOOr7         .@c                 N   	 t                      }|                    d          }|| S 	 t          |          }n5# t          t          f$ r! t
                              d||            | cY S w xY w|dk    r|S t
                              d||            | S # t          $ r | cY S w xY w)a  Return the configured timeout (seconds) for auxiliary title generation.

    Only accepts positive numeric values.  Falls back to *default* when the
    value is ``None``, non-numeric, zero, or negative, and emits a debug log
    so mis-configurations are visible in server output.
    r[   Nz;aux title timeout: non-numeric value %r, falling back to %sr   z<aux title timeout: non-positive value %s, falling back to %s)r  r\   r   
ValueError	TypeErrorr   r   r^   )rX   r  r`   rx   s       r5   _aux_title_timeoutr    s    "$$ffY;N	#JJEEI& 	 	 	LLVX[]deeeNNN	 199LSUZ\cddd   s7   &B : B /A,)B +A,,
B 7B B$#B$c                     dS )N   r   r  r  r  s      r5   _title_completion_budgetr    s	     3r7   c                 F    t          dt          | ||          dz            S )Ni      )r   r  r  s      r5   _title_retry_completion_budgetr    s$    t-hxHH1LMMMr7   c                 
    | dv S )N>   
llm_lengthllm_length_auxr   r   s    r5   _title_retry_statusr    s        r7   c                 
    | dv S )u  Statuses where re-issuing the next prompt against the same model
    produces the same failing shape (model burned its budget on hidden
    reasoning, hit a hard provider gate, etc.).

    Short-circuit the prompt-iteration loop so we don't issue a second
    full-budget LLM call (and twice the GPU/credit burn) only to land in
    the same fallback path. See issue #2083.

    Add a status here only when retrying the next prompt is provably
    wasted work (single-call signal already establishes that the next
    call will return the same shape). Length-truncation WITHOUT
    reasoning is NOT in the set — that's legitimately recoverable by
    a larger budget on a different prompt and stays in
    :func:`_title_retry_status`.
    >   llm_empty_reasoningllm_empty_reasoning_auxr   r  s    r5   %_title_should_skip_remaining_attemptsr    s         r7   rv   c                     | d S t          | t                    r|                     |          S t          | |d           }|j        j                            d          rd S |S )Nunittest.mock)r/   rq   r\   r  	__class__
__module__r1   )objrv   rx   s      r5   _safe_obj_valuer    sf    
{t#t wws||Cd##E !,,_== tLr7   c                     | dS | j         j                            d          rdS t          | pd                                          S )Nr;   r  )r  r  r1   r0   r>   rx   s    r5   _safe_text_valuer    sJ    }r!,,_== ru{!!###r7   r  r  c                &   |rdnd}	 t          | d          pg }|r|d         nd}t          |d          }t          t          |d                    }|r|dfS t          t          |d                                                    }t          t          |d	                    p9t          t          |d
                    pt          t          |d                    }|rdd| fS |dk    rdd| fS dd| fS # t          $ r
 dd| fcY S w xY w)zBReturn (content, empty_status) from an OpenAI-compatible response._auxr;   choicesr   Nr9   r   finish_reason	reasoningry  thinkingr  lengthr  	llm_empty)r  r  r?   r^   )	respr  suffixr  choicer9   r   r  r  s	            r5   _extract_title_responser    sm   "VVF(!$	228b&0D!&)44"?7I#F#FGG 	B;()Q)QRRXXZZ_WkBBCC F9L M MNNF D DEE 	  	65V5555H$$,F,,,,'v'''' ( ( ('v''''''(s%   AC< BC< (C< 5C< <DDc                 :   | r|sdS t          | |          \  }}t                      }t          |p|p|          }|p|                    dd          pd}t	          |                                                                          dk    rd}|p|                    dd          pd}|p|                    dd          pd}d}	|s7t	          |                    dd          pd                                          }	t          |||          }
dd	d
ii}t          |||          rd|d<   	 t                      }ddl
m} d}t          |          D ]\  }}d|dd|dg}|
g}	 t          |          D ]\  }} |d|pd|pd|pd|	pd||d||
  
        }t          |d          \  }}|r||dk    r|dk    rdndfc c S |pd}|dk    r3t          |          r$|                    t!          |||                     n8# t"          $ r+}d}t$                              d|dz   |           Y d}~nd}~ww xY wt)          |          rt$                              d|            nd|fS # t"          $ r&}t$                              d|           Y d}~dS d}~ww xY w) z2Return (raw_text, status) via auxiliary LLM route.Nmissing_exchanger  r;   r  r  r  api_keyr  enabledFTreasoning_splitr   )call_llmllm_error_auxr   r   r   r  Ng?)
taskr  r  r  r  r   
max_tokenstemperaturer[   
extra_bodyr  llm_auxllm_aux_retryllm_empty_auxz*Aux title generation attempt %s failed: %sr   zIAux title generation short-circuiting after %s (reasoning-only response).zAux title generation failed: %s)Nr  )r  r  r  r\   r0   r>   r?   r  r  r  r  r  	enumerater  r  rr   r  r^   r   r   r  )rf  r}  r  r  r  r  r  
configuredcaller_supplied_router  base_max_tokensreasoning_extra_timeoutr  last_statusidxpromptr   budgets
budget_idxr  r  r`   empty_statuses                            r5   generate_title_raw_via_auxr    s     (N ('' N;;KB&((J !>U!>h???:>>*b99?RH
8}}""$$..6Z^^GR006BE?:>>*b99?RHG  CjnnY339r::@@BB.xIIO"Y$67O5(33 2-1)*-%%''333333%$W-- %	 %	KC!f55B//H ''GW.7.@.@ b b*J
#8/!)!1T#mt!)!1T '4!)#-$' (#2  D )@$(O(O(O%C e"#((zQYYTcdddddd"."A/K!Q+>{+K+K'EhPUW_'`'`aaa%b&  W W W-I3QR7TUVVVVVVVVW 5[AA _    [   % % %6:::$$$$$$%sO   +8I* $AH >I* >H ?I*  
H5
!H0+I* 0H554I* *
J4JJc                    |r|sdS | dS t          ||          \  }}t          t          | dd          t          | dd          t          | dd                    }dd	i}t          | d
d          }	 || _        t	          |          D ]\  }}	d|	dd|dg}
|g}	 d}t	          |          D ]\  }}d}d}t          | dd          dk    rt|                     |
          }|                    dd           d|v r||d<   |                     |          }|                     |          \  }}|r	|j	        pdnd}|sd}nt          | dd          dk    rddl
m}m}  || j        |
d||t          | dd	          |                                 t          | dd                    }|                     |          } ||t          | dd	                    \  }}|r	|j	        pdnd}|sd}n|                     |
          }|                    dd           d|d<   d|d<   t!          t          | dd          t          | dd          t          | dd                    r.t#          |                    d          pi           }d|d <   ||d<   d!|v r||d!<   n||d"<    |                     d#$          j        j        j        d-i |}t/          |          \  }}t1          |pd                                          }|r||dk    r|dk    rd%nd&fc c || _        S |pd}|dk    r`t5          |          rQ|                    t9          t          | dd          t          | dd          t          | dd                               nX# t:          $ rK}d'}t<                              d(|d)z   t          | dd          t          | dd          |           Y d}~nd}~ww xY wtA          |          rt<                              d*|            nd|f|| _        S # t:          $ r-}t<                              d+|           Y d}~|| _        d,S d}~ww xY w# || _        w xY w).z1Return (raw_text, status) via active-agent route.r  N)Nmissing_agentr  r;   r  r  r  Freasoning_configr   r   r   r  api_modecodex_responsestoolsmax_output_tokensanthropic_messagesr   )build_anthropic_kwargsnormalize_anthropic_response_is_anthropic_oauth_anthropic_base_url)r  r   r  r  r  is_oauthpreserve_dotsr  )strip_tool_prefixr   r  r  r[   r  Tr  max_completion_tokensr  r  r  llm	llm_retry	llm_errorzGAgent title generation attempt %s failed: provider=%s model=%s error=%sr   zKAgent title generation short-circuiting after %s (reasoning-only response).z!Agent title generation failed: %s)Nr  r   )!r  r  r  r  r  _build_api_kwargspop_run_codex_stream_normalize_codex_responser   agent.anthropic_adapterr  r  r  _anthropic_preserve_dots_anthropic_messages_creater  rq   r\   _ensure_primary_openai_clientchatcompletionscreater  r0   r>   r  rr   r  r^   r   r   r  )rf  rf  r}  r  r  r  disabled_reasoningprev_reasoningr  r  api_messagesr  r  r  r  r`   r  codex_kwargsr  assistant_message_r  r  
ant_kwargs
api_kwargsr  r  s                              r5   generate_title_raw_via_agentr  d  s    (N (''}$$ N;;KB.z2&&w##z2&& O
 $U+U$6==N\0!3$W-- T	 T	KC!f55B//L ''GE).7.@.@ : :*J
C#%Luj"559JJJ','>'>|'L'L$(($777.,>>@JL)<=$66|DD/4/N/Nt/T/T,)1CT\08>BZ\" 7+6L 
B77;OOOpppppppp%;%;"'+%1"&'1-?%,U4I5%Q%Q*/*H*H*J*J%,U4I4%P%P	& 	& 	&
  %??
KK/K/K GECXZ_4`4`0 0 0,)1 DU\08>BZ\" 7+6L%*%<%<\%J%J
"w55547
=104
9-,WUJ-K-KWUZ\cegMhMhjqrw  zD  FH  kI  kI  J  J B)-jnn\.J.J.Pb)Q)QJ<@J'897AJ|42j@@BLJ'>??7AJ|4uuBBJ\B]]bnu    (    -DD,I,I)\ciR....00C ]"cQhh:??UUP[\\\\\> "0= #/"=+K!Q+>{+K+K'E#E:r::#E7B77#E:r::( (   m:v    )]!GE:t44E7D11        5[AA a    [ 
 "0	  ! ! !8!<<<    !/	! "0////sc   2)P I4NP A,NP 
OAOP O4P 
Q"Q
=Q 
QQ 	Qc                     t          | ||          \  }}|sd|dfS t          |          }|r||dfS ddt          |          dd         fS )zGGenerate a title via active-agent route, then sanitize/validate result.Nr;   llm_invalidrW   )r  rD  r0   )rf  rf  r}  r`   r   titles         r5   %_generate_llm_session_title_for_agentr     si    .uiPPKC  VR%c**E !fb  C#..r7   )use_agent_modelr  c                   |r6|r4t          |dd          }t          |dd          }t          |dd          }nd}d}d}t          | ||||          \  }}|sd|dfS t          |          }	|	r|	|dfS ddt          |          dd         fS )	a  Generate a title via dedicated auxiliary LLM route, then sanitize/validate result.

    When use_agent_model is False (default), the auxiliary client resolves
    provider/model/base_url from config.yaml auxiliary.title_generation, which
    prevents the session's chat model (e.g. a Chinese model) from overriding
    the dedicated title model.  When True, the agent's attrs are passed through
    (legacy fallback behaviour).
    r  r;   r  r  r  Nllm_invalid_auxrW   )r  r  rD  r0   )
rf  r}  rf  r  r  r  r  r`   r   r  s
             r5   #_generate_llm_session_title_via_auxr    s      5 5*b11w++5*b11,  KC   VR%c**E !fb  "CHHTcTN22r7   r  r  raw_previewc           
          ||d}|r||d<   |r||d<   |r||d<    | d|           t                               d|||pd|pd|pdd d	                    d S )
N)rj   r   r  r  r  title_statuszCtitle_status session=%s status=%s reason=%s title=%r raw_preview=%r-r;   rW   )r   info)	put_eventrj   r   r  r  r  r   s          r5   _put_title_statusr    s    '6::G #" !  -!,Ing&&&
KKM#		DSD!    r7   c                 z   | pd                                 } t          |pd                                           }| sdS t          |           } t          j        dd|                                            } t          j        dd|                                           }|  d|                                                                  |  d|                                  }dt          dt          fd}dt          dt          fd} ||          }|r ||          s<t          fd	d
D                       rdS t          fddD                       rdS dS t          fdd
D                       r| dS t          fddD                       r| dS | dS t          fddD                       r:t          fddD                       rt          fddD                       rdS dS t          fddD                       rt          fdd D                       rd!S t          fd"d#D                       rt          fd$d%D                       rd&S t          j	        d'|           d(                                          }|sdS h d)}d*}t          j
        d+| d,| d-|          }	|	sdS g }
|	D ]\}|                                }||v st          |          d.k     r.||
vr|
                    |           t          |
          d/k    r n]|
rd                    |
          dd0         S dS )1zIGenerate a readable local fallback title when LLM title generation fails.r;   Nr1  r   r   r,   c                 J    t          t          j        d| pd                    S )Nz[A-Za-z]r;   )r  r2  rF  r   s    r5   _contains_latinz6_fallback_title_from_exchange.<locals>._contains_latin  s     BIk4:266777r7   c                    t          j        d|           }|r)|                    d          pd                                S t          j        d|           }|r)|                    d          pd                                S dS )Nz"([^"\n]{2,24})"r   r;   u   “([^”\n]{2,24})”)r2  rF  groupr>   )r   rA   s     r5   _extract_named_topicz;_fallback_title_from_exchange.<locals>._extract_named_topic  s}    I)400 	.GGAJJ$"++---I/66 	.GGAJJ$"++---rr7   c              3       K   | ]}|v V  	d S r~   r   r   r@   combineds     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>+  s'      ||Q1=||||||r7   )rU  schedule
efficiencymanagefitnesssingingcalligraphyzTime management discussionc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>-  s'      DDQ1=DDDDDDr7   )re  codexaizAI productivity discussionzConversation topicc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>0  s'      xxqH}xxxxxxr7   z time managementc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>2  s'      @@qH}@@@@@@r7   z AI productivityz discussionc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>6  s'      
=
=Q1=
=
=
=
=
=
=r7   )r  zsession titlec              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>6  sH        FC  FCXYa8m  FC  FC  FC  FC  FC  FCr7   )summarysummarzshort titlec              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>7  s'      AAqH}AAAAAAr7   )testokzreply okzSession title auto-summary testzSession title auto-summaryc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>:  s'      
?
?Q1=
?
?
?
?
?
?r7   )rZ   clarificationc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr>:  s(      GrGrZ[XGrGrGrGrGrGrr7   )dialogcardzClarify dialog cardc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr><  s'      
<
<Q1=
<
<
<
<
<
<r7   )issuegithubprc              3       K   | ]}|v V  	d S r~   r   r  s     r5   r   z0_fallback_title_from_exchange.<locals>.<genexpr><  s(      DxDxWXQ(]DxDxDxDxDxDxr7   )triagebugreviewzGitHub Issue Triagez[.!?\n]r   >   thefromhereintojustneedr&  thatthisr   wantwithaboutcouldneedsreplytherer  wantswouldpleaseshouldr#  testingr   u   A-Za-z0-9À-ÖØ-öø-ÿ[z][z_./+-]*      <   )r>   r7  rY  r2  r   r?   r0   r  r   r   findallr   rr   rs   )rf  r}  combined_rawr  r  
topic_namer  stop_en
latin_wordtokenspickedtok	lower_tokr  s                @r5   _fallback_title_from_exchangerV    s   b''))I+N,@bAAGGIIN t'	22IvsI..4466IVFC88>>@@N..n..4466<<>>H22.2288::L8c 8d 8 8 8 83 3     &%l33J *z** 	(||||*{||||| 433DDDD*CDDDDD 433''xxxx&wxxxxx 	3 2222@@@@&?@@@@@ 	3 2222))))

=
=
=
="<
=
=
=== ,#  FC  FC  FC  FC  ^B  FC  FC  FC  CC  CC ,AAAA&@AAAAA 	544++

?
?
?
?">
?
?
??? %CGrGrGrGr_qGrGrGrDrDr %$$

<
<
<
<";
<
<
<<< %DxDxDxDx\wDxDxDxAxAx %$$8J	**1-3355D t  G -JZ>Z>>:>>>EEF $##F  IIKK	3y>>A#5#5fMM#v;;!E   %xx$$r7   c                 p    t          | pd                                                                          dv S )zMReturn True for low-information fallback labels that should not be persisted.r;   >   conversation topicr=   )r  s    r5   _is_generic_fallback_titlerY  `  s2    u{!!##))++/EEEr7   placeholder_titlec           	         	 	 t          |           }n1# t          $ r$ t          || dd           Y  |dd| i           dS w xY wt          |j                  }t          |dd          r:|s8t          || ddt          |j        pd	                     	  |dd| i           dS t          |j        pd	                                          }||k    p|d
v pt          ||j	                  p|}	|	s$t          || dd|           	  |dd| i           dS ddl
m}
 |
                    |dt                    5  t                      }|r5|s3t          |||          \  }}}|s|dv rt!          |||d          \  }}}n1t!          ||          \  }}}|s|r|dv rt          |||          \  }}}|}|s]t#          ||          }|r.t%          |          st                              d           |}d}n|rt                              d|           ddd           n# 1 swxY w Y   |dk    r|rd| nd}d}|}|rt)          |           5  t*          5  t-          j        | |          }t          |j        pd	                                          }t          |j                  }||k    p|d
v pt          ||j	                  p|}	ddd           n# 1 swxY w Y   |	s/t          || dd|           	 ddd            |dd| i           dS ||k    r-||_        d|_        |                    d           |j        }d}ddd           n# 1 swxY w Y   |r?|dk    rt          || ||||           nt          || ||||            |d| |d           nt          || d|pd||            |dd| i           dS #  |dd| i           w xY w)zFGenerate and publish a better title after `done`, then end the stream.skippedmissing_session
stream_endrj   Nllm_title_generatedFalready_generatedr;   )UntitledNew Chatr;   manual_titler   profilesbackground titlelogger_overrider  r  Trf  r  r  r  z1Using local fallback for session title generationfallbackz@Skipping generic local fallback for session title generation: %rzlocal_summary:local_summarytouch_updated_atr  rj   r  	unchanged)rs  KeyErrorr  rC  r  r  r0   r>   r|  r   apire  !profile_env_for_background_workerr   r  r   r  rV  rY  r   r   r   r   r\   r_  r`  )rj   rf  r}  rZ  r
  rf  r6  _invalid_existingr{  
still_autoprofiles_apiaux_title_configured
next_title
llm_statusr  rh   fallback_titlefallback_reasonwrote_titleeffective_titleinvalid_existing_nows                        r5   _run_background_title_updater  e  sG   Q<	J''AA 	 	 	iY@QRRRX 		,z :;;;;;]	 ;17CC1+U33 	<M 	iY@SUXYZY`YfdfUgUghhhN 		,z :;;;;;M agm$$**,,(( !66!$Waj99! !	 	  	iYPWXXXz 		,z :;;;;;y 	100000;;A?Qci;jj 	u 	u#8#:#:  B1 B6[\acln|6}6}3
J! \j4P&P&P:]^giw  @E  W[  ;\  ;\  ;\7J
K6YZces6t6t3
J! Be B
>b0b0b:_`egp  sA  ;B  ;B7J
KF u!>y.!Y!Y! u*D^*T*T uLL!TUUU!/J'FF# uLL!cesttt%	u 	u 	u 	u 	u 	u 	u 	u 	u 	u 	u 	u 	u 	u 	u* ##
# *Z)))  	
 ! 	'(44 ' ' 	 	 Z33A&)!'-R&8&8&>&>&@&@O+I!'+R+R('+<< 0*.JJ00!*MM0 0	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 " %iYXghhh' ' ' ' ' '> 		,z :;;;;;# 00(AG,0A)FFEF222&'gO"&K)' ' ' ' ' ' ' ' ' ' ' ' ' ' ',  	u##!)ZRacnoooo!)Z_^ijjjIgj?SSTTTTiY@U+Wfhsttt	,z :;;;;;		,z :;;;;s    N= AN=  AAN= #AN= #N= 5CHN= HN=  H!(N= 	MA3KMK	MK	M1N= 3M?N= MN= MAN= =Oc                 z   	 	 t          |           }n# t          $ r Y dS w xY wt          |j        pd                                          }||k    rt          || dd|           dS |r|dv rdS ddlm} |                    |dt          	          5  t                      }	|r5|	s3t          |||          \  }
}}|
s|d
v rt          |||d          \  }
}}n1t          ||          \  }
}}|
s|r|dv rt          |||          \  }
}}ddd           n# 1 swxY w Y   |
st          || d|pd||           dS t          j        dd|                                                                          }t          j        dd|
                                                                          }||k    rt          || dd||           dS t!          |           5  t"          5  t%          j        | |          }t          |j        pd                                          |k    rRt          || ddt          |j        pd                                                     	 ddd           ddd           dS |
|_        d|_        |j        }ddd           n# 1 swxY w Y   |                    d           ddd           n# 1 swxY w Y   t          || d|||            |d| |d           t                              d| |           dS # t.          $ r! t                              d| d           Y dS w xY w)uR  Refresh an existing LLM-generated title using the latest exchange text.

    Unlike _run_background_title_update, this does NOT guard on
    llm_title_generated — it assumes the title was already LLM-generated
    and the session has progressed enough to warrant a refresh.
    It does NOT emit stream_end (the caller already did).
    Nr;   r\  rc  ra  rb  r   rd  rf  rg  ri  Trj  rk  refresh_skippedemptyr1  r   
same_titleFrn  	refreshedr  rp  z/Adaptive title refresh: session=%s new_title=%rz.Background title refresh failed for session %sr   )rs  rr  r0   r  r>   r  rs  re  rt  r   r  r   r  r2  r   r?   r   r   r   r\   r_  r`  r	  r^   r   )rj   rf  r}  rw  r
  rf  r6  	effectiverw  rx  ry  rz  r  normalized_currentnormalized_newr~  s                   r5   _run_background_title_refreshr    s   4b	J''AA 	 	 	FF	 2&&,,..	%%iYPYZZZF 	I)AAAF000000;;A?Qci;jj 		B 		B#8#:#:  B1 B6[\acln|6}6}3
J! \j4P&P&P:]^giw  @E  W[  ;\  ;\  ;\7J
K6YZces6t6t3
J! Be B
>b0b0b:_`egp  sA  ;B  ;B7J
K		B 		B 		B 		B 		B 		B 		B 		B 		B 		B 		B 		B 		B 		B 		B  	i5F
H]V]_hjuvvvFVFC;;AACCIIKKZ88>>@@FFHH//i5FV_almmmF$Z00 	+ 	+ * *LQ//qw}"%%++-->>%iYX[\]\c\igiXjXjXpXpXrXrsss* * * * * *	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ %(,%"#'* * * * * * * * * * * * * * * FFEF***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	)Zj/[fggg	'*OOPPPEzSbccccc b b bEz\`aaaaaabs    L 
!L !AL 'L /#L A7D	L DL DL :BL 
L K!A<JK(L 5J
KJ	KJ	K7L KL 
KAL 'L:9L:old_sidc                    t           | dz  }|                                sdS 	 |                    d          }	 t          j        |          }t          |                    d          pg           }t          |                    d                    }n # t          j        t          f$ r d}d}Y nw xY wt          | j
                  |k    rD| j        }t          t          | dd                    }|| _        d	| _        t          | d
d          }	t          | dd          }
t          t          | dg           pg           }t          | dd          }d| _        d| _        g | _        d| _        	 |                     dd           t(                              d|t          | j
                             || _        || _        |	| _        |
| _        || _        || _        n/# || _        || _        |	| _        |
| _        || _        || _        w xY wdS ddlm} |                    |          }|rWd	|_        d|_        d|_        g |_        d|_        |                    dd           t(                              d|           dS dS # t2          $ r t(                              d           Y dS t6          $ r  t(                              dd	           Y dS w xY w)a*  Persist old_sid as a read-only pre-compression snapshot.

    Context compression rotates the active WebUI session id from old_sid to the
    agent's new continuation id. The old JSON must remain on disk for lineage
    traversal, but it should not continue to appear as an active sidebar row.
    .jsonNr   r   r   pre_compression_snapshotFTrQ  rR  rS  rT  ro  
skip_indexz:Preserved pre-compression session %s (%d messages) to diskr   )Sessionz<Marked pre-compression session %s as sidebar-hidden snapshotz3Could not read old session file before preservationz/Failed to preserve pre-compression session filer   )r   r   r   r   r   r   r\   r  JSONDecodeErrorr  r   rj   r  r  r   rQ  rR  rS  rT  r`  r   r	  
api.modelsr  loadr  r   r^   )r6  r  old_pathexisting_textexistingexisting_msgsexisting_snapshot	saved_sidsaved_snapshotsaved_active_stream_idsaved_pending_user_messagesaved_pending_attachmentssaved_pending_started_atr  snapshots                  r5   "_preserve_pre_compression_snapshotr    s_    ....H?? MW **G*<<		&z-00HZ 8 8 >B??M $X\\2L%M%M N N$j1 	& 	& 	& M %	& qz??]** I!'!-G"O"OPPN"AL)-A& &-Q0BD%I%I")04JD)Q)Q&(,WQ8Mr-R-R-XVX(Y(Y%'.q2F'M'M$!%A%)A"$&A!#'A @
 %@@@PS__  
  )-;*%;")C&(A%'?$$  )-;*%;")C&(A%'?$????F 	'&&&&&<<(( 	04H- )-H%,0H)+-H(*.H'MM5UMCCCKKN    	 	$  L L LJKKKKKK W W WFQUVVVVVVWs\   J
 AB J
 B41J
 3B44B>J
 3AG# 8+J
 #,HJ
 A2J
 
$K1%KKc           	         t                      }|dk    rdS t          | j        pd                                          }|r|dv rdS t	          | dd          sdS t          | j                  }|dk    s	||z  dk    rdS t          | j                  \  }}|s|sdS t          j	        t          | j        |||||fd                                           dS )	zJCheck if the session is due for an adaptive title refresh and schedule it.r   Nr;   r  r_  FTtargetargsdaemon)rv  r0   r  r>   r  rn  r   rj  	threadingThreadr  rj   start)r  r
  rf  refresh_intervalrw  exchange_countlast_ulast_as           r5   _maybe_schedule_title_refreshr  T  s   2441+,,2244M M-EEE71599 %g&677Nn/??1DD.w/?@@NFF & , &&-ER   egggggr7   c                    t          | t                    s| S g }| D ]]}t          |t                    s|                    d          dk    sd|v r6|                    t          j        |                     ^|sdS t          |          dk    rI|d                             d          dk    r*t          |d                             d          pd          S |S )a  Return provider-safe content with native image parts removed.

    Text-only provider endpoints (for example DeepSeek/OpenAI-compatible text
    models) reject historical OpenAI-style ``image_url`` parts before the agent
    can recover.  When WebUI is configured for text-mode image handling, preserve
    textual content from mixed content arrays and drop only the native image
    blocks from replayed history.
    r  r  r;   r   r   r   )	r/   r   rq   r\   rr   copydeepcopyr   r0   )r   clean_partsr   s      r5   &_strip_native_image_parts_from_contentr  k  s     gt$$ K 0 0$%% 	88F{**kT.A.A4=..//// r
;1Q!3!3F!;!;v!E!E;q>%%f--3444r7   c                 $   t          | t                    r| sdS d}| D ]}t          |t                    s|                    d          }|dv re|                    d          p+|                    d          p|                    d          pd}t	          |                                          rd}|dk    rNt	          |                    d          p|                    d	          pd                                          r dS |d
vr dS |S )NFr  >   r  r  r  r  r   r;   Tr   >   r   r  r  )r/   r   rq   r\   r0   r>   )r   saw_reasoningr   	part_typer   s        r5   !_content_has_reasoning_only_partsr    s+   gt$$ G uM  $%% 	HHV$$	11188J''Z488K+@+@ZDHHVDTDTZXZD4yy   % $3txx'7'7'T488I;N;N'TRT#U#U#[#[#]#]55===55 >r7   c                    t          | t                    r|                     d          dk    rdS |                     d          rdS |                     dd          }t          |                                          rdS t          |                     d          p|                     d          pd                                          rd	S t          |          S )
a&  Return True for display-only assistant Thinking entries.

    These entries keep partial Thinking cards visible after reload/cancel, but
    they are not API-safe history: providers only see a blank assistant turn.
    Visible assistant replies that also carry reasoning metadata are kept.
    r   r   Frw  r   r;   r  ry  T)r/   rq   r\   rK  r>   r0   r  )r?  r   s     r5   $_is_reasoning_only_assistant_messager    s     c4   CGGFOO{$B$Bu
ww| uggi$$GW##%% u
377;E377+>#?#?E2FFLLNN t,W555r7   c                   |duot          |          dk    }t                      }| D ]}t          |t                    s|                    d          dk    rr|                    d          pg D ]Z}t          |t                    rC|                    d          p|                    d          pd}|r|                    |           [g }| D ]7}t          |t                    st          |          r)|                    d	          r?|                    d
          r7t          |                    d          pd                                          s|                    d          }|dk    r|                    d          pd}|r||vrd |	                                D             }	|r)d|	v r%t          |	                    d                    |	d<   |	                    d          r|                    |	           9|S )a  Return a deep copy of messages with only API-safe fields.

    The webui stores extra metadata on messages (attachments, timestamp, _ts)
    for display purposes. Some providers (e.g. Z.AI/GLM) reject unknown fields
    instead of ignoring them, causing HTTP 400 errors on subsequent messages.

    Also strips orphaned tool-role messages whose tool_call_id cannot be linked
    to a preceding assistant message with tool_calls. Strictly-conformant providers
    (Mercury-2/Inception, newer OpenAI models) reject histories containing dangling
    tool results with a 400 error: "Message has tool role, but there was no previous
    assistant message with a tool call."

    If ``agent.image_input_mode`` resolves to ``text``, native historical
    ``image_url`` content parts are stripped too.  Current-turn uploads already
    respect text mode in ``_build_native_multimodal_message``; this closes the
    remaining replay gap where an older native image in the saved transcript kept
    causing 400s on every later text-only turn (#2297).
    Nr   r   r   rw  idcall_idr;   rL  _partialr   toolrx  c                 ,    i | ]\  }}|t           v ||S r   _API_SAFE_MSG_KEYSr   r@   vs      r5   
<dictcomp>z._sanitize_messages_for_api.<locals>.<dictcomp>  )    MMMdaQ:L5L5LQ5L5L5Lr7   )r  setr/   rq   r\   r  r  r0   r>   r  r  rr   )
r   r_   strip_native_imagesvalid_tool_call_idsr?  tctidr   r   	sanitizeds
             r5   _sanitize_messages_for_apir    s5   & T/V.G.L.LPV.V  #uu 5 5#t$$ 	776??k))ggl++1r 5 5b$'' 5&&,,A"&&*;*;ArC 5+//444 E $ $#t$$ 	 044 	778 	 77: 	s3779+=+=+C'D'D'J'J'L'L 	wwv6>>''.))/RC #%888MMciikkMMM	 	d9	#9#9#I)--XaJbJb#c#cIi ==   	$LL###Lr7   c                    t                      }| D ]}t          |t                    s|                    d          dk    rr|                    d          pg D ]Z}t          |t                    rC|                    d          p|                    d          pd}|r|                    |           [g }t          |           D ]\  }}t          |t                    st          |          r,|                    d          rB|                    d          r7t          |                    d	          pd                                          s|                    d          }|d
k    r|                    d          pd}|r||vrd |	                                D             }|                    d          r|
                    ||f           |S )zCReturn [(original_index, sanitized_message)] for API-safe messages.r   r   rw  r  r  r;   rL  r  r   r  rx  c                 ,    i | ]\  }}|t           v ||S r   r  r  s      r5   r  z/_api_safe_message_positions.<locals>.<dictcomp>
	  r  r7   )r  r/   rq   r\   r  r  r  r0   r>   r  rr   )	r   r  r?  r  r  outr  r   r  s	            r5   _api_safe_message_positionsr    s   "uu 5 5#t$$ 	776??k))ggl++1r 5 5b$'' 5&&,,A"&&*;*;ArC 5+//444
Ch'' ) )S#t$$ 	/44 	778 	77: 	s3779+=+=+C'D'D'J'J'L'L 	wwv6>>''.))/RC #%888MMciikkMMM	==   	)JJY'(((Jr7   c                     | s| S t                      }g }| D ]D}t          |          }|||v r||                    |           |                    |           E|S )zRemove duplicate messages from context by identity, keeping first occurrence.

    Prevents the agent from seeing the same message twice in conversation_history
    when result_messages contain duplicates that weren't caught by display-merge.
    )r  _message_identityr  rr   )r   seendedupedr?  rv   s        r5   _deduplicate_context_messagesr  	  sy      55DG  $$?sd{{?HHSMMMsNr7   c                 B   | r|s|S t          |          }t          |           }d }d}|t          |          k     ra||         \  }}| |         }|t          |          k     r||         nd}t          |t                    rt          |t                    r ||           ||          k    r|                    d          dk    r5|                    d          r |                    d          s|d         |d<   |                    d          r!|                    d          s|d         |d<   nJ|                    d          r5|                    d          s |                    d          s|d         |d<   |d	z  }\|d	z  }|t          |          k     a|S )
ar  Carry forward display-only metadata lost during API-safe history sanitization.

    The provider-facing history strips WebUI-only fields like `reasoning`. When the
    agent returns its new full message history, prior assistant messages come back
    without that metadata unless we merge it back in by API-history position.

    This also preserves existing timestamps for unchanged historical messages.
    Without that, older turns that come back from the agent without `_ts` /
    `timestamp` can be re-stamped with the current time on every new assistant
    response, making prior messages appear to "move" in time.
    c                 r     t           t                    sd S  fd                                 D             S )Nc                 X    i | ]&\  }}|t           v                     d           #||'S )r   )r  r\   )r   r@   r  r?  s      r5   r  zI_restore_reasoning_metadata.<locals>._safe_projection.<locals>.<dictcomp>8	  s:    \\\A5G0G0GCGGTZOO0G10G0G0Gr7   )r/   rq   r  r?  s   `r5   _safe_projectionz5_restore_reasoning_metadata.<locals>._safe_projection5	  s<    #t$$ 	4\\\\\\\\r7   r   Nr   r   r  rO  _tsr   )r   r  r   r/   rq   r\   )	previous_messagesupdated_messages	prev_safer  safe_posprev_idxr  prev_msgcur_msgs	            r5   _restore_reasoning_metadatar  $	  s      $4  ,--+,=>>I] ] ]
 H
S^^
#
#)!$X.083?O;P;P0P0P"8,,VZh%% 	*Wd*C*C 	HXHXYaHbHbfvfvw~ffHH||F##{22x||K7P7P2Y`YdYdepYqYq2'/'<$||K(( 1[1I1I 1'/'<$$e$$ 1W[[-?-? 1T_H`H` 1!)%MHA S^^
#
#" r7   c                    t          | |          }| r|s|S t          |           }d |D             }d}t          |           D ]\  }|v st          |          st	          fd|D                       |z   }|t          |          k     r||         nd}t          |t                    rt          |          ry|                    |t          j
        |                     |dz  }|S )zFRestore display-only thinking rows for visible transcript persistence.c                     h | ]\  }}|S r   r   )r   r  r  s      r5   r  z6_restore_display_reasoning_metadata.<locals>.<setcomp>U	  s    000FCC000r7   r   c              3   .   K   | ]\  }}|k     d V  dS )r   Nr   )r   r  r  r  s      r5   r   z6_restore_display_reasoning_metadata.<locals>.<genexpr>Z	  s+      CCVS!C(NNqNNNNCCr7   Nr   )r  r  r  r  sumr   r/   rq   insertr  r  )	r  r  r  safe_indicesinserted_reasoning_onlyr  r  r  r  s	           @r5   #_restore_display_reasoning_metadatar  O	  s1   23DFVWW  $4  +,=>>I00i000L'(9:: % %(|##+OPX+Y+Y#CCCCyCCCCCF]]19C@P<Q<Q1Q1Q#H--W[h%% 	*Nx*X*X 	$-*A*ABBB1$r7   c                 h    t          | dd          }t          |t                    r|r|S | j        pg S )zJReturn model-facing history without assuming it matches the UI transcript.context_messagesN)r  r/   r   r   )r  r  s     r5   _session_context_messagesr  c	  sD    w(:DAA"D))  .>  !r!r7   c                 F   t          | t                    sd S t          |                     d          pd          }|                     dd          }t	          |          }|dk    rt          |d          }|s|                     d          s|                     d          sq|                     d	          rZd
                    t          |                     d          pd                                                    d d         }|ddd|z   fS d S |d
                    t          |pd                                                    d d         t          |                     d          pd          t          j	        |                     d          pg dd          fS )Nr   r;   r   r   TrS  rx  rw  r  r   r     __partial__rd  F	sort_keysensure_ascii)
r/   rq   r0   r\   rK  rY  rs   r   r   dumps)r?  r   r   r   reasoning_keys        r5   r  r  k	  s   c4   tswwv$"%%Dggi$$G!!Dv~~
 'tDAAA // 8M8M  77: 	HHS)=)=)C%D%D%J%J%L%LMMdsdSM-	  tTZR&&(())$3$/CGGN##)r**
377<((.B$USSS	 r7   c                     t          | pg           t          |pg           k     rdS t          |pg           D ]0\  }}t          | pg |                   t          |          k    r dS 1dS )NFT)r   r  r  )r   prefixr  expecteds       r5   _messages_have_prefixr  	  s    
8>rS2....u"6<R00  Xhn"c2337H7R7RRR55 S4r7   c                    t          |           }||S t          | t                    sdS t          |                     d          pd          t          |                     dd                    t          |                     d          pd          t          j        |                     d          pg dd	          fS )
zAReturn a stable comparison key for replay/overlap de-duplication.Nr   r;   r   rx  rw  TFr  )r  r/   rq   r0   r\   rK  r   r  )r?  identitys     r5   _message_replay_keyr  	  s     %%Hc4   tCGGFOO!r""cggi,,--CGGN##)r**
377<((.B$USSS	 r7   c                 <   t          | pg           } t          |pg           }t          t          |           t          |                    }t          |dd          D ]=}d | | d         D             }d |d|         D             }||k    r||d         c S >|S )a  Drop a candidate prefix that is already the suffix of existing_messages.

    Compression/continuation can replay the active tail from state.db after the
    previous WebUI context/display already contains it. Prefix-only merge logic
    then treats that replayed tail as a fresh delta and duplicates a whole turn.
    Strip the largest exact suffix/prefix overlap before appending.
    r   r  c                 ,    g | ]}t          |          S r   r  r   s     r5   r   z*_strip_replayed_prefix.<locals>.<listcomp>	  s!    MMM1#A&&MMMr7   Nc                 ,    g | ]}t          |          S r   r  r   s     r5   r   z*_strip_replayed_prefix.<locals>.<listcomp>	  s!    FFFA$Q''FFFr7   )r   r   r   range)existing_messagesr   max_overlapoverlapleftrights         r5   _strip_replayed_prefixr	  	  s     .4"55j&B''Jc+,,c*oo>>Ka,, ( (MM0A7())0LMMMFFHWH1EFFF5==ghh'''' r7   c                    t          | t                    rt          |t                    sdS |                     d          |                    d          k    rdS d                    t	          |                     dd                                                              }d                    t	          |                    dd                                                              }t          |          dk     st          |          dk     rdS d}|                    |          r|                    |          sdS |dd	         |dd	         k    S )
a%  Return True for repeated LCM/session summaries with refreshed hints.

    LCM summary cards can be re-injected with the same long recovered context
    and a different tail such as an expand hint. Exact identity misses those,
    but appending both copies bloats every later model prompt.
    Fr   r   r   r;   i  z[Session Arc SummaryNi  )r/   rq   r\   rs   rK  r   r   r1   )previous_msgcandidate_msgprevious_textcandidate_textmarkers        r5   (_looks_like_replayed_session_arc_summaryr  	  s>    lD)) M41P1P u=#4#4V#<#<<<uHH]<+;+;Ir+J+JKKQQSSTTMXXmM,=,=i,L,LMMSSUUVVN
=D  C$7$7$$>$>u#F##F++ >3L3LV3T3T u$>%4%#888r7   c                    t          | pg           } t          |pg           }| r|s|S d | D             }d |D             }d | D             }g }d}d}|t          |          k     r||         t          fd|D                       r|dz  }=d}t          t          |                    D ]}	d}
||
z   t          |          k     rw|	|
z   t          |          k     ra|||
z            ||	|
z            k    rI|
dz  }
||
z   t          |          k     r.|	|
z   t          |          k     r|||
z            ||	|
z            k    I|
|k    r|
}||k    r||z  }|                               |dz  }|t          |          k     |S )zDDrop replayed non-adjacent context blocks before persisting context.c                 ,    g | ]}t          |          S r   r  r   s     r5   r   z1_strip_replayed_context_items.<locals>.<listcomp>	  s!    GGG(++GGGr7   c                 ,    g | ]}t          |          S r   r  r   s     r5   r   z1_strip_replayed_context_items.<locals>.<listcomp>	  s!    AAA)!,,AAAr7   c                 <    g | ]}t          |t                    |S r   )r/   rq   r   s     r5   r   z1_strip_replayed_context_items.<locals>.<listcomp>	  s'    JJJAjD6I6IJaJJJr7   r   rJ  c              3   8   K   | ]}t          |          V  d S r~   )r  )r   prevr?  s     r5   r   z0_strip_replayed_context_items.<locals>.<genexpr>	  s.      ^^t7cBB^^^^^^r7   r   )r   r   r   r  rr   )r  r   existing_keyscandidate_keysexisting_largecleanedr  	min_blockbestr  r  r?  s              @r5   _strip_replayed_context_itemsr  	  s   .4"55j&B''J J GG5FGGGMAAjAAANJJ!2JJJNG
CI
J

o^^^^~^^^^^ 	1HC3}--.. 		 		EFfs>2222FNS%7%777"3<0M%&.4QQQ!	 fs>2222FNS%7%777"3<0M%&.4QQQ }}94KCsq- J

. Nr7   c                     t          | pg           } t          |pg           }| r|s|S t          ||           s|S |t          |           d         }t          | |          }|rt	          | |          }| |z   S )zAKeep model context append-only without replayed blocks/summaries.N)r   r  r   r	  r  )previous_contextresult_messagesr   s      r5   !_dedupe_replayed_context_messagesr!  	  s    ,233?0b11O ?  2BCC  %5!6!6!7!78J'(8*EEJ Q23CZPP
j((r7   c                 "    t          | |          S )zDKeep model context append-only without re-appending a replayed tail.)r!  )r  r   s     r5   _dedupe_replayed_active_contextr#  
  s    ,-=OOOr7   c                      t          |           S r~   )r!   r  s    r5   _is_context_compression_markerr%  
  s    (---r7   @  raw_textrS   c                     t          | t                    sdS |                                 }|sdS t          j        dd|                                          }t          |          |k    r|d|dz
            d}|S )z8Normalize a text blob used in compression summary cards.Nr1  r   ri  r2  )r/   r0   r>   r2  r   r   )r'  rS   txts      r5   _compact_summary_textr*  
  s    h$$ t
..

C t
&c
"
"
(
(
*
*C
3xx%[uqy[!&&&Jr7   c                    t          | t                    sd S t          |                     d          pd          }|r|dk    rd S |                     dd          }t	          |          }t          |          dk    r
|d d         }|                     d          p|                     d          }|                     d          }t          |t                    rt          |          nd	}|s|s|sd S ||||d
S )Nr   r;   r  r      r  rO  r%  r   )r   tsr   r%  )r/   rq   r0   r\   rK  r   r   )r9   r   r   r   r-  r%  attach_counts          r5   _compression_anchor_message_keyr/  
  s	   gt$$ tw{{6""(b))D 46>>tkk)R((G!!D
4yy3DSDz	U			7w{{;77B++m,,K'1+t'D'DK3{###!L  R tDNNNr7   c                     t          | pg           D ]P}t          |t                    st          |          s(t	          |                    d                    }|r|c S Qd S )Nr   )r=  r/   rq   r%  rK  r\   )r   rA   r   s      r5   "_compression_summary_from_messagesr1  /
  sy    hn"%%  !T"" 	-a00 	QUU9--.. 	KKK	4r7   c                    d                     t          |pd                                                    }d }t          | pg           D ]\  }}t	          |t
                    r|                    d          dk    r4|}t          ||          r|c S d                     t          t          |                    dd                    d                                                    }|r||v s||v r|c S |S )Nr   r;   r   r   r   TrS  )
rs   r0   r   r  r/   rq   r\   rb  rY  rK  )r   r  r\  rl  r  r?  r   s          r5   _find_current_user_turnr3  ;
  s   XXc(.b))//1122FHhn"--  S#t$$ 	6(A(A(h77 	JJJxx#cggi4455#   egg	
 
  	v~~JJJOr7   c                     t          | pg           }|s|S t          d|d          }|r#t          |d                   |k    r
|dd         S |S )zEReturn model history without an eager-checkpointed current user turn.r   r   r  N)r   r  )r   r  historycurrent_user_keys       r5   ,_drop_checkpointed_current_user_from_contextr7  O
  si    8>r""G (&X)N)NOO -gbk::>NNNss|Nr7   c                     ddl m} |                    | dt                    5  |                     d           ddd           dS # 1 swxY w Y   dS )zCPersist a streaming checkpoint under the session's profile context.r   rd  zstreaming checkpointrg  T)r  N)rs  re  rt  r   r`  )r  rw  s     r5   _save_streaming_checkpointr9  Z
  s    ,,,,,,		7	7 
8 
 
 & &
 	%%%& & & & & & & & & & & & & & & & & &s   AAAc                     t          t          | pd          d          } t          j        dd|                                                                           } |                     d          S )Nr;   TrS  r1  r   u    	
.!?。！？,，~～)rY  r0   r2  r   r>   r?   r  s    r5   _normalize_fresh_chat_textr;  f
  s\    "3tzr??4HHHD6&#t$$**,,2244D::3444r7   c                     t          |           rt                    dk    rdS d}t          fd|D                       rdS dv S )zGReturn True for short opener messages that should not resume old tasks.   F)continueresumezcarry onzgo onu   继续u   接着u   往下u	   下一步c              3       K   | ]}|v V  	d S r~   r   )r   termr   s     r5   r   z0_is_casual_fresh_chat_message.<locals>.<genexpr>
  s'      
7
7D44<
7
7
7
7
7
7r7   >      嗨   你好   哈喽   在么   在吗   您好hi therehello therehiheyhello)r;  r   r   )r  continuation_termsr   s     @r5   _is_casual_fresh_chat_messagerN  l
  sr    %h//D 3t99r>>u  
7
7
7
7$6
7
7
777 u   r7   c                     | pg D ]p}t          |t                    st          |                    dd                                                    }|sPd|vrd|vrYd|v sd|v sd|v sd|v sd	|v r d
S qdS )zJDetect compacted model context that tells the agent to resume an old task.r   r;   zcontext compactionzcontext compressionzactive taskzresume exactlyzcurrent taskztask list was preservedin_progressTF)r/   rq   rK  r\   r?   )r   r?  r   s      r5   "_has_task_resume_compaction_markerrQ  
  s    ~2  #t$$ 	SWWY3344::<< 	t++0ET0Q0QT!!4''%%(D00$$44 % 5r7   c                 f    t          | |          }t          |          rt          |          rg S |S )zGReturn provider-facing history for a new user turn from a message list.)r7  rN  rQ  )r   r  r5  s      r5   _new_turn_context_from_messagesrS  
  s<    :8XNNG$X.. 3UV]3^3^ 	Nr7   c                 <    t          t          |           |          S )a%  Return provider-facing history for a new user turn.

    Compacted agent sessions can carry a hidden "resume the active task" summary
    in context_messages. If the user starts a fresh casual greeting in that old
    session, do not feed that stale active-task summary back to the model.
    )rS  r  )r  r  s     r5   _context_messages_for_new_turnrU  
  s     ++DW+M+MxXXXr7   c                 J    t          |          ot          | dd          |k    S )a/  Return True only while a worker still owns the session writeback.

    cancel_stream() intentionally clears ``active_stream_id`` early so the UI can
    accept a follow-up turn while the old worker is unwinding. That old worker
    must not later persist its stale result over the newer transcript.
    rQ  N)r  r  )r  	stream_ids     r5   _stream_writeback_is_currentrX  
  s'     	??Vww0BDIIYVVr7   c                    t          | dd          rdS t          | dd          rdS t          | dd          rdS t          t          | dd          pg           }t          |          dk     rdS |d         }t          |t                    r|                    d	          sdS |                    d
          dk    rdS t          |                    d          pd          }d|vsd|vrdS d                    t          |pd                                                    }|sdS t          |dd                   D ]}t          |t                    s|                    d	          r.|                    d          dk    rHd                    t          |                    d          pd                                                    }||k    c S dS )a  Allow a finishing worker to replace its own stale-repair marker.

    The stale-pending repair path can occasionally run while the original worker
    is still alive but temporarily missing from the in-memory stream registry. It
    clears ``active_stream_id`` and appends a "Response interrupted" marker. If
    the original worker later finishes, treating ``active_stream_id is None`` as
    stale drops the real answer and leaves the misleading marker visible.

    This is intentionally narrow: only a session with no active/pending turn and
    whose last visible row is the recovery marker for this exact user prompt may
    be superseded. If a newer turn has appended anything after the marker, the
    normal stale-writeback guard still wins.
    rQ  NFrR  rS  r   r  r  rL  r  r  r   r;   r  zbefore this turn finishedr   r   r   )
r  r   r   r/   rq   r\   r0   rs   r   r=  )r  r  r   lastr   r  r?  actuals           r5   /_stream_writeback_can_supersede_recovery_markerr\  
  s    w*D11 uw.55 uw-t44 uGGZ66<"==H
8}}quB<DdD!! ();); uxx=((u$((9%%+,,GW,,0KSZ0Z0ZuxxHN++113344H u"&& " "#t$$ 	778 	776??f$$#cggi006B77==??@@!!!!5r7   c                    t          | pg           } t                      }g }t          |           D ]l}t          |t                    r@|                    d          r+t          |          }|||v rB|                    |           |                    |           mt          t          |                    }t          |          t          |           k     rTt                              dt          |           t          |          z
  t          |           t          |                     |} t          |pg           }t          |pg           }|s| S t          ||          r8|t          |          d         }	t          | |	          }	t          ||	          }	nHt          |          }
d |d|
|
nt          |                   D             }|

||
d         ng }||z   }	| dd         }d |D             }t          dd          t          fd|	D                       }t!          |o.t          |d	                   k    pt#          |d	                             }|s|st          d
 |	D                       rudd}d}|t          |	          k     rBt%          |	|                   r-|dz  }|t          |	          k     rt%          |	|                   -|	d|         |gz   |	|d         z   }	|	D ]Q}t          |          }t#          |          }||k    s|r2|r0t          |d	                   k    st#          |d	                   r^|Jt          |t                    r5|                    d          dk    r|rt          |d	                   |k    rt%          |          r|||v r|}||k    s|rGt          |t                    r2|                    d          dk    rt'          j        |          }|d<   |                    t'          j        |                     ||                    |           S|S )a  Keep UI transcript durable while allowing model context to compact.

    If Hermes Agent returns a normal append-only history, append that delta to
    the UI transcript. If the model/context history was compacted and no longer
    has the prior context as a prefix, keep the previous UI transcript and append
    only compaction marker messages plus the current user turn onward.
    r  NzNDeduplicated %d stale _partial messages from previous_display (was %d, now %d)c                 0    g | ]}t          |          |S r   )r%  r   s     r5   r   z>_merge_display_messages_after_agent_result.<locals>.<listcomp>   s6     
 
 
-a00

 
 
r7   c                 ,    h | ]}t          |          S r   )r  r   s     r5   r  z=_merge_display_messages_after_agent_result.<locals>.<setcomp>(  s!    111Qa  111r7   r   r   c              3   ^   K   | ]'}t          |          k    pt          |          V  (d S r~   )r  rb  )r   rA   r6  r  s     r5   r   z=_merge_display_messages_after_agent_result.<locals>.<genexpr>*  sW       % % 	! 00^4QRSU]4^4^% % % % % %r7   r  c              3   n   K   | ]0}t          |t                    o|                    d           dv V  1dS )r   )r   r  Nrm  r   s     r5   r   z=_merge_display_messages_after_agent_result.<locals>.<genexpr>9  sU       
 
 q$JAEE&MM5J$J
 
 
 
 
 
r7   r   r   r   r   r   )r   r  r=  r/   rq   r\   r  r  rr   r   r   r   r  r	  r3  r   r  rb  r%  r  r  )previous_displayr  r   r  _partial_seen_deduped_revrA   rv   _dedupedr   current_user_idxmarker_candidatesturn_candidatesmergedr  current_user_in_candidates!current_user_already_checkpointedcurrent_user_msg	insert_atr?  is_current_user_turndisplay_msgr6  s      `                  @r5   *_merge_display_messages_after_agent_resultrp  
  s7    ,233 EEML&''  a 	'155#4#4 	'#A&&C-''!!#&&&AH\**++H
8}}s+,,,,\ !!CMM137G3H3H#h--	
 	
 	
  ,233?0b11O  _.>?? 9$S)9%:%:%;%;<
+,<jII
+,<jII

2?HMM
 
&'r<L<X(8(8^abq^r^r'rs
 
 
 AQ@\/*:*;*;<<bd&8
aaa F11&111D(&X)N)NOO!$ % % % % %% % % " " )- 	
fRj))-== C,VBZBB	) )% 	$* 	%1 	%  
 

 
 
 
 
 	% %+x@@	#j//)).LZXaMb.c.c)NI #j//)).LZXaMb.c.c)

+/?.@@:ijjCYY
 ( ($$<S(KKo#)9"9"9>R"9 #: "&*--1AAA0XFF B O3%% ;.. /!&*--44 )#.. 	3?sd{{o#)9"9"9>R"93%% #:6))-,,K%-K	"dmK00111?HHSMMMMr7   c                 
   t          | pg           } t          |pg           }t          | |          r| t          |          d         }n!t          | |          }|| |dz   d         n| }t	          d |D                       S )zEReturn True only when the just-finished turn produced assistant text.Nr   c              3   
  K   | ]~}t          |t                    od|                    d           dk    oK|                    d           o5t          |                    d          pd                                          V  dS )r   r   rL  r   r;   N)r/   rq   r\   r0   r>   r   s     r5   r   z<_assistant_reply_added_after_current_turn.<locals>.<genexpr>  s        
 	 	1d 	0EE&MM[(	0h	0 i  &B''--//	     r7   )r   r  r   r3  r   )r   r  r  r   rf  s        r5   )_assistant_reply_added_after_current_turnrs  v  s    ?0b11O,233_.>?? q$S)9%:%:%;%;<

2?HMM?O?[_%5%9%:%:;;ap
  
      r7   r  i.  i]  capru  c                    | sdS 	 ddl m} t           ||           pd          }n# t          $ r d}Y nw xY w|dk    rdS t	          |t          |pd                    S )a(  Return a bounded rough token delta for live tool metering.

    Tool-result callbacks can fire before the agent's next exact prompt accounting
    is available. The live usage ring should show a conservative in-flight hint,
    not replay a full large tool payload into `last_prompt_tokens`.
    r   )estimate_messages_tokens_rough)agent.model_metadatarw  r]   r^   r   )r   ru  rw  deltas       r5   _bounded_live_tool_prompt_deltarz    s      qGGGGGG228<<ABB   zzquc#(mm$$$s    ' 66)exact_prompt_tokensr   ru  turn_tool_prompt_tokensturn_capbase_prompt_tokensr{  r|  r}  c                 4   t          | pd          }t          |pd          }|r||k    r|dddS t          dt          |pd                    }t          dt          |pd                    }	t          |t          ||          z   |	          }
||
z   d|
dS )zCompute the live `last_prompt_tokens` estimate after a tool update.

    Exact compressor/provider prompt accounting wins. When no newer exact prompt
    is available, add only bounded live tool deltas to the persisted base.
    r   F)last_prompt_tokens	estimatedr|  rt  T)r]   r   r   rz  )r~  r{  r   ru  r|  r}  baseexactprior_turn_deltaturn_ceilingnext_turn_deltas              r5   +live_usage_prompt_estimate_after_tool_deltar    s     !&Q''D#(q))E 
$"''(
 
 	

 1c"9">Q??@@q#hm!,,--L:8MMMM O
 #_4#2  r7   c                    |dk    rdS t          | pd          }	 t          | t                    r| nt          j        |          }t          |t                    rP|                    d          p+|                    d          p|                    d          p|}t          |          }n# t          $ r Y nw xY w|d|         S )zDExtract a bounded result preview from a stored tool message payload.r   r;   r  r  r   N)r0   r/   rq   r   r   r\   r^   )r`   rS   r   r,  previews        r5   _tool_result_snippetr    s    zzrsyb>>D d++AssD1A1AdD!! 	 hhx(([DHHX,>,>[$((7BSBS[W[Gw<<D   <s   BB, ,
B98B9ri  c                     i }t          | t                    s|S t          |                                           d|         D ]9\  }}t	          |          }|dd         t          |          dk    rdndz   ||<   :|S )z3Truncate tool args for compact session persistence.NrW   ...r;   r/   rq   r   r  r0   r   )r  rS   r  r@   r  r6  s         r5   _truncate_tool_argsr    s    
CdD!! 
TZZ\\""6E6* ; ;1FF4C4SVVc\\EEr:AJr7   msg_idxc                     t          |dz
  dd          D ]<}| |         }t          |t                    r|                    d          dk    r|c S =dS )zEFind the closest preceding assistant message index for a tool result.r   r  r   r   )r  r/   rq   r\   )r   r  r  r?  s       r5   _nearest_assistant_msg_idxr    s_    Wq["b))  smc4   	SWWV__%C%CJJJ2r7   c                    g }i }i }i }g }t          | pg           D ]\  }}t          |t                    s|                    d          }	|	dk    r|                    dd          }
t          |
t                    r|
D ]}t          |t                    rh|                    d          dk    rO|                    dd          }|r7|                    dd          ||<   |                    d	i           ||<   |||<   |                    d
g           D ]}t          |t                    s|                    dd          p|                    dd          }|                    di           }|                    dd          }	 t          j        |                    dd          pd          }n# t          $ r i }Y nw xY w|r|r|||<   |||<   |||<   |	dk    r|                    d          p|                    dd          }|                    dd          }||dd}|r|                    |d          }|rh|dk    rb|                    |t          |          ||                    |d          t          |                    |i                     d           d|d<   |                    |           d |pg D             }|rt          |          D ]\  }}|                    d          r|t          |          k    r n||         }|                    |                    dd          t          |                    dd                    |                    dd          pdt          | |                    dd                    t          |                    di           d          d           |S )zTBuild persisted tool-call summaries from final messages plus live progress fallback.r   r   r   r;   r  tool_user  r   inputrw  r  function	argumentsz{}r  rx  tool_use_idF)r  r`   resolvedr  )r   snippetr  assistant_msg_idxr  Tr  c                     g | ]G}t          |t                    |                    d           ,|                    d           dk    E|HS )r   rZ   rm  )r   r  s     r5   r   z5_extract_tool_calls_from_messages.<locals>.<listcomp>  sR    |||2Jr44H4H|RVVTZ^^|`b`f`fgm`n`nr{`{`{B`{`{`{r7   r`   r  r  r  rK  )rS   )r  r/   rq   r\   r   r   r   r^   rr   r  r  r   r  )r   live_tool_callsrw  pending_namespending_argspending_asst_idxtool_msg_sequencer  rA   r   r   r   r  r  fnr   r  r`   seqliveseq_idxlive_tcs                         r5   !_extract_tool_calls_from_messagesr    s8   JMLB// +* +*
!T"" 	uuV}};eeIr**G'4(( <# < <D!$-- <$((62B2Bj2P2P"hhtR00 <15&"1E1EM#.04"0E0EL-4;,S1eeL"-- 4 4!"d++ ffT2&&?"&&B*?*?VVJ++vvfb)):bff[$&?&?&G4HHDD    DDD 44 4)-M#&(,L%,3$S)4 V^^%%''C155+C+CC%%	2&&C%cuEEC 
+$((b11 +DFNN%% $#7#<#<"-=-A-A#r-J-J 3L4D4DS"4M4M N N' '    '+C
O$$S)))||//R|||D %&788 	 	LGSwwz"" #d))##7mGFF33/r0B0BCC{{5"--3%?#''R[]_J`J`%a%a+GKK,C,C1MMM      s   *F33GGc                    t          | t                    sdS g }|                     d          pg D ]6}t          |t                    s	 t          j        |                    d          pi ddt
                    }n4# t          $ r' t          |                    d          pd          }Y nw xY w|                    t          |                    d          pd          |t          |                    d	d                    t          |                    d
d                    t          |                    d          p|                    d          pd          f           8t          |                     d          pd          	                                t          |                     d          pd          	                                t          |          fS )zBReturn a stable identity for a persisted partial assistant marker.)r;   r;   r   _partial_tool_callsr  FT)r  r  rX   r;   r   doneis_errorr  r  r   r  )r/   rq   r\   r   r  r0   r^   rr   r  r>   r   )r9   tool_sig	tool_callargs_sigs       r5   _partial_message_signaturer  0  s   gt$$ |H[[!677=2  	)T** 		8zf%%+"	  HH  	8 	8 	89==006B77HHH	8	f%%+,,vu--..z51122	i((JIMM),D,DJKK
 	 	 	 	 	GKK	""(b))//11GKK$$*++1133h s   2A>>.B/.B/
before_idxr  r  c          	      d   t          | t                    rt          |t                    sdS t          |t                    r|nt	          |           }t          dt          |t	          |                               }d}t          |dz
  dd          D ]?}| |         }t          |t                    r |                    d          dk    r|dz   } n@t          |          }| ||         D ]B}t          |t                    r+|                    d          rt          |          |k    r dS CdS )	zECheck for an equivalent partial marker in the current user turn only.Fr   r   r  r   r   r  T)
r/   r   rq   r]   r   r   r   r  r\   r  )r   r  r  r`  r  r  r?  candidate_sigs           r5   _partial_marker_already_presentr  O  s5   h%% Z	4-H-H u":s33
F**XC
aS#h--((
)
)CES1Wb"%%  smc4   	SWWV__%>%>!GEE.y99Mc	"  c4   	SWWZ%8%8 	=WX[=\=\`m=m=m445r7   c                     d| dt          j        |d           d}| j                            |                    d                     | j                                         dS )z+Write one SSE event to the response stream.zevent: z
data: F)r  r|   r   N)r   r  wfilewriter   flush)handlereventr,  r   s       r5   _sser  b  se    QQQtz$U'K'K'KQQQGMw//000Mr7   c           	      b   t          t          | dd          pd          }|sdS d                    |                                          }|rt	          t          t          | dd          pg           dd                   D ]}t          |t                    r|                    d          d	k    r1d                    t          |                    d
          pd                                                    }||k    r dS t          t          j
                              }t          | dd          }t          |t          t          f          r|dk    rt          |          }d	||dd}t          | dd          }|rt          |          |d<   | j                            |           dS )a  Persist the pending user prompt before clearing runtime stream state.

    Error paths often clear ``pending_user_message`` before appending an assistant
    error marker. In deferred session-save mode that pending field can be the
    only durable copy of the user's current turn, so clearing it makes the user
    bubble disappear on reload/reconcile. Return True when a recovered user turn
    was appended.
    rR  Nr;   Fr   r   ir   r   r   rT  r   T)r   r   rO  
_recoveredrS  r%  )r0   r  rs   r   r=  r   r/   rq   r\   r]   rU  r   r   rr   )	r  pending_textnormalized_pendingr  r  recovered_tsrT  	recoveredrS  s	            r5   rP  rP  i  s    ww(>EEKLLL u,"4"4"6"677  ggz4&H&H&NB!O!OPRPSPS!TUU 	 	Hh-- f1E1E1O1OHHSi)@)@)FB%G%G%M%M%O%OPPM 222uu 3ty{{##L *>EE$sEl33 /8JQ8N8N-..!	 I "'+@$GG =#'(;#<#<	- I&&&4r7   c           	         ddl m}m} 	 |t          v r!t          |                                         rdS  || j                  }|dz  d| j         dz  }||nt          j                    }|5   || ||d           ddd           dS # 1 swxY w Y   dS # t          $ r. t                              d	t          | d
d                     Y dS w xY w)zFinal-exit guard: if the stream exits with pending_user_message still set,
    sync messages from the core transcript or add an error marker.
    Called from the outer finally block of _run_agent_streaming.
    Must never raise.
    r   )_get_profile_home _apply_core_sync_or_error_markerNsessionssession_r  F)stream_id_for_recheckrequire_stream_deadz1_last_resort_sync_from_core failed for session %srj   ?)r  r  r  r   is_setrk   rj   
contextlibnullcontextr^   r   	exceptionr  )r  rW  
agent_lockr  r  r  	core_path	_lock_ctxs           r5   _last_resort_sync_from_corer    sw    ONNNNNNN
 $$i)@)G)G)I)I$F((99 :-0T7;M0T0T0TT	","8JJj>T>V>V	 	 	,,&/$)	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  
 
 
?G\3//	
 	
 	
 	
 	
 	

s:   (B :B .B>B BB BB 4CCc                    	 ddl m}m} ddlm}m}m} ddlm}  |            }	|	st          
                    d           dS |5  |                    |d           ddd           n# 1 swxY w Y    ||             |||           }
t                              d| |           |
S # t          $ r(}t                              d	| ||           Y d}~dS d}~ww xY w)
a  Try to silently refresh credentials after a 401/auth error (#1401).

    Returns a new ``(agent, rt_dict)`` tuple on success so the caller can
    retry the conversation.  Returns ``None`` when self-heal is not
    applicable (e.g. auth.json unchanged, provider unresolvable).

    Steps:
    1. Re-read ``~/.hermes/auth.json`` to pick up fresh credentials that
       may have been written by a concurrent ``hermes model`` CLI invocation.
    2. Evict the session's cached agent so it is rebuilt with fresh keys.
    3. Evict the provider's credential-pool cache entry.
    4. Re-resolve the runtime provider.
    5. Return a new agent + resolved-provider dict (the caller must
       re-invoke ``run_conversation`` with these).
    r   )read_auth_json0resolve_runtime_provider_with_anthropic_env_lock)SESSION_AGENT_CACHESESSION_AGENT_CACHE_LOCK invalidate_credential_pool_cacheresolve_runtime_providerz7[webui] self-heal: auth.json empty or missing, skippingN	requestedzJ[webui] self-heal: credential refresh succeeded for provider=%s session=%sz8[webui] self-heal: failed for provider=%s session=%s: %s)	api.oauthr  r  r   r  r  r  hermes_cli.runtime_providerr  r   r   r  r	  r^   warning)provider_idrj   _agent_lock_refr  r  r  r  r  r  _fresh_auth_new_rt	_heal_errs               r5   _attempt_credential_self_healr    s   $(	
 	
 	
 	
 	
 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	IHHHHH %n&& 	LLRSSS4 & 	6 	6##J555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	)(555 CB$!
 
 

 	X	
 	
 	
    FY	
 	
 	
 tttttsA   >B( B( A'B( 'A++B( .A+/8B( (
C2CCc                     |dS ddl }|                    | pd                                                                          dd         S )a  Return the cache-signature component for runtime credentials.

    Credential-pool providers can legitimately hand WebUI a different runtime
    token on each request (round-robin pools, OAuth refresh, auth self-heal).
    The AIAgent object is also where cross-turn memory-provider state lives, so
    using the volatile token itself in the cache signature silently defeats the
    per-session agent cache and drops warmed Hindsight prefetch results.
    Nzcredential-poolr   r;   r  )hashlibsha256r   	hexdigest)r*   credential_pool_hashlibs      r5   _agent_cache_api_key_sigr    sU     "  ??,2::<<==GGII#2#NNr7   agent_kwargsc                    | t          |t                    sdS |                    d          }|	 || _        n# t          $ r Y nw xY w|                    d          pd}|sdS |                    d          pt          | dd          pd}t          | dd          rdS |t          | dd          pdk    rt          |            dS 	 t          | d	d          d
k    rt          | d          r|                     |                    d          pt          | dd          |                    d          pt          | dd          |||                    d	          pt          | d	d                     dS dS t          | d          rt          | d          s!|| _	        |r|| _
        t          |            dS t          t          | di           pi           }||d<   |r||d<   || _        || _	        |r|| _
        t          | d          r|                     | j
                   t          |                     d                    }|rt          |            |S # t          $ r  t                              dd           Y dS w xY w)aw  Refresh volatile runtime credentials on a reused cached AIAgent.

    The cache key intentionally ignores credential-pool token churn, but the
    cached agent's LLM client still needs the latest selected/refreshed runtime
    key. Keep long-lived provider/session state (memory prefetch, turn counters,
    tool state) while swapping only the runtime credential/client.
    NFr  r  r;   Tr  _fallback_activatedr  r  switch_modelr  r  )r  r  r  _client_kwargs_replace_primary_openai_client"_apply_client_headers_for_base_urlwebui_credential_refreshr  z:[webui] Failed to refresh cached agent runtime credentialsr   )r/   rq   r\   _credential_poolr^   r  ._refresh_cached_agent_primary_runtime_snapshothasattrr  r  r  r  r  r  r  r   r   )rf  r  new_poolnew_keynew_baseclient_kwargsrebuilts          r5   _refresh_cached_agent_runtimer    s    }J|T::}u 122H	%-E"" 	 	 	D	 y))/RG t
++Swuj"/M/MSQSHu+U33  u75)R006B776u===t(5*d++/CCC un-- "" $$W--N1N1N $$Z00TGE:t4T4T#%)--j99[WUJXZ=[=[ #    t5u.// 	wuFf7g7g 	 $EM *!):5AAA4WU,<bAAGRHH#*i  	1(0M*%, 	&%EN5>?? 	E44U^DDDu;;C];^^__ 	B:5AAA   Q\`aaauus/   : 
AA	B+I 8?I 9B"I &JJc                 ~   t          | dd          }t          |t                    sdS t          | d|                    d                    }t          | d|                    dd                    }t          t          | dd          p|                    di           pi           }||d<   ||d<   ||d<   t          | dd          }|_t	          |d          r||_        t	          |d          r||_        d	|v rt          |d|          |d	<   d
|v rt          |d|          |d
<   nd	|v r||d	<   d
|v r||d
<   t          | dd          dk    rkt	          | d          rt          | d          |d<   t	          | d          rt          | d          |d<   t	          | d          rt          | d          |d<   dS dS dS )am  Keep AIAgent's primary-runtime snapshot aligned with refreshed creds.

    Long-lived AIAgent instances use `_primary_runtime` to restore the preferred
    provider after fallback/transport recovery. If WebUI refreshes a cached
    agent's runtime token but leaves that snapshot stale, a later restore can
    resurrect the old credential and undo the refresh.
    _primary_runtimeNr  r  r;   r  r  context_compressorcompressor_base_urlcompressor_api_keyr  r  _anthropic_api_keyanthropic_api_keyr  anthropic_base_urlr  is_anthropic_oauth)r  r/   rq   r\   r  r  r  )rf  rtr  r  r  ccs         r5   r  r  E  s&    
*D	1	1Bb$ uj"&&*<*<==HeYy"(=(=>>G(8$??d266/[]C^C^dbdeeMBzNByM'B
 
,d	3	3B	~2z"" 	#"BK2y!! 	! BJ B&&(/J(I(IB$%2%%'.r9g'F'FB#$ B&&(0B$%2%%'.B#$uj$''+???5.// 	K&-e5I&J&JB"#5/00 	M'.u6K'L'LB#$5/00 	M'.u6K'L'LB#$$$ @?
	M 	Mr7   )r^  model_providergoal_relatedc                   	
 !"#$% t          j                  ##dS t           t          j                    dt	          |          ||t          |                     	 t                     $n0# t          $ r# d$t          	                    dd           Y nw xY w|sS	 t           dt          j                    d           n,# t          $ r t          	                    d	d           Y nw xY wd%i }	d}
d}d}d}d}d}i }t          j                    !t          5  !t          <   d
t          <   d
t           <   g t"          <   ddd           n# 1 swxY w Y   d dgdgdgt%                      dt&          f  fddt&          ffd  fdt)                                                     t          j                    " fd}t          j        |d          }|                                 !#$fd"" fd}d	d}d	 t1                     %t3          d            t	          t5          |                                                                                    %_        |%_        |3t	          |                                                                           ntC          %dd          }|pd%_"        tG                     !$                                r5  tK          %|d           ddd           n# 1 swxY w Y    "dddi           	 		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS 	 dd"l.m/}m0}m1}  |tC          %d#d                    }t	          |          } ||          }n4# td          $ r' tf          j4                            d$d
          }i }d}Y nw xY wtC          %d#d          }|s$	 dd%l.m5}  |            }n# t          $ r d}Y nw xY wtm          |t	          %j                   |          }to          d=i | tq                       tr          5  d& |D             }tf          j4                            d'          }
tf          j4                            d(          }tf          j4                            d)          }tf          j4                            d*          }tf          j4                            d+          }tf          j4                            d$          }tf          j4        :                    |           t	          %j                  tf          j4        d'<   d,tf          j4        d(<    tf          j4        d)<    tf          j4        d*<   d-tf          j4        d+<   |r)|tf          j4        d$<   | |t5          |                     ddd           n# 1 swxY w Y   	 dd.l;m<}  |             n# t          $ r Y nw xY wd/} d}!	 dd0l=m>}"m?}! "fd1}# |" |#           d} n*# td          $ r t          	                    d2           Y nw xY wd/}$d}%	 dd0l@m>}&m?}% "fd3}' |& |'           d}$n*# td          $ r t          	                    d4           Y nw xY wd5 
	 d/d/}(d
g t          jA                    d6z
  gdgdg" fd7d8t          dt          fd9d:t          dt
          ffd;"fd<})"fd=}*"fd>}+dgt%                      t%                      d? fd@fdA" fdB}," fdC}-" f	dD}.t                      }/|/te          t                                d}0	 ddElDmE}1 |rt5          |          dFz  nd}2 |1|2G          }0n+# t          $ r}3t          dH|3 dI           Y d}3~3nd}3~3ww xY wt          t          ||                    \  }4}5}6d}7	 ddJlImJ}8 ddKlKmL}9  |8|9|5L          }	|	                    dM          }7|5s|	                    dN          }5|6s|	                    dO          }6n+# t          $ r}:t          dP|: dI           Y d}:~:nd}:~:ww xY wt          |5|7|6          \  }5}7}6ddQlNmO};  |;            }<t          |<          }=|=                    dR          pg }> "dS t          |=          dT           ddUlNmR}?  |?|<          }@	 ddVlSmT}AmU}B |B  dWz  }C|CV                                r.|AW                               }D|DrtC          |DdXd          nd}E|Er|E}@n.# t          $ r!}Ft          dY  dZ|F dI           Y d}F~Fnd}F~Fww xY wd[ }Gg }Ht%                      }Id}Jd\D ]?}K |G|<                    |K                    D ]}Lt	          |L                    dN          pd
                                                                           t	          |L                    d]          pd
                                                                           t	          |L                    dO          pd
                                          X                    d^                                           f}M|M|Iv r|IY                    |M           |HZ                    |L           A|Hpd}Jddl[}Nt%          |N\                    |/j]                  j^                  d}O	 d}Pt          |<t                    r|<                    d_i           ni }Qt          |Qt                    r|Q                    d`          }P|P*t          |<t                    r|<                    d`          }P|Pt'          |P          }R|Rdk    r|R}On# t          $ r d}OY nw xY wd}S	 |<                    da          }T|T@|<                    d_i           }Ut          |Ut                    r|U                    da          }T|Tt'          |T          }V|Vdk    r|V}Sn# t          $ r d}SY nw xY w	 ddblNma}W t          |<t                    r|<                    d_i           ni }Xt          |Xt                    r|X                    dc          nd}Y |W|Y          }Zn# t          $ r d}ZY nw xY wt          |4|5|6|7d-d|@|J |0|>|)|*|,
!" fdde          }[dfv r|Z|Z|[df<   dgvr|[)                    dgd           dhv r|+|[dh<   div r|-|[di<   djv r|.|[dj<   dkv r||[dk<   dlv r|O|O|[dl<   dav r|S|S|[da<   dmv r|	                    dm          |[dm<   dnv r|	                    do          |[dn<   dpv r|	                    dq          |[dp<   drv r|	                    dr          |[dr<   dsv r |[ds<   |r' |/d=i |[ t          	                    dt            nddlb}\ddlc}]ddulNmd}^me}_ |	                    dr          }`|]f                    |4pd
t          |7|`          |6pd
|5pd
|	                    dm          pd
|	                    do          pd
|	                    dq          pg t          |`          |Opd
|Spd
|Jpi |@rt          |@          ng |Zpi t          |=          |pd
gdv          }a|\i                    |aj                                          k                                ddw         }bd |_5  |^                               }c|cr|cd6         |bk    r{|cd          |^l                                t          	                    dx            	 ddylmmn}d  |d             n-# t          $ r  t          	                    dz d           Y nw xY wddd           n# 1 swxY w Y    t           |[          st          p                    d{            	 tC           d|d           jq        r                                 n# t          $ r Y nw xY w|_5  |^)                     d           ddd           n# 1 swxY w Y   d  |[                    d}           _s        |[                    d~           _t        t           di          r|[                    di           _v        t           dj          r|[                    dj           _w        t           dk          r|[                    dk           _x        t           dh          r|[                    dh           _y        t           d          r|[                    d           _z        t           d          r|[                    d           _{        dg|[v r;t           dg          r*t          |[                    dg          pg            _}        |0Mt           d|          r4 jq        ,	  jq        r                                 n# t          $ r Y nw xY w|0 _q        t           d          rd _~        t           d          rd/ _        t           d          rd _        n |/d=i |[ 	 ddylmmn}d  |d             n-# t          $ r  t          	                    d d           Y nw xY wg }e|_5   |bf|^ <   |^l                                ddlNm}f t          |^          |fk    rD|^                    d/          \  }g}h|eZ                    |g|hf           t          |^          |fk    Dddd           n# 1 swxY w Y   |eD ]\  }i}j	 t          |jt                    r|jd         nd}kd}l|kb	 ddlmm}mm}nm}o  |m|i|kd            |n|i          s |o|i           nd/}ln/# t          $ r" d/}lt          	                    d|id           Y nw xY w|lr,|k*tC          |kd|d          |kjq        r                                 n-# t          $ r  t          	                    d|id           Y nw xY wt          	                    d|i           t          	                    d            t          5   tT          <   t          v r3t                   $                                r	                      d           n*# t          $ r t          	                    d           Y nw xY w5  tK          %|d           ddd           n# 1 swxY w Y    "dddi           	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS ddd           n# 1 swxY w Y   t          t	          %j                            }rd%j         d}sd}ttC          %dd          }u|ur$|<                    d_i           }v|v                    di           }wt          |wt                    r|u|wv r|w|u         }xt          |xt                    r|x                    dd
          p|x                    dd
          g}y|x                    d          r|yZ                    d|xd                     |x                    d          r|yZ                    d|xd                     d&                    d |yD                       }tnt	          |x          }tt          |td- tC          %d#d          %j        d           _        tC          %dd          }z|zr|znt          j                    }{t          tC          %dd                    }|t          t          %||          pg           }}t          t          %d||          |          }~t!          |~          }~tC          tC           dd          dd          }	%fd}t          j                    	5  %                    dd/           ddd           n# 1 swxY w Y   t          j        |dd dd                    }|                                 t%                     }|}|r+d&                    g ||                                          }t'          |r||||<          }                     ||st+          |~|<           |          }!$                                rc		                                 ||&                    d           |rt-          %           n5  tK          %d/           	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY wddd           n# 1 swxY w Y    "dddi           	                                  | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS |rd
}t1          |                    dR          pg           D ]U}t          |t                    r>|                    d          dk    r%t	          |                    dd
                    } nV "d |                    dRg           ddddd|d           		                                 	 ddl}|                    %j                                      d           n# t          $ r Y nw xY w	                                  | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS 		                                 ||&                    d           !$                                r5  tK          %d/           	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY wddd           n# 1 swxY w Y    "dddi           	                                  | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS 5  |s$t9          %          st;          %|          r.t                              dtC          %d                      nt                              dtC          %d           tC          %dd                     	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS |                    dR          p|~}!$                                rtK          %d/           	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY w "dddi           	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS t?          |~|          }tA          |~|          }t!          |          %_        tE          |}|~tG          |}|          |          %_        %j        D ]}t          |t                    r|                    d          dk    r|                    d          }t          |t                    rtK          |          }||k    r||d<   vt          |t                    r[|D ]X}t          |t                    rAt          |                    d:          t                    rtK          |d:                   |d:<   Y|                    dR          pg }t          |~          }tM          ||~|          }|sؐsԐ!$                                rtK          %|           |sZ	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY w "dddi           	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS tC           dd          p|                    d          pd
}|rt	          |          nd
}tO          ||t          |                     }|d         dk    }|d         dk    }|r|d         }|d         }|d         }nr|rN|(sKd}tQ          |5pd
           }|(t                              dĦ           |}	|                    dM          }7|5s|                    dN          }5|6s|                    dO          }6t          |5|7|6          \  }5}7}6|7|[dM<   |6|[dO<   |4|[d]<   |5|[dN<   drv r|                    dr          |[dr<    |/d=i |[ t          5   tT          <   ddd           n# 1 swxY w Y   ddulNmd}me} |5   |bf| <   |l                                ddd           n# 1 swxY w Y   d}(d/	                      ||st+          |~|<           |          }|                    dR          pg }tS          ||          p}n4# t          $ r'}t          p                    d|           d/}Y d}~nd}~ww xY w|r}|{|}|                    dR          p|~}t?          |~|          }tA          |~|          }t!          |          %_        tE          |}|~t?          |}|          |          %_        d}|sd}d}d}n!|rd}d}d}n|d         }|d         }|d         }|rntU          |p| dȝ||          } "d|           tW          %           d%_        d%_        g %_        d%_        dd| d|                    d          p| d| d͝t'          t          j                              ddΜ}|                    dϦ          r|d         |d<   |dk    rd|d<   n|dk    rd|d<   %j        Z                    |           	 %                                 n# t          $ r Y nw xY w	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS  }d}tC           dd          }d/}|r*| k    r# }|}|}|}|%_        %j        s&|r$|%_        t                              d||           tc          %|           |%_        tf          5  |th          v rti          j)        |          th          |<   ddd           n# 1 swxY w Y   tj          5  tl          |<   tm          j)        |d           ddd           n# 1 swxY w Y   ddulNmd}^me}_ |_5  |^)                    |d          }|r||^|<   ddd           n# 1 swxY w Y   d}|s+tC           dd          }|rtC          |dd          |k    rd}|r+to          %j        dզ          }d}tq          %j                  D ]\  }}ts          |          r|}|to          %j        d|         dզ          }tu          dt          |          d6z
            %_        t                              dtC          %ddצ          |t          |          %j                   nto          |}dզ          }|r)tu          dt          |          d6z
            %_        n|r	d%_        nd%_        t                              dtC          %ddצ          |rt          |          nd%j        %j        nd٦           %j        }||r|t          |          k     r	||         }n|r	|d         }nd}|rty          |          nd%_        t}          t          %j                  pt          %j                            %_        |%j        } "d||||d             dܜ           t          j                    }%j        D ]S}t          |t                    r<|                    dݦ          s'|                    dަ          st'          |          |d<   T%j        dk    s%j        dk    s%j        s#t          %j        %j                  %_        %j        dk    p%j        dk    p%j         }t          %j        %j                  }t          %j                  }|s|s|otC          %dd/           p|}d
}d
}|rt          %j                  \  }}tC           dd          pd}tC           dd          pd}tC           dd          }tC           dd          pd}tC           dd          pd}tC          %dd          pd}tC          %dd          pd}tu          d||z
            }tu          d||z
            }t          ||          }t          ||          }|dk    r|%_        |dk    r|%_        ||%_        |dk    r|%_        |dk    r|%_        t          %j                  }|%_        d%_        d%_        g %_        d%_        |rd |D             }Ðt1          %j                  D ]}|Ġ                    d          dk    rut	          |Ġ                    dd
                    }d|v r-|                    d          d                                         n|}|dd         |v s|dd         |v r||d<    nrW%j        rOt1          %j                  D ]8}t          |t                    r!|Ǡ                    d          dk    r|d<    n9	 tu          dt          j                    t          |{          z
            }n# t          $ r d}Y nw xY wd}|r(|dk    r"t          t          |          |z  d6          }ɐt           ||4p||5          }|rN|ʐ%_        t          tC          %dd          pg           }|ˠZ                    |ʦ           |dd         %_        %j        rkt1          %j                  D ]T}t          |t                    r=|̠                    d          dk    r$t          |d          |d<   |Ɂ||d<   |r||d<    nUtC           dd          }|rKtC          |dd          pd%_        tC          |dd          pd%_        tC          |dd          pd%_        tC          %dd          s	 ddlm} d}d}	 t          |<t                    r|<                    d]i           ni }t          |t                    rI|Ѡ                    d          }|ҁ2	 t'          |Ҧ          }|dk    r|}n# t          t          f$ r Y nw xY wt          |<t                    r|<                    d          nd}t          |t                    r|}n# t          $ r Y nw xY w |tC           d]|4pd
          pd
tC           dOd
          pd
||5pd
|Ь          }|r|Ր%_        np# t          $ rW 	 ddlm}  |tC           d]|4pd
          pd
tC           dOd
          pd
          }|r|Ր%_        n# t          $ r Y nw xY wY nt          $ r Y nw xY w|sܐ%j        rԐt          %fdt          t          %j                  d6z
  dd٦          D             d          }|ׁ%j        |         }	 t          %j        dt          |ؠ                    dݦ          pt          j                              |אd            n-# t          $ r  t          	                    dd           Y nw xY w!$                                rtK          %d/           	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY w "dddi           	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS %                                 !$                                rtK          %d/           	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY w "dddi           	 ddd                                            | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS |s	 t          %j        dt          j                    t          %fdt          t          %j                  d6z
  dd٦          D             d          d            n-# t          $ r  t          	                    dd           Y nw xY w|sR	 ddlmm}  |ِ%j                    n4# t          $ r' t          	                    d%j        d           Y nw xY wddd           n# 1 swxY w Y   	 ddlNm}  |ڦ                                d	          radd
lm}  |ې%j        %j        pd%j        pd%j        |%j        t          %j                  tC          %d#d                     n+# t          $ r t          	                    d           Y nw xY w|||||||t          |d          d}|Ɂ||ܐd<   |r||ܐd<   tC           dd          }|rBtC          |dd          pd|d<   tC          |dd          pd|d<   tC          |dd          pd|d<   |ܠ                    d          s	 ddlm} d}d}	 t          |<t                    r|<                    d]i           ni }t          |t                    rI|Ѡ                    d          }|ҁ2	 t'          |Ҧ          }|dk    r|}n# t          t          f$ r Y nw xY wt          |<t                    r|<                    d          nd}t          |t                    r|}n# t          $ r Y nw xY w	  |tC           d]|4pd
          pd
tC           dOd
          pd
||5pd
|Ь          }nC# t          $ r5  |tC           d]|4pd
          pd
tC           dOd
          pd
          }Y nw xY w|r||d<   n# t          $ r Y nw xY w|ܠ                    d          stC          %dd          pd}|r||d<   	 tC           dd          }|r
 |            nd}|r "d t	          |          d           n,# t          $ r t          	                    d            Y nw xY w	 ddlm}m} |r | |          si }n/d
}t1          %j        pg           D ]}t          |t                    r|                    d          dk    r1|                    dd
          }t          |t                    rg }|D ]e}t          |t                    rN|                    d:          p|                    d          }|r"|Z                    t	          |                     fd&                    |          }nt	          |pd
          }  "d dddd            | |d|          }|pi }t	          |                    d          pd
                                          }|ra "d |                    d          rdnd||                    d          p|rd nd
|                    d!          pg |d"           |                    d          rt	          |                    d#          pd
                                          }|rYt          jY                     "d$ ||||                    d          pd |                    d!          pg |d%           n4# t          $ r'}t          	                    d& |           Y d}~nd}~ww xY w%                                %j        |d'z  } "dt          |          |ܐd(           t)                                                      } |d<   |                    d)d/           |                    d*d/            "d+|           |rj|rh|rft          j        t          %j        ||t	          %j        pd
                                          " fd,                                           n% "d-d i           t          %"                                             | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           n# 1 swxY w Y   n'#                                  | r9|!7	  |!            n*# t          $ r t          	                    d           Y nw xY w|$r9|%7	  |%            n*# t          $ r t          	                    d           Y nw xY wtr          5  |                                D ]7\  }p}q|q!tf          j4        )                    |pd           (|qtf          j4        |p<   8|
!tf          j4        )                    d'd           n|
tf          j4        d'<   |!tf          j4        )                    d(d           n|tf          j4        d(<   |!tf          j4        )                    d)d           n|tf          j4        d)<   |!tf          j4        )                    d*d           n|tf          j4        d*<   |!tf          j4        )                    d+d           n|tf          j4        d+<   |!tf          j4        )                    d$d           n|tf          j4        d$<   ddd           w # 1 swxY w Y   w xY wn# t          $ r}t          d.t          j                    z   dI           t	          |          }t          j        d/d0|          }t          j        d1d0|                                          }||k    r|}|                                 }tO          ||          }!$                                rN%Ґ		                                 ||&                    d           nt          j                    }|5  tK          %|           |sZ	 t          %j        dt          j                    dd           n,# t          $ r t          	                    dd           Y nw xY wddd           n# 1 swxY w Y    "dddi           Y d}~		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS |d         dk    }|d         d2k    o| }|d         dk    }|d         d3k    }|d         dk    }|d         dk    }|r|d         |d         |d         }}}nv|r|d         |d         |d         }}}nZ|r|(stQ          |5pd
           }|t                              d4           d}(|}	|                    dM          }7|5s|                    dN          }5|6s|                    dO          }6t          |5|7|6          \  }5}7}6d5t                      v rt          |[          ni } |7| dM<   |6| dO<   |4| d]<   |5| dN<   drv r|                    dr          | dr<    |/d=i | }t          5  |tT          <   ddd           n# 1 swxY w Y   ddulNmd}me} |5  ||bf| <   |l                                ddd           n# 1 swxY w Y   d/	 |                    ||st+          |~|<           |          }%		                                 ||&                    d           nt          j                    }|5  |sǐt9          %          st                              d6tC          %d           tC          %dd                     	 ddd           Y d}~		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS |                    dR          p|~}t?          |~|          }tA          |~|          }t!          |          %_        tE          |}|~t?          |}|          |          %_        %                                 ddd           n# 1 swxY w Y   t                              d7           Y d}~		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS # t          $ r,}t          p                    d8|           Y d}~n
d}~ww xY wd9\  }}}n?|r|d         |d         |d         }}}n$|s|r|d         |d         |d         }}}nd:\  }}}tU          |||          }%		                                 ||&                    d           nt          j                    }|5  |sǐt9          %          st                              d;tC          %d           tC          %dd                     	 ddd           Y d}~		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS tW          %           d%_        d%_        g %_        d%_        dd| d|                    d          p| |rd| d͝nd
z   t'          t          j                              ddΜ}|                    dϦ          r|d         |d<   |dk    rd|d<   n|dk    rd|d<   %j        Z                    |           	 %                                 n# t          $ r Y nw xY w|s[	 t          %j        dt          j                    |d           n-# t          $ r  t          	                    d<d           Y nw xY wddd           n# 1 swxY w Y    "d|           Y d}~nd}~ww xY w		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           dS # 1 swxY w Y   dS # 		                                 ||&                    d           %LtC          %dd          k    r6tC          %dd          r$t3          d !           tO          %           tQ                       t          5  t          j)        d           t          j)        d           tU          j)        d           t          j)        d           t!          j)        d           t#          j)        d           tW          j)        d           tY          j)        d           t[                     ddd           w # 1 swxY w Y   w xY w(>  u   Run agent in background thread, writing SSE events to STREAMS[stream_id].

    When ephemeral=True, session mutations are skipped — used by /btw to get
    a streaming answer without persisting to the parent session.
    Nstarting)rj   
started_atphaserm   r  r  r^  z.Failed to initialize run journal for stream %sTr   worker_started)r  
created_atz2Failed to append worker_started turn journal eventr;   r   r,   c                  j   d         dk    rd         S d} }|:	 t          |dd          }|rt          |dd          pd} n# t          $ r d} Y nw xY w| s6	 t                    }t          |dd          pd} n# t          $ r d} Y nw xY wt          | pd          d<   d         d<   d         S )zDCapture the latest exact prompt size before adding live tool deltas.r   Nr  r  )r  r^   rs  r]   )_base_agent_cc_session_obj_live_prompt_estimate_tokens_live_prompt_exact_tokensrf  rj   s       r5   _seed_live_prompt_estimatez8_run_agent_streaming.<locals>._seed_live_prompt_estimate  s   '*Q../22f&:DAA G#C)=qAAFQE    	*:66.BAFFK!   *-ejq//$Q''CA'F!!$+A..s#   &A AA"A< <B
Bc                     | sd         S               t          d         d         | d                   }|d         d<   |d         d<   d         S )z?Increment a rough next-prompt estimate from live tool activity.r   )r~  r{  r   r|  r  r|  )r  )r   _usager  '_live_prompt_estimate_tool_delta_tokensr  r  s     r5   _bump_live_prompt_estimatez8_run_agent_streaming.<locals>._bump_live_prompt_estimate  s     	3/22""$$$<8; 9! <$KA$N	
 
 
 +11E*F$Q'5;<U5V/2+A..r7   c            
         dddddddddd	} 	 t          
          }n# t          $ r d}Y nw xY w	}|	 t          |dd          pd| d<   t          |dd          pd| d<   t          |dd          pd| d	<   t          |d
d          pd| d<   t          |dd          pd| d<   n# t          $ r Y nw xY w	 t          |dd          }|rBt          |dd          pd| d<   t          |dd          pd| d<   t          |dd          pd| d<   n# t          $ r Y nw xY w|BdD ]?}|                     |          s(	 t          ||d          pd| |<   /# t          $ r Y ;w xY w@t	          |                     d          pd          }t          |                     d          pd|                     d          pd          | d<   |r|d         k    r|d<   |d<   dd<   nd         |k    rd         | d<   | S )a}  Best-effort live usage payload for mid-stream UI updates.

        During tool execution the final `done` event has not fired yet, but the
        frontend still benefits from seeing the latest known token / context
        values. These are exact for the most recent model call and a truthful
        lower bound for the pending next call after a tool result is appended.
        r   N)	input_tokensoutput_tokensestimated_costcache_read_tokenscache_write_tokenscache_hit_percentcontext_lengththreshold_tokensr  session_prompt_tokensr  session_completion_tokensr  session_estimated_cost_usdr  session_cache_read_tokensr  session_cache_write_tokensr   r  r"  r#  r  )r  r  r  r  r   r"  r#  r  r!  )rs  r^   r  r\   r]   r&   )r  r  r  r  _field_real_prompt_tokensr  r  r  rf  rj   s         r5   _live_usage_snapshotz2_run_agent_streaming.<locals>._live_usage_snapshot  s
    !""#!% !"#

 

	 &z22LL 	  	  	 LLL	  )09PRS)T)T)YXY~&*1&:UWX*Y*Y*^]^'+26;WYZ+[+[+`_`'(.5f>Y[\.].].bab*+/6v?[]^/_/_/dcd+,,   f&:DAA ^/6s<La/P/P/UTUF+,18>PRS1T1T1YXYF-.3:3@TVW3X3X3]\]F/0    # u  zz&)) )0vq)I)I)NQv$    "&**-A"B"B"GaHH&>JJ*++0qJJ~&&+!'
 '
"#  	K#6:STU:V#V#V+>%a(.A(+9:3A66)!,/BBB+G+JF'(sC    ..A.B% %
B21B26AD 
DD8E
EEc                     	 t                                                      } | dk    rd S                     |           rd S t                                                      }|d<                |d<    d|           ~)NTg      $@rj   r  metering)r#   get_intervalwait	get_stats)intervalstatsr+  _metering_stopr  rj   s     r5   _metering_tickerz._run_agent_streaming.<locals>._metering_ticker-  s    		#ww++--H4""8,, GG%%''E",E,1133E'NC
E"""		#r7   )r  r  c                                                     r| dvrd S 	                     | |          }t          |t                    r|pi                     d          nd }|r
|t
          <   n.# t          $ r! t                              d| d           Y nw xY w	 	                    | |f           d S # t          $ r t                              d           Y d S w xY w)N)cancelr   event_idz3Failed to append run journal event %s for stream %sTr   zFailed to put event to queue)
r  append_sse_eventr/   rq   r\   r   r^   r   r   
put_nowait)r  r,  	journaledr7  cancel_eventqrun_journalrW  s       r5   r  z!_run_agent_streaming.<locals>.put<  s(      	U2E%E%EF"u'88EE	 AK9VZ@[@[eIO00<<<ae ?6>(3 u u uRTY[dostttttu	9LL%''''' 	9 	9 	9LL7888888	9s$   AA0 0(BBB8 8$C C c                    t          |pd                                          }t          | pd                                                                          }|sdS |                                }|dk    od|v pd|v pd|v pd|v }|r ddd	           dS t          ||          }|r d
d|d           dS dS )a  Bridge Agent lifecycle status into WebUI SSE.

        Passes compression events as 'compressing' events and rate-limit/fallback
        events as 'warning' events so the frontend can surface them to the user.
        All other lifecycle messages are dropped silently.
        r;   Nr<   zpreflight compressioncompressingzcompacting contextzcontext too largez'Auto-compressing context to continue...)rj   r9   r  rl  )r  r9   )r0   r>   r?   rB   )	r8   r9   r5  _kind_lower_is_compression_start_is_fallback_noticer  rj   s	          r5   _agent_status_callbackz4_run_agent_streaming.<locals>._agent_status_callbackU  s&    w}"%%++--DJB%%''--// 	F!![  '61 1 F*1'611 '&0 	 ! 	C(D       F =UHMM 	FC	J8DDEEEEE	F 	Fr7   running)r  rj   r  zTask cancelled before start.r]  r6  r9   zCancelled before start   r[   rQ  rR  
finalizing)r  )patch_skill_home_modulesget_hermes_home_for_profileget_profile_runtime_envrk   r  )get_active_profile_namec                 N    i | ]"}|t           j                            |          #S r   )r   rl  r\   )r   rv   s     r5   r  z(_run_agent_streaming.<locals>.<dictcomp>  s(    XXXCsBJNN3$7$7XXXr7   r  r  r  r  r  r  r  )discover_mcp_toolsF)register_gateway_notifyunregister_gateway_notifyc                       d|            d S )Napprovalr   )approval_datar  s    r5   _approval_notify_cbz1_run_agent_streaming.<locals>._approval_notify_cb  s    J.....r7   z6Approval module not available, falling back to pollingc                       d|            d S )NrZ   r   )clarify_datar  s    r5   _clarify_notify_cbz0_run_agent_streaming.<locals>._clarify_notify_cb  s    I|,,,,,r7   z5Clarify module not available, falling back to pollingc                 N   t                      }d |pg D             }t          | pd          ||dt          j                    |d}	 ddlm}m}	 n# t          $ r 	 Y dS w xY w |||          }
t          j                    |z   }	 |                                r |	|           	 dS |t          j                    z
  }|dk    r |	|           	 dS |
j	        
                    t          d	|          
          r,t          |
j        pd                                          }|pdS )z+Bridge Hermes clarify prompts to the WebUI.c                 ,    g | ]}t          |          S r   r   )r   r  s     r5   r   zH_run_agent_streaming.<locals>._clarify_callback_impl.<locals>.<listcomp>  s    FFFFCKKFFFr7   r;   rZ   )questionchoices_offeredrj   r8   requested_atra   r   )submit_pendingclear_pendingzrThe user did not provide a response within the time limit. Use your best judgement to make the choice and proceed.Tg      ?rG  )rb   r0   rU  api.clarifyr]  r^  rE   	monotonicr  r  r/  r   r  r>   )rZ  r  sid
cancel_evtr
  r[   choices_listr,  _submit_clarify_pending_clear_clarify_pendingrq  deadline	remainingresponses                 r5   _clarify_callback_implz4_run_agent_streaming.<locals>._clarify_callback_impl  s   .00GFFw}"FFFLB//#/!! $	#* Dzzzzzzzzz   N   ,+C66E~'''1H$$&& **3///R  %t~'7'77	>>**3///R  ;##CY,?,?#@@ "5<#5266<<>>H  UU!s   A AAr   c                  .   t          j                    } | d         z
  dk     rd S | d<   t                                                      }|d<                |d<   |                    dd           |                    dd            d|           d S )	Nr   r   rj   r  tps_availableFr  r-  )rU  r`  r#   r0  
setdefault)nowr2  r+  _metering_last_emitr  rj   s     r5   _emit_meteringz,_run_agent_streaming.<locals>._emit_meteringN  s    n&&,Q//#55F),#A&))++&0l#!5!5!7!7g  %888  e444J&&&&&r7   rx   c                 p    t          j        ddt          | pd                                                    S )Nr1  r   r;   )r2  r   r0   r>   r  s    r5   _compact_for_echo_comparez7_run_agent_streaming.<locals>._compact_for_echo_compareZ  s.    vfc3u{+;+;<<BBDDDr7   r   c           
          |           }|sdS  t          j        d          t          t          t	          |                     dz  d           d                    }t          |o|                    |                    S )NFr;   r  r  )r
   r\   r   r   r0   r  rF  )r   r  visible_tailrq  rW  s      r5   _is_visible_output_echoz5_run_agent_streaming.<locals>._is_visible_output_echo]  s    55d;;	  ! 588'+Ir::CCIIQR@RTW<X<X;X;Y;YZ    LM\-B-B9-M-MNNNr7   c                 
   | d S dt           v r"t           xx         t          |           z  cc<    dd| i           dxx         dz  cc<   t                                          d                                  d S )NTtokenr   r   r   )r
   r0   r#   record_token)r   ro  _metering_output_deltas_token_sentr  rW  s    r5   on_tokenz&_run_agent_streaming.<locals>.on_tokenf  s    <F" 333'	222c$ii?222Gfd^,,, (***a/***$$Y0G0JKKK     r7   c                 .   | d S t          |           } |          rd S |z  t          v rt          xx         |z  cc<    dd|i           dxx         dz  cc<   t                                          d                                  d S )Nr  r   r   r   )r0   r   r#   record_reasoning)r   reasoning_deltaro  rt  _metering_reasoning_deltas_reasoning_textr  rW  s     r5   on_reasoningz*_run_agent_streaming.<locals>.on_reasoningv  s    <F"%d))
 +*?;; F?2 555))444G444K&/!:;;;*1---2---((4Nq4QRRR     r7   c                     | d S t          |                                           }|sd S t          |                    dd                    p
 |          } d||d           d S )Nalready_streamedFinterim_assistant)r   r  )r0   r>   r  r\   )r   	cb_kwargsvisibler  rt  r  s       r5   on_interim_assistantz2_run_agent_streaming.<locals>.on_interim_assistant  s    <Fd))//++ F#'	6H%(P(P#Q#Q#uUlUlmtUuUu '#(8* *     r7   c                     i }t          | t                    rct          |                                           d d         D ]9\  }}t	          |          }|d d         t          |          dk    rdndz   ||<   :|S )NrK  rW   r  r;   r  )r  	args_snapr@   r  s2s        r5   _tool_args_snapshotz1_run_agent_streaming.<locals>._tool_args_snapshot  s    	dD)) S $TZZ\\ 2 22A2 6 S S1 VV')$3$xCGGcMM55r'R	!  r7   c           	          | r| v rdS                      |            | dt          |pd          t          j        t	          |t
                    r|ni dd          dd} dd|gd	g           dS )
NFr  r;   T)r  r  )r   r  )r  r  r  r   )r   r   rw  )r  r0   r   r  r/   rq   )rx  r   r  
_tool_callr  _live_prompt_estimate_seen_idss       r5   _record_live_tool_startz5_run_agent_streaming.<locals>._record_live_tool_start  s    # !|7U'U'U 5.22<@@@&& #DJB%)Z
48N8N0VTVejvz%{%{%{! ! 
 +*'!#-,- - ,   
 tr7   c                 n    | sdS t          |          } dt          |pd          | |dg           dS )NFr  r;   )r   r   rx  r   T)r  r0   )rx  r   function_result_result_textr  s       r5   _record_live_tool_completez8_run_agent_streaming.<locals>._record_live_tool_complete  s^    # ! 53ODD**"
OO$0+	- - ,    tr7   c                     d }d }d }d }t          |           dk    r| d d         \  }}}}nRt          |           dk    r	| \  }}}d}n6t          |           dk    r| \  }}nt          |           dk    r
| d         }d}|dv r|dk    r|n|}|rt          |          } |          rd S |z  t          v rt          xx         |z  cc<    d	d
|i           dxx         dz  cc<   t                                          d                                  d S  |          }|dv rdv rd S |dv r8                    |t          |t                    r|ni d           t          v r;t                                       |t          |t                    r|ni dd            d|pd|||d           t                      	                                }	|	d<                |	d<    d|	           	 ddl
m}
m}m}  |
          rK|5  t          |                    i                     }d d d            n# 1 swxY w Y   |r d|           n# t          $ r Y nw xY wd S |dk    rdv rd S |dk    rt!                    D ]x}|                    d          r|r|                    d          |k    rEd|d<   |                    d          |d<   t#          |                    dd                    |d<    nyt          v rt!          t                             D ]x}|                    d          r|r|                    d          |k    rEd|d<   |                    d          |d<   t#          |                    dd                    |d<    nydxx         dz  cc<    d|||||                    d          t#          |                    dd                    d           t                      	                                }	|	d<                |	d<    d|	           d S d S ) NrK  rJ  tool.startedr  r   r   )reasoning.available	_thinkingr  r  r   )Nr  tool_start_callback)r   r  F)r   r  r  r  )
event_typer   r  r  rj   r  r-  )has_pending_pendingr  rR  tool.completedtool_complete_callbackr  r   Tdurationr  tool_complete)r  r   r  r  r  r  )r   r0   r   r#   r|  rr   r/   rq   r   r0  tools.approvalr  r  r  r\   rE   r=  r  )cb_argsr  r  r   r  r  reason_textreason_deltar  _tool_stats_has_pendingr  r  rh  r  	shared_tc_agent_params_checkpoint_activityro  rt  _live_tool_callsr+  r~  r  r  r  rj   rW  s                   r5   on_toolz%_run_agent_streaming.<locals>.on_tool  s   !
w<<1$$6=bqbk3Jgtt\\Q&&*1'D'4!/JJ\\Q&&'.$J\\Q&&"1:D!/J!EEE-7;P-P-P''VZK" )'*;'7'7 32<@@ #"F'<7$(===1)<<<L<<<K&,)?@@@21555:55500<VWX<YZZZ&(((F//55	 !777<QUb<b<bF!777$++ $(24(>(> FB- -   
 !$:::.y9@@$(,6tT,B,B$JDD$)B B   
 C&0&BN $#* )	! !    #(''"3"3"5"5K0:K-+?+?+A+AK(C
K000__________'<
33 3!& G G$(j")E)E$F$FG G G G G G G G G G G G G G G  3 #J 2 2 2&   F!1116NR_6_6_F!111#+,<#=#= " "";;v.. %$# "w{{6':':d'B'B.2GFO2;--
2K2KGJ/26y}}ZQV7W7W2X2XGJ/!E	 (C !$:::)12H2S)T)T & &I(}}V44 ) (#' &9==+@+@D+H+H48	& 18Aj8Q8Q	* 58<Y]]:W\=]=]8^8^	* 5 %	 ,I )+++q0+++C&0 $#* )$-MM*$=$=$(z5)I)I$J$J* *    #(''"3"3"5"5K0:K-+?+?+A+AK(C
K000FE 21s6   ?I  $I:I  I

I  I
I   
I-,I-c           	      P   	  | ||           | r| vr                     |                                |t          |t                    r|ni | d           t          v r<t                                       |t          |t                    r|ni d| d            	dd|d  |          | d           t                                                      }
|d<                |d<    	d	|           d S # t          $ r  t          	                    d
d           Y d S w xY w)N)r   r  r  F)r   r  r  r  r  r  )r  r   r  r  r  rj   r  r-  z3Failed to update live prompt estimate on tool startTr   )
r  rr   r/   rq   r   r#   r0  r^   r   r   )rx  r   r  r  r  _live_tool_event_start_idsr+  r  r  r  rj   rW  s       r5   on_tool_startz+_run_agent_streaming.<locals>.on_tool_start=  s   g++L$EEE# <V(V(V266|DDD(//$(,6tT,B,B$JDD#/1 1    %(>>>29=DD(,0:40F0F(NB(-'3	F F    F*8$('+$7$7$=$=#/% %    #(''"3"3"5"5K0:K-+?+?+A+AK(C
K00000  g g gLL!VaeLffffffgs   C6C; ;&D%$D%c           
        	 	  | ||           | r_| 
vrZ
                     |            t          |          }t          	          D ]k}|                    d          r|                    d          | k    s.|                    d          s%|                    d          |k    rd|d<   ||d<    nlt          v rt          t                             D ]k}|                    d          r|                    d          | k    s.|                    d          s%|                    d          |k    rd|d<   ||d<    nldxx         dz  cc<    dd	|| |          | d
d           t                                                      }|d<                |d<    d|           d S # t          $ r  t          	                    dd           Y d S w xY w)Nr  r  r   Tr  r   r   r  r  F)r  r   r  r  r  r  rj   r  r-  z8Failed to update live prompt estimate on tool completionr   )
r  r  r=  r\   r   r#   r0  r^   r   r   )rx  r   r  r  result_snippetr  r  r  r  r  _live_tool_event_complete_idsr+  r  r  r  rj   rW  s           r5   on_tool_completez._run_agent_streaming.<locals>.on_tool_complete]  sp   "l..|T?SSS# <Y(Y(Y599,GGG)=o)N)N'/0@'A'A & &G&{{622 ) (&{{511\AA'++V[J\J\Aahalalmsatatx|a|a|265C	 2 %$(>>>-56LY6W-X-X * *	#,==#8#8 !-$,#,==#7#7<#G#GPYP]P]^cPdPd#Girivivw}i~i~  CG  jG  jG8<If$5;IIi$8$)E,Q///14///O*:$('5$7$7$=$=#/(-. .    #(''"3"3"5"5K0:K-+?+?+A+AK(C
K00000  l l lLL![fjLkkkkkkls   F-F2 2&GG)	SessionDBzstate.db)db_pathuO   [webui] WARNING: SessionDB init failed — session_search will be unavailable: )r  )r  r  r  r  r  r  z2[webui] WARNING: resolve_runtime_provider failed: )r   r   context_status)rj   prefill)_resolve_cli_toolsets)r  r   r  enabled_toolsetsz9[webui] WARNING: failed to read per-session toolsets for ro   c           
      0   t          | t                    r| g}nt          | t                    r| }ng S g }|D ]}t          |t                    st          |                    d          pd                                          }t          |                    d          pd                                          }|r|s|                    |||                    d          |                    d          |                    d          d           |S )Nr  r;   r  r  r  key_env)r  r  r  r  r  )r/   rq   r   r0   r\   r>   rr   )_raw_items_entries_entry	_provider_models         r5   _fallback_entriesz/_run_agent_streaming.<locals>._fallback_entries  s)   dD)) "VFFd++ !FFI$  F%fd33 !  #FJJz$:$:$@b A A G G I II G!4!4!:;;AACCF$ !F ! OO!'$-$*JJz$:$:#)::i#8#8#)::i#8#8% %      r7   )fallback_providersr  r  /rf  	max_turnsr  )parse_reasoning_effortreasoning_effortc                 "     | |          S r~   r   )rZ  r  ri  r;  r  rj   s     r5   <lambda>z&_run_agent_streaming.<locals>.<lambda>I  s     .D.D ':|S/ / r7   )r  r  r  r  platform
quiet_moder  r  rj   
session_dbprefill_messagesstream_delta_callbackreasoning_callbacktool_progress_callbackclarify_callbackr  r  interim_assistant_callbackr  r  status_callbackmax_iterationsr  acp_commandr   acp_argsr  r  gateway_session_keyz.[webui] Created ephemeral agent for session %s)r  r  )r  r  z+[webui] Reusing cached agent for session %s)register_agentz5Lifecycle register_agent failed for cached session %sz[[webui] Cached agent runtime could not be safely refreshed; rebuilding agent for session %s_session_dbr  r  r  r  _api_call_count_interrupted_interrupt_messagez2Lifecycle register_agent failed for new session %s)SESSION_AGENT_CACHE_MAX)rZ  )commit_session_memoryhas_uncommitted_workunregister_agent)rf  r/  z*Lifecycle commit on eviction failed for %sz,Failed to close evicted agent for session %sz([webui] Evicted LRU agent from cache: %sz([webui] Created new agent for session %sz&Failed to interrupt agent before startCancelled by userz&Failed to unregister approval callbackz%Failed to unregister clarify callbackz#Active workspace at session start: aj  
Every user message is prefixed with [Workspace::v1: /absolute/path] indicating the workspace the user has selected in the web UI at the time they sent that message. This tag is the single authoritative source of the active workspace and updates with every message. It overrides any prior workspace mentioned in this system prompt, memory, or conversation history. Always use the value from the most recent [Workspace::v1: ...] tag as your default working directory for ALL file operations: write_file, read_file, search_files, terminal workdir, and patch. Never fall back to a hardcoded path when this tag is present.personalitypersonalitiessystem_promptr  tonezTone: stylezStyle: rp   c              3      K   | ]}||V  	d S r~   r   rg  s     r5   r   z'_run_agent_streaming.<locals>.<genexpr>3  s'      7O7OaQ7O7O7O7O7O7O7Or7   )rh   rj   rk   rm   )rf   rT  rj   )state_messages)prefer_contextr  r  compression_countc                  >   d}                      d          s	 d         }|| k    r+5  t                     d d d            n# 1 swxY w Y   |} n2# t          $ r%}t                              d|           Y d }~nd }~ww xY w                     d          d S d S )Nr   rF  z#Periodic checkpoint save failed: %s)r/  r9  r^   r   r   )last_saved_activitycurr  _agent_lockr  _checkpoint_stopr6  s      r5   _periodic_checkpointz2_run_agent_streaming.<locals>._periodic_checkpointp  s$   &'#*//33 OO215!444!, > > :1 = = => > > > > > > > > > > > > > >25/$ O O O%JANNNNNNNNO +//33 O O O O Os9   A AA A

A A
A 
BA>>Br  zckpt-   )r  r  r   r|   r  )user_messagesystem_messageconversation_historytask_idpersist_user_message)r^  r  r  )r  r  r  z-Failed to append cancelled turn journal eventr   r   r   r  )rj   r   )r  r  )r  r  r^  answerrX  z:Superseding stale recovery marker for session %s stream %szMSkipping stale stream writeback for session %s stream %s; active_stream_id=%s_last_errorr   r  r  r   r#  rw   r  z;[webui] self-heal: retrying stream after credential refreshz([webui] self-heal: retry also failed: %sr"  r$  rC  apperrorz**z:** rD  rE  )r   r   rO  rL  r3  rM  rJ  rN  zInterruption detailsz?Stamped profile=%r on continuation session %s after compression)auto_compressionz@[ANCHOR-MARKER] session=%s marker_raw=%d vis_before=%d anchor=%dr  z4[ANCHOR-FALLBACK] session=%s vis_before=%d anchor=%dr  
compressedz4Context auto-compressed to continue the conversation)rj   old_session_idnew_session_idcontinuation_session_idr9   r  rO  r  ra  rb  r_  r$  r%  r&  r'  r(  r  r  )r  c                 J    g | ] }t          |          t          |          !S r   )r  r  s     r5   r   z(_run_agent_streaming.<locals>.<listcomp>  s0    *k*k*k1WghiWjWj*k+;A+>+>*k*k*kr7   r   z

[Attached files:rL  r%  r  g        r  gateway_routing_historyirJ  _turnDuration_turnTps_gatewayRoutingr"  r#  r  )get_model_context_lengthcustom_providers)config_context_lengthr  r  c              3      K   | ]J}t          j        |         t                    r(j        |                             d           dk    F|V  KdS r   r   Nr/   r   rq   r\   r   r  r6  s     r5   r   z'_run_agent_streaming.<locals>.<genexpr>9  sl       n n&qz#==nBC*S/BUBUV\B]B]alBlBl BlBlBlBln nr7   assistant_started)r  r  assistant_message_indexz5Failed to append assistant_started turn journal event	completedc              3      K   | ]J}t          j        |         t                    r(j        |                             d           dk    F|V  KdS r  r  r  s     r5   r   z'_run_agent_streaming.<locals>.<genexpr>u  sm       %z %zS(21:c?D(I(I%zNOjY\oNaNabhNiNimxNxNx &)NxNxNxNx%z %zr7   z-Failed to append completed turn journal event)mark_turn_completed)rf  z+Memory lifecycle mark failed for session %srp  sync_to_insights)sync_session_usage)rj   r  r  r  r  r  r   rk   z"Failed to sync session to insights)r  r  r  r  r   r!  turn_cache_hit_percentduration_secondstpsgateway_routing_drain_pending_steerpending_steer_leftover)rj   r   z,Failed to drain pending steer for session %s)evaluate_goal_after_turnhas_active_goal)r  goal
evaluatingu   Evaluating goal progress…goal_evaluating_progress)rj   stater9   message_key)user_initiatedr  should_continue
continuingidler  goal_continuingmessage_args)rj   r  r9   r  r!  decisioncontinuation_promptgoal_continue)rj   r#  r   r9   r  r!  r"  z0Goal continuation hook failed for session %s: %s)r   rw  )r  r  rk  r  r-  r  r^  z[webui] stream error:
z<[^>]+>r   r1  r!  r  zI[webui] self-heal (except path): retrying stream after credential refresh_agent_kwargszWSkipping stale stream self-heal writeback for session %s stream %s; active_stream_id=%sz0[webui] self-heal (except path): retry succeededz1[webui] self-heal (except path): retry failed: %s)zAuthentication errorr#  zThe selected model may not be supported by your configured provider. Run `hermes model` in your terminal to switch providers, then restart the WebUI.)r&  r   r;   zSSkipping stale stream error writeback for session %s stream %s; active_stream_id=%sz/Failed to append interrupted turn journal eventr   )r   r\   r   rU  r0   r  r$   r^   r   r   r%   r  Eventr   r   r
   r   r   r  r]   r#   begin_sessionr  r  rs  r   r   r   r  rm   r  r>   r?   r  r  r   r  ra  rs   r  r   r  r	   r   r   r   api.profilesrI  rJ  rK  rE   r   rl  rL  r  r   rG   	_ENV_LOCKr  tools.mcp_toolrN  r  rO  rP  r_  r`  rM   rr  hermes_stater  printr   r   r  r  r  r  r6   r   r   r   r   r  r  r  r   r   load_metadata_onlyr4  r  rr   inspect	signature__init__
parametersr/   rq   r  r  r   r  r  r  r  sortedr  r   r  move_to_endapi.session_lifecycler  r  r  r  closer  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r   popitemr   r  r  r  	interruptr  rR  r   ephemeral_system_promptr'   r(   rS  r  r`  r  r-  run_conversationr  r\  rj   r=  rZ  r   r[  rX  r\  r	  r  r!  r  rp  r  r   r@  rs  r/  r  r   r8  rP  rQ  rR  rS  rT  rk   r  parent_session_idr   r   r   r   r"   r  r%  r   compression_anchor_visible_idxr/  compression_anchor_message_keyr*  r1  compression_anchor_summaryr  rt  r|  rC  rh  r&   r  r  r  r  r   r  rw  r   r   roundr  r  r  r"  r#  r  rx  r  r  r  nextr  r  r   api.state_syncr  	api.goalsr  r  r   compactr   r0  rl  r  r  	traceback
format_excr2  r   r  r  dir(&  rj   r  r  rm   rW  r%  r^  r  r  _rtold_cwdold_exec_askold_session_keyr  old_session_platformold_hermes_homeold_profile_envr4  _metering_threadrD  _ckpt_threadprovider_contextrI  rJ  rK  _profile_home_path_profile_home_profile_runtime_env_resolved_profile_namerL  _thread_envrN  _approval_registered_unreg_notify_reg_notifyrT  _clarify_registered_unreg_clarify_notify_reg_clarify_notifyrW  _self_healedrz  r  r  r  r  r  _AIAgentr  r  _state_db_path_db_errresolved_modelr)   r+   r*   r  r  _e_get_config_cfg_prefill_context_prefill_messagesr  	_toolsetsr  r   _session_path_session_meta	_override_ts_errr  _fallback_chain_fallback_seen_fallback_resolved_fallback_key	_fb_entry	_identity_inspect_max_iterations_cfg_raw_max_iterations_agent_cfg_for_iterations_parsed_max_iterations_max_tokens_cfg_raw_max_tokens_agent_cfg_for_tokens_parsed_max_tokens_parse_reff_effort_cfg_effort_raw_reasoning_configr%  r  _jsonr  r  r  	_sig_blob
_agent_sig_cachedr  _evicted_itemsr  evicted_sidevicted_entry_evicted_sid_evicted_entry_evicted_agent_should_close_evicted_agent_lifecycle_commit_lifecycle_has_uncommitted_work_lifecycle_unregister_agent_key
_old_valuer  workspace_system_msg_personality_prompt_pname
_agent_cfg_personalities_pval_parts_pending_started_at_turn_started_at_external_state_messages_previous_messages_previous_context_messages_pre_compression_countr  _process_notifications_agent_msg_textr  r  _answer_mrZ  _result_messages_next_context_messages_raw_content_cleaned_part_all_result_messages	_prev_len_assistant_added	_last_err_err_str_classificationr+  r,  
_err_label	_err_type	_err_hint_heal_result_heal_rt_SAC_SAC_L_heal_all_msgs_heal_ok
_retry_exc_error_payload_error_message_compression_origin_session_id$_compression_continuation_session_id
_agent_sid_compressedr  new_sid_cached_entry_compressorvisible_after_last_marker_raw_idx_mi_visible_before_markervisible_before_anchor_vis_idx
anchor_msg_now_looks_default_looks_provisional_invalid_existing_title_should_bg_title_u0_a0r  r  r  r  r   prev_input_tokensprev_cache_read_tokensturn_input_tokensturn_cache_read_tokensr!  r  rw  display_attachmentsrA   r   	base_text_rm_turn_duration_seconds	_turn_tps_gateway_routing_history_dm_cc_for_saver  _cfg_ctx_len_cfg_custom_providers_model_cfg_for_ctx_raw_cfg_ctx_parsed_cfg_ctx_raw_cp_resolved_cl
_legacy_cl_latest_assistant_idx_latest_assistantr  _load_settingsr  r  r  _get_cl_fb_cl	_sess_lptr  	_leftoverr  r  _goal_decision_last_goal_response	_goal_msg_goal_content_goal_parts
_goal_part
_goal_textr"  _goal_messager#  	_goal_excraw_sessionmeter_statsr  r
  	_stripped
_exc_lowerr  _exc_is_quota_exc_is_rate_limit_exc_is_auth_exc_is_not_found_exc_is_cancelled_exc_is_interrupted
_exc_label	_exc_type	_exc_hint_heal_kwargs_heal_agent_SAC2_SAC2_L_retry_exc2r  r  r  r  r  ri  rq  ro  rt  r  r  r  r  r  r  r  r+  rn  rx  r~  r3  r  r  r  r  ry  r  rf  r;  r  r<  r=  r6  s&  `   `                                                                                                                                                                                                                                                                @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r5   _run_agent_streamingr  u  s   " 	IAy9;;i..y//	 	 	 	a&z9== a a aEy[_`````a  ^	^0*$)++FF   
  	^ 	^ 	^LLMX\L]]]]]	^A
CGLONOO ?$$L	 / /".Y)+I&+-i(,.y)	/ / / / / / / / / / / / / / / E$%3 !"/0c+%(UU"/ / / / / / / / / /./ / / / / / / / / /? ? ? ? ? ? ? ? ?D 
GG)$$$
 _&&N
# 
# 
# 
# 
# 
# 
# 
# !'/?MMM9 9 9 9 9 9 9 92F F F F F FH LKi#-
##)9LLLL$y//4466>>@@AA ) %%''--///,d33 	
 ,3t-j99    	 i i(iIghhhhi i i i i i i i i i i i i i iC9&>?@@@FF '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-OF	,         
 "=!<WQ	SW=X=X!Y!Y 233M#:#:;M#N#N   	, 	, 	,JNN="==M#% '+$$$	, ")It!<!<% 	..@@@@@@)@)@)B)B&& . . .)-&&&. . 	
 
 	&&+&&& 	$%%%
  	B 	BXXCWXXXOjnn^44G:>>*;<<L jnn-ABBOZ^^,?@@N#%:>>2K#L#L  jnn];;OJ2333),Q[)9)9BJ~&,/BJ()/9BJ+,.8BJ*+4;BJ01 
B,9
=) ,7,,T--@-@AAA1	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BR	999999     	 	 	D	  %
	S       / / / / /K
$7888#'   	S 	S 	SLLQRRRRR	S $ $	R       
- - - - -  
,>???"& 	R 	R 	RLLPQQQQQ	R*	 *	 *	X{	BK L O! $(>#3#3a#7"8'(c#*+&
' 
' 
' 
' 
' 
' 
' 
'E E E E E EOc Od O O O O O O O! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !*
 
 
 
 
 
 %&3 ),&,/EE)! ! !     &
 
 
 
 
v v v v v v v v v v v v v v v vpg g g g g g g g g g g g@#l #l #l #l #l #l #l #l #l #l #l #l #lJ %H!">"@"@AAA K222222GT!^$}"5"5
"B"BZ^'i???   qhoqqy}~~~~~~~~~CY+E3CDDD D@N-/@  $]VVVVVVPPPPPPFF,/   $'779#5#5 ( <(+
(;(;%( <(+
(;(;% ] ] ]O2OOW[\\\\\\\\\] Fp!#35FF FB/1B
 =<<<<<;==D:4@@ 0 4 4Z @ @ FBC (9:JKK# #    988888--d33Iw;;;;;;;; +.B.B.B B '')) 
.$+$>$>z$J$JM Ub k7I4 P P PgkI  .$-	 w w wiR\ii`giiquvvvvvvvvvw     0 !O UUN!%!I 
6 
6!2!2488M3J3J!K!K 	6 	6IIMM*55;<<BBDDJJLLIMM'228b99??AAGGIIIMM*55;<<BBDDKKCPPVVXX!I
 !N22 "&&y111#**95555	6 "1!8D '&&& 2 283D E E PQQM #'+&*#EOPTVZE[E[,cDHHWb,A,A,Aac)7>> U*C*G*G*T*T'&.:dD3I3I. +/((;*?*?'&2-01D-E-E*-11.D+ + + +&*###+ #O'"&((<"8"8"*,0HHWb,A,A)!"7>> R*?*C*CL*Q*Q".),_)=)=&)A--*< ' ' '"&')LLLLLL7A$7M7MUdhhw333SUEOP[]aEbEblkoo.@AAAhl$/K$<$<!! ) ) )$(!!!) !$**( !!*1%&!2&.#/'.      %  M2 "]227H7T4E01!66!!"4d;;;+}<<>R:;$557D34'=88:J67 M113I/0=005H5T2E./},,1L.=l+]**,/GGJ,?,?j)--/2wwy/A/Am,]**,/GGFOOj) M113677;L3M3M/0
 %557A34
  RY 11=11MzZZZZ****$$$$TTTTTTTT#&77+<#=#= !KK"(b,-=?OPP%+%+GGJ''-2GGI&&,"GGFOO)r)**'-2#)r&,")2:F9%%%%+23CDD "'R+), "- ( # #	. &__Y-=-=-?-?@@JJLLSbSQ
- } }155jAAG 
}71:#;#; '
+77
CCC%RT^___}LLLLLL*N:u====( } } }"LL)`blw{L|||||}} } } } } } } } } } } } } } } $ 9NN %y&  !&umTBBN % 1 7 7 9 9 9( ! ! ! D!5 F F/33JEEEF F F F F F F F F F F F F F F $$ 3@2C2CD[2\2\E/3@3D3DE]3^3^E0u&;<< ]4A4E4EF[4\4\1u&>?? c7D7H7HIa7b7b4u&788 U0=0A0ABS0T0T-u&BCC k;H;L;LMi;j;j8u&:;; [3@3D3DEY3Z3Z0u&899 W1>1B1BCU1V1V.)]::wuN`?a?a:15m6G6GHZ6[6[6a_a1b1b.".
 #5-88 %U=N=Z% % 1 7 7 9 9 9 9#, % % % $%,7)u&788 201- un55 3-2*u&:;; 8370$H55}55EvHHHHHH&z59999$ v v v%Y[eptuuuuuv%'N1 P P;@*:M+J7+77
CCCFFFFFF!"5669PPP9L9T9TZ_9T9`9`6K*11;2NOOO ""5669PPP	P P P P P P P P P P P P P P P 9G _ _4nvBL^]bBcBc-m^A->->imN:>7-9!|%& %& %& %& %& %& %& %& %& %&
 %6$5l._c$d$d$d$d+J+J<+X+X %L(C(CL(Q(Q(Q(QFK(C'0 !| !| !|BG$?$*LL1]_kvzL${${${${${!|  ; C~?Y^eft  wD  FJ  _K  _K  _W . : @ @ B B B( v v v"LL)WYeptLuuuuuv%OQ]^^^^LL!KZXXX   -2	*,,i1H1O1O1Q1Q,O(@AAAA$ O O O%MNNNNNO$ q q0iQoppppq q q q q q q q q q q q q q qC9.A"BCCC     r"     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-i*                6c!+6F6FGGMPak P P P ! #'Qt44F 9!XXgr22
!+!D!Dnd33 
9.8P8P*62E!%.. 9"'))OR"@"@"[EIIhXZD[D[!\ 99V,, D"MM*B5=*B*BCCC 99W-- F"MM*DE'N*D*DEEE.2ii7O7O67O7O7O.O.O++.1%jj+
 -K#%",&q)T::!"	! !- - -E) #*!-A4"H"H
 7JZ22ty{{'DWQP\^bEcEc'd'd$!%8#;    	" " *I8#'#;  
 * *& *GGa)b)b&%,3T::#Q& &"(
O 
O 
O 
O 
O 
O 
O 
O  )00  @ @???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ %++D-Z^--  L    %G
%S%S"&O% ["(++.Q0F.Q.Q"R"R"X"X"Z"Z;M?\girx|}}}L++)3%?@Z`d%e%e%e"%- ,  F ""$$ #/$((***+ %%b%111 i5a8888$ i i0eDDDDi@ ! )-:26)++.9!" !"     ) i i i"LL)XcgLhhhhhii i i i i i i i i i i i i i i Hy*=>???l     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-_%  "6::j#9#9#?R@@  B!"d++ v+0M0M"%bffY&;&;"<"<F.8fjjQ[]_F`F`aa./!DD!%%	     $/$((***"NNNLL((//4/@@@@    DB     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-w$  + $$&&&'!!"!---""$$   e e,Q%@@@@e<L%)6.2ikk*5     % e e e%T_cdddddee e e e e e e e e e e e e e e Hy*=>???X     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-M$  w
q w
q  )Ea)S)S Fq(SS X#A|Z@@%    k#A|Z@@%#A'94@@	   w
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-m# $*::j#9#9#W=W &&(( ,Q%@@@@e<L%)6.2ikk*5     % e e e%T_cdddddeC9.A"BCCCAw
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-K# *E.$* *& *K.** *& &CCY%Z%Z"G&.78JL\]]	 
 * 
Y 
YB!"d++ 	Yv+0M0M')vvi'8'8%lC88 Y'<\'J'JH'<77089'd;; Y)5 Y Y#-eT#:#: !Yz%))TZJ[J[]`?a?a !Y4I%PV-4X4XE&M (.zz*'='='C$ :;;	#L(.$ $  ( t t#**,, 0iHHHH( mm D$%L$-1>6:ikk2=%& %&!" !" !" !" $- m m m &-\gk l l l l lmHy2E&FGGGIw
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-C! !(}d C C `vzzRYGZGZ `^`I1:Bs9~~~H&> !+/>>'9' ' 'O
 !0 7;L LI.v6/IH  m<%4W%=
$3F$;	$3F$;		! i<, i< (,#@-3Z$ $ $/"KK(efff"*C/7||I/F/F,#4 M4<LL4L4L 1#4 M4<LL4L4L 1U 13CEVV VR-/?AR 8HM)48IM*55CM'28IM*50MAACK<<PaCbCb.? @$,H$=$=}$=$=E!- C C=B	 :C C C C C C C C C C C C C C Crrrrrrrr!' = =49:3FZ 0 $ 0 0 < < <= = = = = = = = = = = = = = = ,0L*/K1/4/E/E1=3G9STntx9y9y9y,69A 0F 0" 0" 2>1A1A*1M1M1SQS+CNT]+^+^+mbm#, 1 1 1 &$NPZ!" !" !" ,1	1
  (  8L,D)5 4:::j3I3I3gMg 09T$>$4:" :" 6 :[$>$::" :" 6 6SSi5j5j 2-W$6$>$?@RTd$e$e$,	." ."
 48 0/ )@J(7I!N &
 " <%<
$3	J "	 &5W%=
$3F$;	$3F$;	 ( ) )@$8:(8(8(8%%* *
 J777 DAFFF-1*15.02-/3,$/'zJ'z'zN<N<Ny<Y<Y<g]g'z'znw'z'z'z),TY[[)9)9&*	* * *--i88 [AOPYAZN+=>$33G]N+CDD&-77G]N+CD
)).999!FFHHHH( ! ! ! D!
 Ow
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-_ 2<.7;4$UL$??
# >'*
":":(G(G5<2;B8#*AL 9 )? $:	]2G  " 7q'BBB +2A' F F"h..08W0E0EHW-F F F F F F F F F F F F F F F 2 ? ?7B+G4+/>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 YXXXXXXX1 I I(;(?(?(N(N( I;H/8I I I I I I I I I I I I I I I #'K" +")%1Et"L"LK" +w{<OQR'S'SVl'l'l&* B$?
]a$b$b$bM ,0(#,QZ#8#8 7 7R9"== 7360+71LJ'<(<'<=PT2 2 2. <?q#F\B]B]`aBa;b;b8^#A|S990 677<    *E.* * * * D?B1c.FYFY\]F]?^?^A<<* D?@A<<?CA<R#A|S993AHC///q@A@`@lA<<rt	   '(&FO&2}2[^_l[m[mImIm%2?%C

& *%22%6

%)
GQ[7
CCCW[ 4 4I:1:FF R=a>PQQ4 4A0 <C?@|<C&D*H*N3W#Y!5!5!7!7' '    y{{* 4 4B!"d++ 4BFF;4G4G 4PRPVPVW\P]P] 4*-d));7j((AGz,A,A,A(QW==AG"#'Z"7"_17j;P"_XYX_T_%:17AJ%O%O"*H*Q*Q'#T'9T=T b$Q(=uEEE`I` ! # D7
CCHC  'u.EqIINQ '/JA N N SRS!(0Ld!S!S$+E3NPQ$R$R$WVW!%,U4PRS%T%T%YXY"$+A~q$A$A$FQ!)04G)K)K)Pq&$'<:K+K$L$L!),Q0ADZ0Z)[)[& %==NP\$]$]!)ABXZk)l)l&!##%1AN 1$$&3AO!-'5A$$q((*;A'%))+=A( ?J$4  
  *%)")-&(*%'+$  	&*k*k*k*k*k'%aj11 & &55==F22&)!%%	2*>*>&?&?G]sw]]7M(N(Nq(Q(W(W(Y(Y(Y  FNI("~88GCRCLH<T<T3F- 0 %
 # "qz "'
33 " "%c400 "SWWV__5S5S/>C,!E1-0dikkEJZD[D[6[-\-\**  1 1 1-0***1 	  X%;a%?%? %eM&:&:=S&SUV W WI#D$2$;e'8	$ $ $  $ ?(8A%#GA/H$$O$O$USUVVHOO$455508A-: "'
33 " "%c400 "SWWV__5S5S389OQR3S3SC0(42;J/ J9I$5 6!E  'u.BDII _'.|=Mq'Q'Q'VUVA$)0?QST)U)U)ZYZA&+2<AUWX+Y+Y+^]^A(  q"2A66 21QQQQQQ'+04-!JTUY[_J`J`1h'21F1F1Ffh.)*<dCC 
-/A/E/EFV/W/W#/#;%-:=l:K:K+:Q+>+>;JL,5z+B %- %- %- )-%- GQQUW[F\F\&fdhh/A&B&B&BbfG)'488 @8? 5( ! ! ! D!'?'?#E7N4HbIIOR#E:r::@b2>%6%<"-B( ( ( ( </;A,$ ! ! !
	!cccccc+5: 'w8L" M M SQS 'z2 > > D", ,L  , @3? 0( ! ! ! D!$     ! qQZ q,0n n n nc!*oo.A2r(J(J n n n- -)
 -8,-J7L,M)q@ ! )-@278I8M8Mk8Z8Z8i^b^g^i^i2j2j?T!" !"     ) q q q"LL)`koLpppppq&&(( ,Q%@@@@e<L%)6.2ikk*5     % e e e%T_cdddddeC9.A"BCCCIw
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-C &&(( ,Q%@@@@e<L%)6.2ikk*5     % e e e%T_cdddddeC9.A"BCCCkw
q w
q w
q w
q w
q w
qV     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B BH '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-a ! ee<L%)4.2ikk;?%z %z %z %zE#aj//A:MrSU4V4V %z %z %z$(<" <"     % e e e%T_cddddde  qqMMMMMM++ALFFFFF$ q q q%RTUT`kopppppqmw
q w
q w
q w
q w
q w
q w
q w
q w
q w
q w
q w
q w
q w
q w
qrCFFFFFF!>##''(:;; AAAAAA&&#$<%&^%8q&'o&:'('7#g&)!*oo !(9d ; ;     C C CABBBBBC !-!."0%6&8%6*@$)*@!$D$D	 	E $(e <+;'( %!5t<<C Y*1#7G*K*K*Pq&',3C9KQ,O,O,TST().5c;OQR.S.S.XWX*+ 99-.. &%XXXXXX#'L,0)FPQUW[F\F\-dTXXgr-B-B-Bbd*%&8$?? )+=+A+ABR+S+SL+7!)69,6G6GO'6':':7F(1:'> !) !) !)$(D!)BLTSWBXBX"b$((+=">">">^b%gt44 <4;1$   !(#E7N4HbIIOR#E:r::@b2>%6%<"-B" " " %   !(#E7N4HbIIOR#E:r::@b" "  928./    D
 99122 <#A';Q??D1	 <2;E./	Y'.u6Ld'S'S$6JT00222PT	 C0&0 #I3 3     Y Y YKZXXXXXY=hOOOOOOOO# ??:Ta+b+b+b %'NN*,'%-aj.>B%?%?  	))T:: %immF>S>SWb>b>b$(1i(D(D%mT:: 	K*,K.; L L
#-j$#?#? !L1;1G1G1d:>>ZcKdKdJ'1 %L(3(:(:3z??(K(K(K26))K2H2H//25m6Ir2J2J/C&0!-#@'A	! !    &>%="+'+%2	& & &N */R #HLL$;$;$Ar B B H H J J  C&019>O1P1P!\V\#0'/||M'B'B'r\iGqGXGXoq(0^(D(D(J$,! !    << 122 *-hll;P.Q.Q.WUW*X*X*^*^*`*`'*  25jAAAO*43F$7'4+3<<+F+F+[J[,4LL,H,H,NB(0. .     h h hOQ[]fggggggggh))++QZz(Z(ZZKC$7$D$DuUUVVV''++--K(2K%""?E:::"";666C
K((( =C =C = 7,S#agm2D2D2J2J2L2LcSXY   %''''
 L<"<=== .ae<<<     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B B     $ K(AK!M*----  K K KLL!IJJJJJK" J'<'HJ))*5555  J J JLL!HIIIIIJ B B(7(=(=(?(? 8 8$D*!)2:>>$+E+E+E+E-7"*T**?BJNN>4$H$H$H$H3:bj0'8I4)P)P)P)P6Bbj!23"*BJNN;OQU,V,V,V,V9Hbj!56!)2:>>:Mt+T+T+T+T8Fbj!45'/@Y[_1`1`1`1`>Rbj!:;"*BJNN=$,O,O,O,O2Abj/B B B B B B B B B B B B B B B B"  N( N( N(')*>*@*@@MMMMa&& F:sG44	F63	2288::	G]]__
27A>>   	}#/$((***+ %%b%111+6+BKK
H^H`H`	 i i,Q)DDDD$ ii@ ! )-:26)++.9!" !"     ) i i i"LL)XcgLhhhhhii i i i i i i i i i i i i i i C9&9:;;;FFF` '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-s (/3DD .f5E^P]L]&v./A+F37HH+F3{B-f5F  h	D(/&*A?SYCZ $-	JJ   d	D(/&*A?SYCZ $-	JJ  `	D Ni8%+Z  'KK klll#'L"C'/||I'>'>$, E,4LL,D,D), E,4LL,D,D)Mw)+;=NN NJ%'79J ;JSUU:R:R4#6#6#6XZL.>L+/@L,,:L)/@L,(M99:B,,GX:Y:Y%67"*(":":\":":K% A A5@	2A A A A A A A A A A A A A A Allllllll  6 6-8*,Ej)))*5556 6 6 6 6 6 6 6 6 6 6 6 6 6 6 #(K+i'2'C'C)5+?1KLflp1q1q1q$.19 (D ( ( =/; 0 4 4 6 6 6+7 , 1 1" 1 = = =7B7NT^TjTlTlI!* ) )'0 !+9UVWYb9c9c !+$*KK )B(/<(L(L(1(/3Et(L(L	%& %& %& %+) ) ) ) ) ) ) ) ) )T '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-W 4@3C3CJ3O3O3mSm 09T$>@P:" :" 6 :[$>$::" :" 6 6SSi5j5j 2-W$6$>$?@RTd$e$e$,	." ."
 !"1) ) ) ) ) ) ) ) ) ) ) ) ) ) )2 $VWWW` '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-s % i i i'Z\ghhhhhhhhi0,J	99
  		D(/&*A?SYCZ $-	JJ  	D"5 	D(/&*A?SYCZ $-	JJ 0D,J	90)YOO=+ $$&&&'!!"!--- (3'>JDZD\D\I +g +g  )Ea)S)S KKm<<<!#5t<<	   +g +g +g +g +g +g +g +g +g +gb '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-e <A>>>%)")-&(*%'+$'^J^^N4F4Fy4Q4Q4\U\^^  {D  cLbvjsbvbvbvbv  JL   M!$TY[[!1!1"	" " "%%i00 S9G	9RN#56++?UN#;<<-//?UN#;<
!!.111FFHHHH    D  gg<L%)6.2ikk*3     % g g g%VaefffffgU+g +g +g +g +g +g +g +g +g +g +g +g +g +g +gX 	J'''''''']N(f '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- '  """#b)))MA1488IEEA5t<< Fi|<<<<'9kBBB 		- 		-K	4(((Y---	4000#It444!%i666"&y$777#It444 $Y555!),,,		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		- 		-s  "B4 4*C! C!'%D &D65D6'*FF!$F!C*FH -NFH NFH NFH <B8TTT?U FH .V =FH ?V  FH V) (FH )V85FH 7V88A
FH E/]=1FH =^FH ^FH 	^ FH 
^'$FH &^''FH /_ FH $_30FH 2_33FH ;` FH $`?<FH >`??FH D(E2 0(f E2 
g#f<7E2 <g&E2 (Ai E2 
i-i(#E2 (i--A<E2 *Al= <E2 =
m(m#E2 #m((FE2 ;Bv E2 v)&E2 (v))E2 /A0x  E2  x/,E2 .x//E2 3A*z E2 z-*E2 ,z--IE2 C>AAF)EAE0E/AF)E0'AFFAF)FAFFAF)FE2 F)AF-F-E2 F0AF-F12E2 G$,AH HE2 H
AHHE2 HAHHE2 H#AIH:E2 IAI
I
E2 IAI
IF"E2 O1AP PE2 P
APPE2 PAPPA"E2 Q<AR RE2 R'AR:R7E2 R9AR:R:E2 SA<AU	T=E2 U	AUUE2 UAUUE2 U$AXV1AV4V3AXV4)AW WAXWAW W 1AXXE2 X'AX<X9E2 X;AX<X<AE2 Y>6AkZ5A[[Ak[$A[3[0Ak[2A[3[3Ak[9A\\Ak\A\	\Ak\ A\	\!Ak\4E2 \?FH ]A]% ]$FH ]%$A^^	FH ^A^^FH ^A^  ^FH ^ $A__FH _A__
FH _E9Aee
FH eAeeFH eAeeFH g5B8Aj:j:Aj>kAj>kE2 kAkkE2 kAkkJE2 uAvu6E2 vAvvE2 v	Avv
DE2 zA|z3,A{ {A|{ &A|	|A||A|	|	A||E2 |A||E2 |A|| E2 |3FH }A} }FH }$A~ }=FH }?A~ ~ FH ~A~ ~FH ~$A~;~8FH ~:A~;~;
FH E9BE
D>FH E
BEEFH EBEEFH G)B8BJ.J.BJ2J5BJ2J;CE2 N 3BN4 N3E2 N4
BON>E2 O BOOE2 OFH OBO+ O*FH O+$BPPFH PBPPFH PBP& P%FH P&$BQQ
FH QBQQ
FH QE9BWWFH WBW W FH W#BW W$FH Y;B8B] ] B]]B]]A	E2 ^B`^*,B__B`_&B` _=B`_?B` ` B``E2 `B``E2 `B``E2 `*FH aBa aFH a$Ba7a4FH a6Ba7a7FH a?Bb b
FH b$Bb2b/FH b1Bb2b2
FH b<E9Bih5FH iBiiFH iBii	FH k B8Bn%n%Bn)n,Bn)n2E2 n5BEYq
E2 qFH q/Bq; q:FH q;$Br"rFH r!Br"r"FH r*Br6 r5FH r6$BssFH sBss
FH s'E9By,y FH y,By0y0FH y3By0y4FH |B8BBB?EY@,CA
A	EYA
&CA3A0EYA2CA3A3EYBE2 BFH B+CB7 B6FH B7$CCCFH CCCCFH C&CC2 C1FH C2$CDDFH DCDD
FH D#E9CJ(JFH J(CJ,J,FH J/CJ,J0FH MB8CPPCPPCPPF9EYW,CX W?EYX &CX)X&EYX(CX)X)EYX<E2 YFH Y!CY- Y,FH Y-$CZZFH ZCZZFH ZCZ( Z'FH Z($C[[FH [C[[
FH [E9CaaFH aCa"a"FH a%Ca"a&FH c=B8CggCgg	CggE'EYl6CmmEYmCm	mEYmCm	mEYm#CnnEYnCn	nEYnCn	nEYnACo5o4EYo5
Cp&o?Cp!pEYp!Cp&p&FEYwCwwEYw
Cw%w"EYw$Cw%w%EYw)E2 w4FH xCx xFH x$Cyx>FH y CyyFH y	Cy yFH y$Cy<y9FH y;Cy<y<
FH zE9D@?FH @D@@FH @D@@FH B*B8DE/E/DE3E6DE3E<BEYG>)DH3H'EYH3DH7	H7EYH:DH7	H;EYI#DI5I)EYI5DI9	I9EYI<DI9	I=EYJ
DJ4J(EYJ4DJ8	J8EYJ;DJ8	J<XEYc3Dc7c6EYc7DddEYdDddE;EYj
Dn/jADmk'Dk?k>Dmk?DllDmlDllADmmDn/m
Dm)m&Dn/m(Dm)m)ADn/n.EYn/Dpn;ADo>o=Dpo>
DppDpp
DppDppEYp	DppEYpDppA"EYq?ADssEYs'Ds:s7EYs9Ds:s:+EYt&,DuuEYu&Du<u9EYu;Du<u<EYvE2 vFH v4Dw  v?FH w $Dw'w$FH w&Dw'w'FH w/Dw; w:FH w;$Dx"xFH x!Dx"x"
FH x,E9D~1~%FH ~1D~5~5FH ~8D~5~9FH AB8EDDEDDEDD"=EYE ,EFFEYF&EF6F3EYF5EF6F6EYG	E2 GFH G.EG: G9FH G:$EH!HFH H EH!H!FH H)EH5 H4FH H5$EIIFH IEII
FH I&E9EO+OFH O+EO/O/FH O2EO/O3FH R
B8EUUEUUEUUEYUA2EWWEYW'EW<W9EYW;EW<W<EYXEXXEYX.EYYEYYEYYEYYE2 YEY#Y#E2 Y&EY#Y'E2 Y+BE[2 [1E2 [2%E\\E2 \E\\BE2 ^5
Ed$ _ AEb `E`2 `1Eb `2EaaEb aEaaAEb bEd$ b
EbbEd$ bEbbEd$ b 8Ec cEd$ c=EddEd$ dEdd
Ed$ d#E2 d$
Ed1d.E2 d0Ed1d13E2 e%AEf( f'E2 f(&EggE2 gEggE2 gJEq' q&E2 q'
Erq1ErrE2 rErrD6E2 wFH w(Ew4 w3FH w4$ExxFH xExxFH x#Ex/ x.FH x/$EyyFH yEyy
FH y E9E%FH %E))FH ,E)-FH 2FH@F@@FH@$FA @=FH@?FA A FHAFAAFHA$FA;A8FHA:FA;A;
FHBE9FH
G>FHH
FHHFHHFHHFHHFH HGD& HF~=H&DF~8L2FN-M,FM5M4FN-M5&FNNFN-NFNNFN-N!F~8N-FN1	N1F~8N4FN1	N5F~8OGD& QB8FT$T$FT(T+FT(T1FF~8Z7F[[F~8[F[	[F~8[F[	[F~8[' F\\F~8\F\	\F~8\F\	\F~8\"A;Fn^AFh _3Fn_>GD& bB8FeeFee"Fee(BFh g4Fnh Fh	hFnhFh	hFnh&GD& j>B8FnnFnn
FnnFonFn?n8F~8n?FooB,F~8q2AF~sF~8sGD& u+B8Fx0x0Fx4x7Fx4x=CF~|F|"|!F~|"
F|/|,F~|.F|/|/F~|5,F}"}!F~}"'F~~	F~~F~~F~~F~8~F~	~F~8~"F~	~#F~8~3GD& ~8F~=~=GD& AB8GDDGDD GDD&BGJF;B8GI?I3GJI?GJJGJJGJJGJbodyc                 .   ddl m}m} ddlm} t          |pi                     dd          pd                                          }t          |pi                     dd          pd                                          }|s || d          S |s || d          S |j        5  |j	                            |          }d	d	d	           n# 1 swxY w Y   |s || d
dd	d          S |d         }t          |d          s || d
dd	d          S 	 t          |          }	n # t          $ r  || d
dd	d          cY S w xY wt          |	dd	          pd	}
|
s || d
dd	d          S |j        5  |
|j        v }d	d	d	           n# 1 swxY w Y   |s || d
dd	d          S 	 t!          |                    |                    }nC# t$          $ r6}t&                              d||            || d
d|
d          cY d	}~S d	}~ww xY w || |d	|
d          S )uD  Inject a /steer payload into the active agent for a session.

    Mirrors the CLI's `/steer <text>` command (cli.py:6140-6155):
      - Look up the cached AIAgent for the session (PR #1051's
        SESSION_AGENT_CACHE).
      - Verify a stream is currently active for this session.
      - Call agent.steer(text) — thread-safe, stashes text in
        _pending_steer for application at the next tool-result boundary.

    The agent's loop calls _apply_pending_steer_to_tool_results() at the
    end of every tool batch and appends the steer text to the last tool
    result's content with a marker, so the model sees the steer as part
    of the tool output on its next iteration. The user's stream is NOT
    interrupted.

    If no agent is cached, the agent is too old to support steer, or no
    stream is active, return {"accepted": False, "fallback": "<reason>"}
    so the frontend can fall back to interrupt or queue mode. The
    fallback path is the existing behaviour from PR #1062.

    Returns 200 with {"accepted": bool, "fallback": str|None,
    "stream_id": str|None}.
    r   )jbadconfigrj   r;   r   zsession_id requiredztext requiredNFno_cached_agent)acceptedrl  rW  steeragent_lacks_steersession_not_foundrQ  not_runningstream_deadz'agent.steer() raised for session=%s: %ssteer_error)api.helpersr  r  rs  r  r0   r\   r>   r  r  r  rs  rr  r  r   r   r  r
  r^   r   r   )r  r  r  r  rb  ra  r   cachedrf  r6  rQ  stream_aliver	  r   s                 r5   _handle_chat_steerr  x  s   0 #"""""""""""""
tzr|R006B
7
7
=
=
?
?C
++1r2288::D 3s71222 -s7O,,,		& 3 3)--c223 3 3 3 3 3 3 3 3 3 3 3 3 3 3 /qu:K(,. . / / 	/1IE5'"" /qu:M(,. . / / 	// / / /qu:M(,. . / / 	/ 	/ 	// q"4d;;Ct /qu-(,. . / / 	/		 8 8'4<78 8 8 8 8 8 8 8 8 8 8 8 8 8 8 /qu-(,. . / / 	/;D))** ; ; ;>SIIIqu-(8: : ; ; 	; 	; 	; 	; 	; 	;;
 1W8$46 6 7 7 7sT   $CCCD! !D>=D>-
FF
F!"G 
H+G?9H?HrW  c                   * ddl m} t          }t          }t          }t
          }t          }| |vr6t          |d|          |ur#|j        }|j        }|j        }|j        }|j        }|5  | |vr	 ddd           dS |                    |           }|r|	                                 |                    |           }|r`	 |
                    d           ny# t          $ r<}	ddl}
 |
j        t                                        d|  d|	            Y d}	~	n8d}	~	ww xY wddl}
 |
j        t                                        d	|  d
           	 ddlm} |r!t          |dd          r ||j                   n*# t          $ r t&                              d           Y nw xY w|                    |           }d}|                    | d           |                    | d           |                    | d           |rt          |dd          nd}|                    | d          }|s+t          |d|          }||ur|                    | d          }t+          j        | d          }|s5t          |dt*                    }|t*          ur|                    | d          }t-          j        | g           }|s5t          |dt,                    }|t,          ur|                    | g           }ddd           n# 1 swxY w Y   |r=t/          |          5  	 t1          |          }t3          t          |dd          t4                    sg |_        t9          ||           s<t&                              d|| t          |dd                     d}	 ddd           dS 	 t          |dd          }t          |dd          }t3          |t4          t<          f          rt5          |          ng }t          |dd          pd}t3          |j        t4                    r|j        nd}|r|d}t?          |          D ]4}t3          |t@                    r|                    d          dk    r|} n5d}|S|                    d          }|                    d          pd}t3          |tB                    r||k    r||k    s||v rd}|s@d|tE          tG          j#                              d} |r|| d<   |$                    |            n+# t          $ r t&                              d|           Y nw xY wd|_%        d|_&        g |_'        d|_(        |r|)                                nd}!d}"|!rtddl*}#|#+                    d d|!|#j,        |#j-        z  !          )                                }"|#+                    d"d|"|#j,        |#j-        z  !          )                                }"t]          |o|)                                          }$t]          |          }%t_          |          }&ta          |j                  }'|&rtc          ta          |j                  d#z
  d$d$          D ]}(|j        |(         }t3          |t@                    r|                    d          d%k    r>tC          |                    d          pd          )                                2                                *tg          *fd&th          D                       r|(}' n|"s|$s|%rd%|"dtE          tG          j#                              d'})|$r|)                                |)d(<   |%rt5          |          |)d)<   tk          |j        |)|'*          s|j        6                    |'|)           |&sZ|j        $                    d%to          d+tq          |                    dd+d,tE          tG          j#                              d-           |9                                 n+# t          $ r t&                              d.|           Y nw xY wddd           n# 1 swxY w Y   |rG|rE	 |:                    d/d0dif           n*# t          $ r t&                              d1           Y nw xY wdS )2u/  Signal an in-flight stream to cancel. Returns True if the stream existed.

    Eagerly releases the session lock (pops STREAMS/CANCEL_FLAGS/AGENT_INSTANCES
    and clears session.active_stream_id) so new /api/chat/start requests succeed
    immediately after cancel, even if the agent thread is still blocked.

    The worker thread's finally block uses .pop(key, None), so the double-pop is
    a safe no-op. Session cleanup runs outside STREAMS_LOCK to preserve lock
    ordering (streaming thread does LOCK → STREAMS_LOCK; inverting would deadlock).
    r   r  r   NFr  z%Failed to interrupt agent for stream ro   zCancel requested for stream zM before agent ready - cancel_event flag set, will be checked on agent startup)r^  rj   z,Failed to clear clarify prompt during cancelTr;   r
   r   r   r   zMSkipping stale cancel writeback for session %s stream %s; active_stream_id=%srQ  rR  rS  rT  r   r   r   rO  )r   r   rO  r%  z7Failed to recover pending user message on cancel for %sz)<think(?:ing)?\b[^>]*>.*?</think(?:ing)?>r/  z<think(?:ing)?\b[^>]*>.*r   r  r   c              3       K   | ]}|v V  	d S r~   r   )r   r;  _contents     r5   r   z cancel_stream.<locals>.<genexpr>  s(      ZZww(2ZZZZZZr7   )r   r   r  rO  r  r  r  rA  rJ  rK  z.Failed to clear session state on cancel for %sr6  r9   z#Failed to put cancel event to queue);rs  r  r   r   r	   r
   r   r  r\   r  r7  r^   logging	getLoggerr'  r   r_  r^  rj   r   r  r   r   r   rs  r/   r   r   rX  r	  r   r=  rq   r0   r]   rU  rr   rQ  rR  rS  rT  r>   r2  r   r4  r3  r  r@  r   r  r?   r   r>  r  r  rG  r  r`  r9  )+rW  _live_configstreamscancel_flagsagent_instancespartial_textsstreams_lockflagrf  r  r  re  r<  _emit_cancel_event_cancel_session_id_cancel_partial_textlive_partials_cancel_reasoninglive_reasoning_cancel_tool_calls
live_tools_cs_pending_user_pending_atts_raw_pending_atts_pending_started_msgs_for_recovery
_last_userr  _already_persisted_last_content_last_ts
_user_turnpartial_textr  _re_has_reasoning
_has_tools_cancel_marker_exists_cancel_marker_idx_idx_partial_msgr  s+                                             @r5   cancel_streamr;    s}    +***** GL%O'MLGL)W$M$MU\$\$\&#0&6$8#0	 QC QCG##QC QC QC QC QC QC QC QC
 	** 	HHJJJ  ##I.. 	 34444   !!(++11LILLLL        NNNGh''--Ky K K K  	IKKKKKK 9d;; 9&&u'7888 	I 	I 	ILLGHHHHH	I KK	""! 	It$$$D)))It,,, DIRWUL$???d,00B?? $ 	H#L2GWWMM11'4'8'8B'G'G$15iDD  	F$\3JLabbN%:::$2$6$6y"$E$E!37	2FF! 	C /GI_``J!777%/^^Ir%B%B"cQC QC QC QC QC QC QC QC QC QC QC QC QC QC QCp  rc$%788 q	c q	cpc!"455!'#z4"@"@$GG &#%CL3CCC   KKg*!%7>>	   */&%q	c q	c q	c q	c q	c q	c q	c q	cH'$+C1G$N$NM(/5JD(Q(Q%?IJ[^bdi]j?k?k$sD):$;$;$;qsM'.s4H$'O'O'TST$9CCLRV9W9W)a]a&$ B);)G%)
"*+=">"> & &B)"d33 &v&8P8P-/
 %-2*%1,6NN9,E,EM'1~~k'B'B'GaH  *-== >(N^B^B^#0M#A#A]VcEcEc9=$61 B(.+8-0-=-=0 0J
  - J<I
= 9.55jAAA    LLQ*    
 (,$+/(*,')-& @T[399;;;Y[	 S$$$$ !$(T(*L.1j3>.I !( !K !KKP577 
 !$(C(*I.1j3>.I !( !K !KKP577  "&&7&U<M<S<S<U<U!V!V!"455
(B3(G(G%%(%6%6"( " %c#,&7&7!&;R D D " " \$/)"d33 %rvvf~~7T7T$#&rvvi'8'8'>B#?#?#E#E#G#G#M#M#O#OZZZZBYZZZZZ "15.!E"  $N $N* $N +#,$(%(%5%5	* *L & N4E4K4K4M4M[1! W" ?CCU>V>V%:;
 ;$#5   N
 ++,>MMM - L'' +#:-EcJJ$ $ #',=2H%(%5%5
) 
) 
 
 
 



 c c cMOabbbbbcaq	c q	c q	c q	c q	c q	c q	c q	c q	c q	c q	c q	c q	c q	c q	cf  @a @	@LL(Y0C$DEFFFF 	@ 	@ 	@LL>?????	@ 4s   'K6:AK6=CK6
D2DK6D3K6)E76K67$FK6FEK66K:=K:`6A8_?E(T_?%T-*_?,T--K_?>`6?%`'$`6&`''`66`:=`:a   $bb)rW   r~   )r;   )rA  N)r,   N)NN)r;   r;   r;   )r  )r&  )ri  )__doc__r!  r  r   r  r  r   r  r2  r   rj  r   r  rU  rC  r  rZ  r   typingr   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  r   r    api.compression_anchorr!   r"   api.meteringr#   api.run_journalr$   api.turn_journalr%   	api.usager&   r  r'   r(   Lockr)  r2   r0   r   r6   r  rB   rG   rK   rI   rE   rM   rV   r]   rb   r>  r>   r   rq   ry   r   compiler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r/  r8  r@  rG  rV  r\  ra  rr  rs  rt  api.workspaceru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  	frozensetr  bytes__annotations__r  r  r-  r7  r@  rD  rC  rK  rW  rX  r]  r^  rP  rR  rY  rb  rh  rj  rn  rv  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rV  rY  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r!  r#  r%  r*  r/  r1  r3  r7  r9  r;  rN  rQ  rS  rU  rX  r\  rp  rs  _TOOL_RESULT_SNIPPET_MAX_LIVE_TOOL_PROMPT_DELTA_MAX_LIVE_TOOL_PROMPT_TURN_MAXrz  r  r  r  r  r  r  r  r  rP  r  r  r  r  r  r  r  r;  r   r7   r5   <module>rL     s'                				  				  



                          		8	$	$                                                        : 9 9 9 9 9 9 9 ] ] ] ] ] ] ] ]       , , , , , , A A A A A A . . . . . . ^ ^ ^ ^ ^ ^ ^ ^ IN	% BTzBDjB TzB 3:sTz3:-.	B B B B@ s t       0!!!!!!!   GGG  $3 4    .
 
c 
C 
 
 
 
 V  
EGG 8D> c    @ '+7 7 7d^7 	7 7 7 7 BJB  )c )c ) ) ) )d4j     s t      ' k k k k k AGV^ 	Y 	Y 	Y# 	Y# 	YPS 	Ycg 	Y 	Y 	Y 	Y %    
DI 
 
 
 
5s 5tDz 5 5 5 5 "zt "z "z "z "z "zL #'% %$%	% % % %(D T    4 S T    >s    +# + + + +f fS4Z f3 f f f f
f;u f; f; f;c f; f;Y] f; f; f; f;R S C s D     4    2 S #PT* `c     8I    T    0
V 
V 
V 
V <AQb 	H 	H 	HD 	H3 	Hgk 	H 	H 	H 	H.c . . . .^ / . . . . . . . , , , , , ,
 onn * # # # # ! ! !   
 
 
C C C CL   B  Z] mp uy    &d s    &RC RD R R R R63 649 6 6 6 6r"S " " " " $)[M22Y~..y+''y+''Y~&&9k]##
)_%
&
&4 4d54<3/0   $ c d    , 4  C        F uy C> C> C>C C>3 C>`c C>mq C> C> C> C>L     2% % % % % %PC C    $      <C < < < < "rz"QRR (bj)GHH %2:&QRR ","*-G"H"H E E E E E EGC GC G G G G BG   # $ 3    ]D ] ] ] ]* ,  ,  ,F, , ,8
 
 
S    	  	 4 	  	  	  	 c 3 5d3i;P    27 7 7 7S 7RV 7 7 7 7t    Pt P P P P      0 s  C Y\    N NS Nc NRU N_b N N N N     &# $    ,
c 
 
 
 
$s $ $ $ $ 27 ( ( ($ (5c? ( ( ( (D F% F%F%F% F% 	F%
 F% 8C=#F% F% F% F%Rk03 k0 k0PUV^_bVcehVhPi k0 k0 k0 k0\/C /QT /Y^_ghk_lnqsv_vYw / / / /3ty 3 3 33 3 3mq 3  D  EM  NQ  ER  TW  Y\  E\  ] 3 3 3 3@ S # s X[ or   }A    &M S M # M (SV- M  M  M  M `Fc Fd F F F F
S< S<S S<S S<RU S<jm S< S< S< S<l<b <bc <bc <bSV <bgj <b <b <b <b~WW3 WW4 WW WW WW WWt  .  2$    (6 6 6 6 6& 9= @ @ @ @ @ @ @F  D  (( ( (V  (" " "# # #L      &9 9 9*$ $ $N) ) )P P P
. . .
 
C$J 
s 
S4Z 
 
 
 
O O O$	 	 	  (  	& 	& 	&5 5 5% % %P  *  Y Y YW W W, , ,^  D^b    $    % #  =X % % %c %\_ % % % %,  !*#$.        
 
  !    
       F ,D  S      S     # #    E E E EP     > \`    cTXj dh    &  "D " " " "J
 
 
>: : :zO3 O O O OIt I I I I IX-M -M -M -Ml p'- p'- p'- p'- p'- p'-FPI7d I7t I7 I7 I7 I7XpS pT p p p p p ps   
D DD