§
    ¦¨îiR
 ã                   ód  — 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 ej	        e
¦  «        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ZddlZddlmZmZmZmZ ddlmZm Z m!Z! ddl"m#Z# ddl$Z$ddl%m%Z% ddl&m'Z' dd	l(m)Z) dd
l*m+Z+ ddl,m-Z-m.Z.  e)¦   «         Z/ e'e0¦  «        j1        dz  Z2 e+e/e2¬¦  «        Z3e3re3D ]Z4e 5                    de4¦  «         Œne 5                    d¦  «         ddl6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<m=Z=m>Z> ddl?m@Z@mAZA ddlBmCZD ddlEmFZF ddlGmHZHmIZI ddlJmKZK ddlLmMZMmNZN ddlOmPZPmQZQmRZRmSZSmTZTmUZU ddlVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z` ddlambZb ddlcmdZd ddlemfZf ddlOmgZgmhZhmiZimjZjmkZkmlZlmmZmmnZn ddlompZpmqZq ddlrmsZtmuZvmwZxmyZy dd lzm{Z{m|Z}m~Zm€Z€m�Z‚ dd!lƒm„Z„m…Z…m†Z‡ dd"lˆm‰Z‰mŠZŠm‹Z‹mŒZŒm�Z�  G d#„ d$¦  «        ZŽd%ee�         fd&„Z�d'ee�         d%ee�         fd(„Z‘dcd)„Z’ G d*„ d+¦  «        Z“ e”d,h¦  «        Z• e”h d-£¦  «        Z– e”h d.£¦  «        Z—d/Z˜ ej™        d0ejš        ¦  «        Z› ej™        d1¦  «        Zœd2e�d%e�fd3„Zžd%e�fd4„ZŸd5e�d6e d%e'dz  fd7„Z¡d8e'd9e'd%e�fd:„Z¢ ej™        d;¦  «        Z£d<e�d%e�fd=„Z¤d>ed%e�fd?„Z¥d@e¦d%e�fdA„Z§dBe�d%e�fdC„Z¨dddEe�d5e�d%e�fdF„Z©d<e�d%e�fdG„Zªd@e¦d%e�fdH„Z«dIe¦d%e�fdJ„Z¬d>ed%e�fdK„Z­dLZ®d%e fdM„Z¯d%e�fdN„Z°d%e fdO„Z± G dP„ dQ¦  «        Z²	 	 	 	 	 	 	 	 	 	 	 	 dedVe�dWe�dXe�d'e�dYe³dZe�d[e�d\e�d]e�d^e�d_e�d`e³fda„Z´e
dbk    r e$jµ        e´¦  «         dS dS )fao  
AI Agent Runner with Tool Calling

This module provides a clean, standalone agent that can execute AI models
with tool calling capabilities. It handles the conversation loop, tool execution,
and response management.

Features:
- Automatic tool calling loop until completion
- Configurable model parameters
- Error handling and recovery
- Message history management
- Support for multiple model providers

Usage:
    from run_agent import AIAgent
    
    agent = AIAgent(base_url="http://localhost:30000/v1", model="claude-opus-4-20250514")
    response = agent.run_conversation("Tell me about the latest Python updates")
é    N)ÚSimpleNamespace)ÚListÚDictÚAnyÚOptional)ÚurlparseÚparse_qsÚ
urlunparse)ÚOpenAI)Údatetime)ÚPath)Úget_hermes_home)Úload_hermes_dotenv)Úget_provider_request_timeoutÚget_provider_stale_timeoutz.env)Úhermes_homeÚproject_envz$Loaded environment variables from %sz7No .env file found. Using system environment variables.)Úget_tool_definitionsÚget_toolset_for_toolÚhandle_function_callÚcheck_toolset_requirements)Ú
cleanup_vmÚget_active_envÚis_persistent_env)Úmaybe_persist_tool_resultÚenforce_turn_budget)Úset_interrupt)Úcleanup_browser)Úbuild_memory_context_blockÚsanitize_context)Újittered_backoff)Úclassify_api_errorÚFailoverReason)ÚDEFAULT_AGENT_IDENTITYÚPLATFORM_HINTSÚMEMORY_GUIDANCEÚSESSION_SEARCH_GUIDANCEÚSKILLS_GUIDANCEÚbuild_nous_subscription_prompt)
Úfetch_model_metadataÚestimate_tokens_roughÚestimate_messages_tokens_roughÚestimate_request_tokens_roughÚget_next_probe_tierÚparse_context_limit_from_errorÚ(parse_available_output_tokens_from_errorÚsave_context_lengthÚis_local_endpointÚquery_ollama_num_ctx)ÚContextCompressor)ÚSubdirectoryHintTracker)Úapply_anthropic_cache_control)Úbuild_skills_system_promptÚbuild_context_files_promptÚbuild_environment_hintsÚload_soul_mdÚTOOL_USE_ENFORCEMENT_GUIDANCEÚTOOL_USE_ENFORCEMENT_MODELSÚ!GOOGLE_MODEL_OPERATIONAL_GUIDANCEÚOPENAI_MODEL_EXECUTION_GUIDANCE)Úestimate_usage_costÚnormalize_usage)Ú"_derive_responses_function_call_idÚ_deterministic_call_idÚ_split_responses_tool_idÚ_summarize_user_message_for_log)ÚKawaiiSpinnerÚbuild_tool_previewÚget_cute_tool_messageÚ_detect_tool_failureÚget_tool_emoji)Úconvert_scratchpad_to_thinkÚhas_incomplete_scratchpadÚsave_trajectory)Úatomic_json_writeÚbase_url_host_matchesÚbase_url_hostnameÚenv_var_enabledÚnormalize_proxy_urlc                   ó:   — e Zd ZdZdZd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
Ú_SafeWriterup  Transparent stdio wrapper that catches OSError/ValueError from broken pipes.

    When hermes-agent runs as a systemd service, Docker container, or headless
    daemon, the stdout/stderr pipe can become unavailable (idle timeout, buffer
    exhaustion, socket reset). Any print() call then raises
    ``OSError: [Errno 5] Input/output error``, which can crash agent setup or
    run_conversation() â€” especially via double-fault when an except handler
    also tries to print.

    Additionally, when subagents run in ThreadPoolExecutor threads, the shared
    stdout handle can close between thread teardown and cleanup, raising
    ``ValueError: I/O operation on closed file`` instead of OSError.

    This wrapper delegates all writes to the underlying stream and silently
    catches both OSError and ValueError. It is transparent when the wrapped
    stream is healthy.
    )Ú_innerc                 ó>   — t                                | d|¦  «         d S )NrT   )ÚobjectÚ__setattr__)ÚselfÚinners     ú+/home/div/.hermes/hermes-agent/run_agent.pyÚ__init__z_SafeWriter.__init__‘   s    € Ý×Ò˜4 ¨5Ñ1Ô1Ð1Ð1Ð1ó    c                 ó²   — 	 | j                              |¦  «        S # t          t          f$ r) t	          |t
          ¦  «        rt          |¦  «        ndcY S w xY w©Nr   )rT   ÚwriteÚOSErrorÚ
ValueErrorÚ
isinstanceÚstrÚlen)rX   Údatas     rZ   r_   z_SafeWriter.write”   sb   € ð	=Ø”;×$Ò$ TÑ*Ô*Ð*øÝ�Ð$ð 	=ð 	=ð 	=Ý *¨4µÑ 5Ô 5Ð<•3�t‘9”9�9¸1Ð<Ð<Ð<ð	=øøøs   ‚ œ7AÁAc                 ój   — 	 | j                              ¦   «          d S # t          t          f$ r Y d S w xY w©N)rT   Úflushr`   ra   ©rX   s    rZ   rh   z_SafeWriter.flushš   sH   € ð	ØŒK×ÒÑÔÐÐÐøÝ�Ð$ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ �2±2c                 ó4   — | j                              ¦   «         S rg   )rT   Úfilenori   s    rZ   rk   z_SafeWriter.fileno    s   € ØŒ{×!Ò!Ñ#Ô#Ð#r\   c                 óf   — 	 | j                              ¦   «         S # t          t          f$ r Y dS w xY w)NF)rT   Úisattyr`   ra   ri   s    rZ   rm   z_SafeWriter.isatty£   sB   € ð	Ø”;×%Ò%Ñ'Ô'Ð'øÝ�Ð$ð 	ð 	ð 	Ø�5�5ð	øøøs   ‚ ›0¯0c                 ó,   — t          | j        |¦  «        S rg   )ÚgetattrrT   )rX   Únames     rZ   Ú__getattr__z_SafeWriter.__getattr__©   s   € Ý�t”{ DÑ)Ô)Ð)r\   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r[   r_   rh   rk   rm   rq   © r\   rZ   rS   rS   |   s   € € € € € ðð ð$ €Ið2ð 2ð 2ð=ð =ð =ðð ð ð$ð $ð $ðð ð ð*ð *ð *ð *ð *r\   rS   Úreturnc                  óš   — dD ]G} t           j                             | d¦  «                             ¦   «         }|rt	          |¦  «        c S ŒHdS )zÑRead proxy URL from environment variables.

    Checks HTTPS_PROXY, HTTP_PROXY, ALL_PROXY (and lowercase variants) in order.
    Returns the first valid proxy URL found, or None if no proxy is configured.
    )ÚHTTPS_PROXYÚ
HTTP_PROXYÚ	ALL_PROXYÚhttps_proxyÚ
http_proxyÚ	all_proxyÚ N)ÚosÚenvironÚgetÚstriprQ   )ÚkeyÚvalues     rZ   Ú_get_proxy_from_envr‡   ­   sZ   € ð:ð .ð .ˆå”
—’˜s BÑ'Ô'×-Ò-Ñ/Ô/ˆØð 	.Ý& uÑ-Ô-Ð-Ð-Ð-ð	.àˆ4r\   Úbase_urlc                 óº   — t          ¦   «         }|r| s|S t          | ¦  «        }|s|S 	 t          j                             |¦  «        rdS n# t
          $ r Y nw xY w|S )zFReturn an env-configured proxy unless NO_PROXY excludes this base URL.N)r‡   rO   ÚurllibÚrequestÚproxy_bypass_environmentÚ	Exception)rˆ   ÚproxyÚhosts      rZ   Ú_get_proxy_for_base_urlr�   »   s‰   € åÑ!Ô!€EØð ˜ð Øˆå˜XÑ&Ô&€DØð ØˆðÝŒ>×2Ò2°4Ñ8Ô8ð 	Ø�4ð	øåð ð ð Øˆðøøøð €Ls   ©A Á
AÁAc                  ó°   — dD ]R} t          t          | d¦  «        }|�8t          |t          ¦  «        s#t	          t          | t          |¦  «        ¦  «         ŒSdS )zHWrap stdout/stderr so best-effort console output cannot crash the agent.)ÚstdoutÚstderrN)ro   Úsysrb   rS   Úsetattr)Ústream_nameÚstreams     rZ   Ú_install_safe_stdior˜   Î   s\   € à+ð ;ð ;ˆÝ�˜k¨4Ñ0Ô0ˆØÐ¥j°½Ñ&EÔ&EÐÝ•C˜¥k°&Ñ&9Ô&9Ñ:Ô:Ð:øð;ð ;r\   c                   ój   — e Zd ZdZdefd„Zdefd„Zd
d„Ze	defd„¦   «         Z
e	defd	„¦   «         ZdS )ÚIterationBudgetua  Thread-safe iteration counter for an agent.

    Each agent (parent or subagent) gets its own ``IterationBudget``.
    The parent's budget is capped at ``max_iterations`` (default 90).
    Each subagent gets an independent budget capped at
    ``delegation.max_iterations`` (default 50) â€” this means total
    iterations across parent + subagents can exceed the parent's cap.
    Users control the per-subagent limit via ``delegation.max_iterations``
    in config.yaml.

    ``execute_code`` (programmatic tool calling) iterations are refunded via
    :meth:`refund` so they don't eat into the budget.
    Ú	max_totalc                 óR   — || _         d| _        t          j        ¦   «         | _        d S r^   )r›   Ú_usedÚ	threadingÚLockÚ_lock)rX   r›   s     rZ   r[   zIterationBudget.__init__å   s#   € Ø"ˆŒØˆŒ
Ý”^Ñ%Ô%ˆŒ
ˆ
ˆ
r\   rx   c                 ó¤   — | j         5  | j        | j        k    r	 ddd¦  «         dS | xj        dz  c_        	 ddd¦  «         dS # 1 swxY w Y   dS )z7Try to consume one iteration.  Returns True if allowed.NFé   T)r    r�   r›   ri   s    rZ   ÚconsumezIterationBudget.consumeê   s¼   € àŒZð 	ð 	ØŒz˜Tœ^Ò+Ð+Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆJŒJ˜!‰OˆJŒJØð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆA§AÁA	ÁA	Nc                 ó|   — | j         5  | j        dk    r| xj        dz  c_        ddd¦  «         dS # 1 swxY w Y   dS )z6Give back one iteration (e.g. for execute_code turns).r   r¢   N)r    r�   ri   s    rZ   ÚrefundzIterationBudget.refundò   sˆ   € àŒZð 	 ð 	 ØŒz˜AŠ~ˆ~Ø�
”
˜a‘�
”
ð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 ð 	 ð 	 s   ˆ1±5¸5c                 ó   — | j         S rg   )r�   ri   s    rZ   ÚusedzIterationBudget.usedø   s
   € àŒzÐr\   c                 ó~   — | j         5  t          d| j        | j        z
  ¦  «        cd d d ¦  «         S # 1 swxY w Y   d S r^   )r    Úmaxr›   r�   ri   s    rZ   Ú	remainingzIterationBudget.remainingü   s„   € àŒZð 	7ð 	7Ý�q˜$œ.¨4¬:Ñ5Ñ6Ô6ð	7ð 	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7s   ˆ2²6¹6©rx   N)rr   rs   rt   ru   Úintr[   Úboolr£   r¥   Úpropertyr§   rª   rw   r\   rZ   rš   rš   Ö   s¶   € € € € € ðð ð& #ð &ð &ð &ð &ð
˜ð ð ð ð ð ð  ð  ð  ð ð�cð ð ð ñ „Xðð ð7˜3ð 7ð 7ð 7ñ „Xð7ð 7ð 7r\   rš   Úclarify>   Ú	read_fileÚ
skill_viewÚ
web_searchÚskills_listÚweb_extractÚha_get_stateÚsearch_filesÚsession_searchÚvision_analyzeÚha_list_entitiesÚha_list_services>   Úpatchr°   Ú
write_fileé   zÇ(?:^|\s|&&|\|\||;|`)(?:
        rm\s|rmdir\s|
        cp\s|install\s|
        mv\s|
        sed\s+-i|
        truncate\s|
        dd\s|
        shred\s|
        git\s+(?:reset|clean|checkout)\s
    )z[^>]>[^>]|^>[^>]Úcmdc                 ó~   — | sdS t                                | ¦  «        rdS t                               | ¦  «        rdS dS )zJHeuristic: does this terminal command look like it modifies/deletes files?FT)Ú_DESTRUCTIVE_PATTERNSÚsearchÚ_REDIRECT_OVERWRITE)r¾   s    rZ   Ú_is_destructive_commandrÃ   -  sJ   € àð ØˆuÝ×#Ò# CÑ(Ô(ð ØˆtÝ×!Ò! #Ñ&Ô&ð ØˆtØˆ5r\   c           	      óš  ‡— t          | ¦  «        dk    rdS d„ | D ¦   «         }t          d„ |D ¦   «         ¦  «        rdS g }| D �]}|j        j        }	 t	          j        |j        j        ¦  «        }n:# t          $ r- t          j	        d||j        j        dd…         ¦  «         Y  dS w xY wt          |t          ¦  «        s+t          j	        d|t          |¦  «        j        ¦  «          dS |t          v rIt          ||¦  «        Š‰€ dS t          ˆfd	„|D ¦   «         ¦  «        r dS |                     ‰¦  «         Œû|t"          vr dS �Œ	d
S )z?Return True when a tool-call batch is safe to run concurrently.r¢   Fc                 ó&   — g | ]}|j         j        ‘ŒS rw   ©Úfunctionrp   ©Ú.0Útcs     rZ   ú
<listcomp>z2_should_parallelize_tool_batch.<locals>.<listcomp>=  s   € Ð8Ð8Ð8 r�"”+Ô"Ð8Ð8Ð8r\   c              3   ó(   K  — | ]}|t           v V — Œd S rg   )Ú_NEVER_PARALLEL_TOOLS)rÉ   rp   s     rZ   ú	<genexpr>z1_should_parallelize_tool_batch.<locals>.<genexpr>>  s(   è è € Ð
@Ð
@¨Tˆ4Õ(Ð(Ð
@Ð
@Ð
@Ð
@Ð
@Ð
@r\   u@   Could not parse args for %s â€” defaulting to sequential; raw=%sNéÈ   u6   Non-dict args for %s (%s) â€” defaulting to sequentialc              3   ó8   •K  — | ]}t          ‰|¦  «        V — Œd S rg   )Ú_paths_overlap)rÉ   ÚexistingÚscoped_paths     €rZ   rÎ   z1_should_parallelize_tool_batch.<locals>.<genexpr>Y  s-   øè è € ÐXÐX¸X•> +¨xÑ8Ô8ÐXÐXÐXÐXÐXÐXr\   T)rd   ÚanyrÇ   rp   ÚjsonÚloadsÚ	argumentsr�   ÚloggingÚdebugrb   ÚdictÚtyperr   Ú_PATH_SCOPED_TOOLSÚ_extract_parallel_scope_pathÚappendÚ_PARALLEL_SAFE_TOOLS)Ú
tool_callsÚ
tool_namesÚreserved_pathsÚ	tool_callÚ	tool_nameÚfunction_argsrÓ   s         @rZ   Ú_should_parallelize_tool_batchræ   8  s¬  ø€ å
ˆ:�„˜!ÒÐØˆuà8Ð8¨ZÐ8Ñ8Ô8€JÝ
Ð
@Ð
@°ZÐ
@Ñ
@Ô
@Ñ@Ô@ð Øˆuà!#€NØð ñ ˆ	ØÔ&Ô+ˆ	ð	Ý œJ yÔ'9Ô'CÑDÔDˆMˆMøÝð 	ð 	ð 	ÝŒMØRØØÔ"Ô,¨T¨c¨TÔ2ñô ð ð
 �5�5�5ð	øøøõ ˜-­Ñ.Ô.ð 	ÝŒMØHØÝ�]Ñ#Ô#Ô,ñô ð ð
 �5�5àÕ*Ð*Ð*Ý6°yÀ-ÑPÔPˆKØÐ"Ø�u�uÝÐXÐXÐXÐXÈÐXÑXÔXÑXÔXð Ø�u�uØ×!Ò! +Ñ.Ô.Ð.ØàÕ0Ð0Ð0Ø�5�5ñ 1ð ˆ4s   ÁA1Á12B(Â'B(rä   rå   c                 ó  — | t           vrdS |                     d¦  «        }t          |t          ¦  «        r|                     ¦   «         sdS t          |¦  «                             ¦   «         }|                     ¦   «         r9t          t          j	         
                    t          |¦  «        ¦  «        ¦  «        S t          t          j	         
                    t          t          j        ¦   «         |z  ¦  «        ¦  «        ¦  «        S )z8Return the normalized file target for path-scoped tools.NÚpath)rÜ   rƒ   rb   rc   r„   r   Ú
expanduserÚis_absoluter�   rè   ÚabspathÚcwd)rä   rå   Úraw_pathÚexpandeds       rZ   rÝ   rÝ   d  sÌ   € àÕ*Ð*Ð*Øˆtà× Ò  Ñ(Ô(€HÝ�h¥Ñ$Ô$ð ¨H¯NªNÑ,<Ô,<ð Øˆtå�H‰~Œ~×(Ò(Ñ*Ô*€HØ×ÒÑÔð 4Ý•B”G—O’O¥C¨¡M¤MÑ2Ô2Ñ3Ô3Ð3õ •”—’¥¥D¤H¡J¤J°Ñ$9Ñ :Ô :Ñ;Ô;Ñ<Ô<Ð<r\   ÚleftÚrightc                 ó  — | j         }|j         }|r|s/t          |¦  «        t          |¦  «        k    ot          |¦  «        S t          t          |¦  «        t          |¦  «        ¦  «        }|d|…         |d|…         k    S )z9Return True when two paths may refer to the same subtree.N)Úpartsr­   Úminrd   )rï   rð   Ú
left_partsÚright_partsÚ
common_lens        rZ   rÑ   rÑ   u  sƒ   € à”€JØ”+€KØð J˜[ð Jå�JÑÔ¥4¨Ñ#4Ô#4Ò4ÐI½¸jÑ9IÔ9IÐIÝ•S˜‘_”_¥c¨+Ñ&6Ô&6Ñ7Ô7€JØ�k�z�kÔ" k°+°:°+Ô&>Ò>Ð>r\   z[\ud800-\udfff]Útextc                 óp   — t                                | ¦  «        rt                                d| ¦  «        S | S )zèReplace lone surrogate code points with U+FFFD (replacement character).

    Surrogates are invalid in UTF-8 and will crash ``json.dumps()`` inside the
    OpenAI SDK.  This is a fast no-op when the text contains no surrogates.
    õ   ï¿½)Ú_SURROGATE_RErÁ   Úsub©r÷   s    rZ   Ú_sanitize_surrogatesrý   †  s5   € õ ×Ò˜DÑ!Ô!ð 1Ý× Ò  ¨4Ñ0Ô0Ð0Ø€Kr\   Úpayloadc                 ó0   ‡‡— dŠˆˆfd„Š ‰| ¦  «         ‰S )uu  Replace surrogate code points in nested dict/list payloads in-place.

    Mirror of ``_sanitize_structure_non_ascii`` but for surrogate recovery.
    Used to scrub nested structured fields (e.g. ``reasoning_details`` â€” an
    array of dicts with ``summary``/``text`` strings) that flat per-field
    checks don't reach.  Returns True if any surrogates were replaced.
    Fc                 óž  •— t          | t          ¦  «        r“|                      ¦   «         D ]|\  }}t          |t          ¦  «        r;t                               |¦  «        r t                               d|¦  «        | |<   dŠŒUt          |t          t          f¦  «        r ‰|¦  «         Œ}d S t          | t          ¦  «        rŒt          | ¦  «        D ]~\  }}t          |t          ¦  «        r;t                               |¦  «        r t                               d|¦  «        | |<   dŠŒUt          |t          t          f¦  «        r ‰|¦  «         Œ}d S d S )Nrù   T)	rb   rÚ   Úitemsrc   rú   rÁ   rû   ÚlistÚ	enumerate)Únoder…   r†   ÚidxÚ_walkÚfounds       €€rZ   r  z-_sanitize_structure_surrogates.<locals>._walkŸ  sQ  ø€ å�d�DÑ!Ô!ð 	!Ø"Ÿjšj™lœlð !ð !‘
��UÝ˜e¥SÑ)Ô)ð !Ý$×+Ò+¨EÑ2Ô2ð %Ý$1×$5Ò$5°hÀÑ$FÔ$F˜˜S™	Ø $˜øÝ ­­d |Ñ4Ô4ð !Ø�E˜%‘L”L�Løð!ð !õ ˜�dÑ#Ô#ð 	!Ý'¨™oœoð !ð !‘
��UÝ˜e¥SÑ)Ô)ð !Ý$×+Ò+¨EÑ2Ô2ð %Ý$1×$5Ò$5°hÀÑ$FÔ$F˜˜S™	Ø $˜øÝ ­­d |Ñ4Ô4ð !Ø�E˜%‘L”L�Løð	!ð 	!ð!ð !r\   rw   ©rþ   r  r  s    @@rZ   Ú_sanitize_structure_surrogatesr	  •  s=   øø€ ð €Eð!ð !ð !ð !ð !ð !ð& 
€Eˆ'�N„N€NØ€Lr\   Úmessagesc                 óp  — d}| D �]¯}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t          ¦  «        r;t                               |¦  «        r!t                               d|¦  «        |d<   d}n“t          |t          ¦  «        r~|D ]{}t          |t          ¦  «        rd|                     d¦  «        }t          |t          ¦  «        r:t                               |¦  «        r t                               d|¦  «        |d<   d}Œ||                     d¦  «        }t          |t          ¦  «        r:t                               |¦  «        r t                               d|¦  «        |d<   d}|                     d¦  «        }t          |t          ¦  «        �rs|D �]o}t          |t          ¦  «        sŒ|                     d¦  «        }	t          |	t          ¦  «        r:t                               |	¦  «        r t                               d|	¦  «        |d<   d}|                     d	¦  «        }
t          |
t          ¦  «        rÈ|
                     d¦  «        }t          |t          ¦  «        r:t                               |¦  «        r t                               d|¦  «        |
d<   d}|
                     d
¦  «        }t          |t          ¦  «        r:t                               |¦  «        r t                               d|¦  «        |
d
<   d}�Œq|                     ¦   «         D ]‡\  }}|dv rŒ
t          |t          ¦  «        r;t                               |¦  «        r t                               d|¦  «        ||<   d}ŒZt          |t          t          f¦  «        rt          |¦  «        rd}Œˆ�Œ±|S )a’  Sanitize surrogate characters from all string content in a messages list.

    Walks message dicts in-place. Returns True if any surrogates were found
    and replaced, False otherwise. Covers content/text, name, tool call
    metadata/arguments, AND any additional string or nested structured fields
    (``reasoning``, ``reasoning_content``, ``reasoning_details``, etc.) so
    retries don't fail on a non-content field.  Byte-level reasoning models
    (xiaomi/mimo, kimi, glm) can emit lone surrogates in reasoning output
    that flow through to ``api_messages["reasoning_content"]`` on the next
    turn and crash json.dumps inside the OpenAI SDK.
    FÚcontentrù   Tr÷   rp   rà   ÚidrÇ   r×   >   rp   Úroler  rà   )
rb   rÚ   rƒ   rc   rú   rÁ   rû   r  r  r	  )r
  r  Úmsgr  Úpartr÷   rp   rà   rÊ   Útc_idÚfnÚfn_nameÚfn_argsr…   r†   s                  rZ   Ú_sanitize_messages_surrogatesr  ¶  sw  € ð €EØð 3!ñ 3!ˆÝ˜#�tÑ$Ô$ð 	ØØ—'’'˜)Ñ$Ô$ˆÝ�g�sÑ#Ô#ð 		%­×(<Ò(<¸WÑ(EÔ(Eð 		%Ý*×.Ò.¨x¸ÑAÔAˆC�	‰NØˆEˆEÝ˜¥Ñ&Ô&ð 	%Øð %ð %�Ý˜d¥DÑ)Ô)ð %ØŸ8š8 FÑ+Ô+�DÝ! $­Ñ,Ô,ð %µ×1EÒ1EÀdÑ1KÔ1Kð %Ý'4×'8Ò'8¸À4Ñ'HÔ'H˜˜V™Ø $˜øØ�wŠw�v‰ŒˆÝ�d�CÑ Ô ð 	¥]×%9Ò%9¸$Ñ%?Ô%?ð 	Ý'×+Ò+¨H°dÑ;Ô;ˆC�‰KØˆEØ—W’W˜\Ñ*Ô*ˆ
Ý�j¥$Ñ'Ô'ñ 	%Ø ð %ñ %�Ý! "¥dÑ+Ô+ð ØØŸš˜t™œ�Ý˜e¥SÑ)Ô)ð !­m×.BÒ.BÀ5Ñ.IÔ.Ið !Ý,×0Ò0°¸5ÑAÔA�B�t‘HØ �EØ—V’V˜JÑ'Ô'�Ý˜b¥$Ñ'Ô'ð %Ø Ÿfšf V™nœn�GÝ! '­3Ñ/Ô/ð %µM×4HÒ4HÈÑ4QÔ4Qð %Ý%2×%6Ò%6°xÀÑ%IÔ%I˜˜6™
Ø $˜Ø Ÿfšf [Ñ1Ô1�GÝ! '­3Ñ/Ô/ð %µM×4HÒ4HÈÑ4QÔ4Qð %Ý*7×*;Ò*;¸HÀgÑ*NÔ*N˜˜;™Ø $˜ùð Ÿ)š)™+œ+ð 		!ð 		!‰JˆC�ØÐ?Ð?Ð?ØÝ˜%¥Ñ%Ô%ð !Ý ×'Ò'¨Ñ.Ô.ð !Ý,×0Ò0°¸5ÑAÔA�C˜‘HØ �EøÝ˜E¥D­$ <Ñ0Ô0ð !Ý1°%Ñ8Ô8ð !Ø �Eøñ		!ð €Lr\   Úrawc                 ó2  — g }d}d}t          | ¦  «        }||k     rè| |         }|r¶|dk    rB|dz   |k     r9|                     |¦  «         |                     | |dz            ¦  «         |dz  }ŒX|dk    rd}|                     |¦  «         nmt          |¦  «        dk     r'|                     dt          |¦  «        d	›�¦  «         n3|                     |¦  «         n|dk    rd
}|                     |¦  «         |dz  }||k     °èd                     |¦  «        S )ug  Escape unescaped control chars inside JSON string values.

    Walks the raw JSON character-by-character, tracking whether we are
    inside a double-quoted string. Inside strings, replaces literal
    control characters (0x00-0x1F) that aren't already part of an escape
    sequence with their ``\uXXXX`` equivalents. Pass-through for everything
    else.

    Ported from #12093 â€” complements the other repair passes in
    ``_repair_tool_call_arguments`` when ``json.loads(strict=False)`` is
    not enough (e.g. llama.cpp backends that emit literal apostrophes or
    tabs alongside other malformations).
    Fr   ú\r¢   é   ú"é    z\uÚ04xTr€   )rd   rÞ   ÚordÚjoin)r  ÚoutÚ	in_stringÚiÚnÚchs         rZ   Ú%_escape_invalid_chars_in_json_stringsr$  ú  s+  € ð €CØ€IØ	€AÝˆC‰Œ€AØ
ˆaŠ%ˆ%Ø�ŒVˆØð 	Ø�TŠzˆz˜a !™e aši˜ià—
’
˜2‘”�Ø—
’
˜3˜q 1™uœ:Ñ&Ô&Ð&Ø�Q‘�ØØ�SŠyˆyØ!�	Ø—
’
˜2‘”��Ý�R‘”˜4’�Ø—
’
Ð.¥ R¡¤Ð.Ð.Ð.Ñ/Ô/Ð/Ð/à—
’
˜2‘”��à�SŠyˆyØ �	Ø�JŠJ�r‰NŒNˆNØ	ˆQ‰ˆð) ˆaŠ%ˆ%ð* �7Š7�3‰<Œ<Ðr\   ú?Úraw_argsc                 óz  — t          | t          ¦  «        r|                      ¦   «         nd}|st                               d|¦  «         dS |dk    rt                               d|¦  «         dS 	 t          j        |d¬¦  «        }t          j        |d¬	¦  «        }||k    rt                               d
|¦  «         |S # t
          j        t          t          f$ r Y nw xY w|}t          j        dd|¦  «        }|                     d¦  «        |                     d¦  «        z
  }|                     d¦  «        |                     d¦  «        z
  }|dk    r|d|z  z  }|dk    r|d|z  z  }t          d¦  «        D ]È}	 t          j        |¦  «          n°# t
          j        $ rž |                     d¦  «        r7|                     d¦  «        |                     d¦  «        k    r|dd…         }nO|                     d¦  «        r7|                     d¦  «        |                     d¦  «        k    r|dd…         }nY  nY ŒÅw xY w	 t          j        |¦  «         t                               d||dd…         |dd…         ¦  «         |S # t
          j        $ r Y nw xY w	 t!          |¦  «        }	|	|k    rCt          j        |	¦  «         t                               d||dd…         |	dd…         ¦  «         |	S n"# t
          j        t          t          f$ r Y nw xY wt                               d||dd…         ¦  «         dS )a§  Attempt to repair malformed tool_call argument JSON.

    Models like GLM-5.1 via Ollama can produce truncated JSON, trailing
    commas, Python ``None``, etc.  The API proxy rejects these with HTTP 400
    "invalid tool call arguments".  This function applies common repairs;
    if all fail it returns ``"{}"`` so the request succeeds (better than
    crashing the session).  All repairs are logged at WARNING level.
    r€   z*Sanitized empty tool_call arguments for %sú{}ÚNonez0Sanitized Python-None tool_call arguments for %sF)Ústrict©Ú,ú:)Ú
separatorsz>Repaired unescaped control chars in tool_call arguments for %sz,\s*([}\]])z\1Ú{Ú}Ú[Ú]r   é2   Néÿÿÿÿu8   Repaired malformed tool_call arguments for %s: %s â†’ %séP   uA   Repaired control-char-laced tool_call arguments for %s: %s â†’ %suP   Unrepairable tool_call arguments for %s â€” replaced with empty object (was: %s))rb   rc   r„   ÚloggerÚwarningrÕ   rÖ   ÚdumpsÚJSONDecodeErrorÚ	TypeErrorra   Úrerû   ÚcountÚrangeÚendswithr$  )
r&  rä   Úraw_strippedÚparsedÚreserialisedÚfixedÚ
open_curlyÚopen_bracketÚ_Úescapeds
             rZ   Ú_repair_tool_call_argumentsrG  $  s   € õ (2°(½CÑ'@Ô'@ÐH�8—>’>Ñ#Ô#Ð#Àb€Lð ð Ý�ŠÐCÀYÑOÔOÐOØˆtð �vÒÐÝ�ŠÐIÈ9ÑUÔUÐUØˆtð
Ý”˜L°Ð7Ñ7Ô7ˆÝ”z &°ZÐ@Ñ@Ô@ˆØ˜<Ò'Ð'Ý�NŠNØPØñô ð ð ÐøÝÔ ¥)­ZÐ8ð ð ð Øˆðøøøð €EåŒF�> 5¨%Ñ0Ô0€Eà—’˜SÑ!Ô! E§K¢K°Ñ$4Ô$4Ñ4€JØ—;’;˜sÑ#Ô# e§k¢k°#Ñ&6Ô&6Ñ6€LØ�A‚~€~Ø��zÑ!Ñ!ˆØ�aÒÐØ��|Ñ#Ñ#ˆå�2‰YŒYð 
ð 
ˆð		ÝŒJ�uÑÔÐØˆEøÝÔ#ð 	ð 	ð 	Ø�~Š~˜cÑ"Ô"ð  u§{¢{°3Ñ'7Ô'7¸%¿+º+ÀcÑ:JÔ:JÒ'JÐ'JØ˜c˜r˜cœ
��Ø—’ Ñ$Ô$ð ¨¯ª°SÑ)9Ô)9¸E¿KºKÈÑ<LÔ<LÒ)LÐ)LØ˜c˜r˜cœ
��à��øøð	øøøðÝŒ
�5ÑÔÐÝ�ŠØFØ�| C R CÔ(¨%°°°¬*ñ	
ô 	
ð 	
ð ˆøÝÔð ð ð Øˆðøøøð
Ý7¸Ñ>Ô>ˆØ�eÒÐÝŒJ�wÑÔÐÝ�NŠNØSØ˜<¨¨¨Ô,¨g°c°r°c¬lñô ð ð ˆNð øõ Ô ¥)­ZÐ8ð ð ð Øˆðøøøõ
 ‡N‚Nð	/à�<   Ô$ñô ð ð
 ˆ4sL   Á/AB> Â>CÃCÅ<FÆB'H?È>H?ÉAJ ÊJÊJÊAK5 Ë5LÌLc                 óV   — |                       dd¬¦  «                             d¦  «        S )zßRemove non-ASCII characters, replacing with closest ASCII equivalent or removing.

    Used as a last resort when the system encoding is ASCII and can't handle
    any non-ASCII characters (e.g. LANG=C on Chromebooks).
    ÚasciiÚignore)Úerrors)ÚencodeÚdecoderü   s    rZ   Ú_strip_non_asciirN  …  s(   € ð �;Š;�w xˆ;Ñ0Ô0×7Ò7¸Ñ@Ô@Ð@r\   c                 óR  — d}| D �] }t          |t          ¦  «        sŒ|                     d¦  «        }t          |t          ¦  «        rt	          |¦  «        }||k    r||d<   d}nut          |t
          ¦  «        r`|D ]]}t          |t          ¦  «        rF|                     d¦  «        }t          |t          ¦  «        rt	          |¦  «        }||k    r||d<   d}Œ^|                     d¦  «        }t          |t          ¦  «        rt	          |¦  «        }||k    r||d<   d}|                     d¦  «        }t          |t
          ¦  «        r‹|D ]ˆ}	t          |	t          ¦  «        rq|	                     di ¦  «        }
t          |
t          ¦  «        rF|
                     d¦  «        }t          |t          ¦  «        rt	          |¦  «        }||k    r||
d<   d}Œ‰|                     ¦   «         D ];\  }}|d	v rŒ
t          |t          ¦  «        rt	          |¦  «        }||k    r|||<   d}Œ<�Œ"|S )
a  Strip non-ASCII characters from all string content in a messages list.

    This is a last-resort recovery for systems with ASCII-only encoding
    (LANG=C, Chromebooks, minimal containers).  Returns True if any
    non-ASCII content was found and sanitized.
    Fr  Tr÷   rp   rà   rÇ   r×   >   rp   r  r  rà   )rb   rÚ   rƒ   rc   rN  r  r  )r
  r  r  r  Ú	sanitizedr  r÷   rp   rà   rÊ   r  r  r…   r†   s                 rZ   Ú_sanitize_messages_non_asciirQ  Ž  s]  € ð €EØð /!ñ /!ˆÝ˜#�tÑ$Ô$ð 	Øà—'’'˜)Ñ$Ô$ˆÝ�g�sÑ#Ô#ð 	)Ý(¨Ñ1Ô1ˆIØ˜GÒ#Ð#Ø!*��I‘Ø�øÝ˜¥Ñ&Ô&ð 	)Øð )ð )�Ý˜d¥DÑ)Ô)ð )ØŸ8š8 FÑ+Ô+�DÝ! $­Ñ,Ô,ð )Ý$4°TÑ$:Ô$:˜	Ø$¨Ò,Ð,Ø+4˜D ™LØ$(˜Eøà�wŠw�v‰ŒˆÝ�d�CÑ Ô ð 	Ý(¨Ñ.Ô.ˆIØ˜DÒ Ð Ø'��F‘Ø�à—W’W˜\Ñ*Ô*ˆ
Ý�j¥$Ñ'Ô'ð 
	-Ø ð 	-ð 	-�Ý˜b¥$Ñ'Ô'ð -ØŸš 
¨BÑ/Ô/�BÝ! "¥dÑ+Ô+ð -Ø"$§&¢&¨Ñ"5Ô"5˜Ý% g­sÑ3Ô3ð -Ý(8¸Ñ(AÔ(A˜IØ(¨GÒ3Ð3Ø2;  ;¡Ø(, øàŸ)š)™+œ+ð 	!ð 	!‰JˆC�ØÐ?Ð?Ð?ØÝ˜%¥Ñ%Ô%ð !Ý,¨UÑ3Ô3�	Ø Ò%Ð%Ø(�C˜‘HØ �Eøñ	!ð €Lr\   Útoolsc                 ó    — t          | ¦  «        S )z7Strip non-ASCII characters from tool payloads in-place.)Ú_sanitize_structure_non_ascii)rR  s    rZ   Ú_sanitize_tools_non_asciirU  É  s   € å(¨Ñ/Ô/Ð/r\   c                 ó0   ‡‡— dŠˆˆfd„Š ‰| ¦  «         ‰S )zCStrip non-ASCII characters from nested dict/list payloads in-place.Fc                 ó&  •— t          | t          ¦  «        ru|                      ¦   «         D ]^\  }}t          |t          ¦  «        rt	          |¦  «        }||k    r|| |<   dŠŒ7t          |t          t
          f¦  «        r ‰|¦  «         Œ_d S t          | t
          ¦  «        rnt          | ¦  «        D ]`\  }}t          |t          ¦  «        rt	          |¦  «        }||k    r|| |<   dŠŒ7t          |t          t
          f¦  «        r ‰|¦  «         Œ_d S d S )NT)rb   rÚ   r  rc   rN  r  r  )r  r…   r†   rP  r  r  r  s        €€rZ   r  z,_sanitize_structure_non_ascii.<locals>._walkÒ  s5  ø€ å�d�DÑ!Ô!ð 	!Ø"Ÿjšj™lœlð !ð !‘
��UÝ˜e¥SÑ)Ô)ð !Ý 0°Ñ 7Ô 7�IØ  EÒ)Ð)Ø$-˜˜S™	Ø $˜øÝ ­­d |Ñ4Ô4ð !Ø�E˜%‘L”L�Løð!ð !õ ˜�dÑ#Ô#ð 	!Ý'¨™oœoð !ð !‘
��UÝ˜e¥SÑ)Ô)ð !Ý 0°Ñ 7Ô 7�IØ  EÒ)Ð)Ø$-˜˜S™	Ø $˜øÝ ­­d |Ñ4Ô4ð !Ø�E˜%‘L”L�Løð	!ð 	!ð!ð !r\   rw   r  s    @@rZ   rT  rT  Î  s;   øø€ à€Eð!ð !ð !ð !ð !ð !ð* 
€Eˆ'�N„N€NØ€Lr\   z0.14.1c                  ó   — ddl m}  dd| › �iS )zGReturn the User-Agent RouterMint needs to avoid Cloudflare 1010 blocks.r   )Ú__version__ú
User-AgentzHermesAgent/)Ú
hermes_clirY  )Ú_HERMES_VERSIONs    rZ   Ú_routermint_headersr]  û  s.   € à9Ð9Ð9Ð9Ð9Ð9ð 	Ð6 _Ð6Ð6ðð r\   c                 ó€   — | €dS |                       ¦   «         sdS t          |                      ¦   «         ¦  «        dk    S )uH  Decide whether to wait for credential-pool rotation instead of falling back.

    The existing pool-rotation path requires the pool to (1) exist and (2) have
    at least one entry not currently in exhaustion cooldown.  But rotation is
    only meaningful when the pool has more than one entry.

    With a single-credential pool (common for Gemini OAuth, Vertex service
    accounts, and any "one personal key" configuration), the primary entry
    just 429'd and there is nothing to rotate to.  Waiting for the pool
    cooldown to expire means retrying against the same exhausted quota â€” the
    daily-quota 429 will recur immediately, and the retry budget is burned.

    In that case we must fall back to the configured ``fallback_model``
    instead.  Returns True only when rotation has somewhere to go.

    See issue #11314.
    NFr¢   )Úhas_availablerd   Úentries)Úpools    rZ   Ú!_pool_may_recover_from_rate_limitrb    sB   € ð$ €|ØˆuØ×ÒÑÔð ØˆuÝˆt�|Š|‰~Œ~ÑÔ Ò"Ð"r\   c                  ó¦   — ddl } dt          › d|                      ¦   «                              ¦   «         › d|                      ¦   «         › d�}|d|dd	œS )
z8Return default HTTP headers required by Qwen Portal API.r   Nz	QwenCode/ú (z; ú)Úenablez
qwen-oauth)rZ  zX-DashScope-CacheControlzX-DashScope-UserAgentzX-DashScope-AuthType)ÚplatformÚ_QWEN_CODE_VERSIONÚsystemÚlowerÚmachine)Ú_platÚ_uas     rZ   Ú_qwen_portal_headersrn    sf   € àÐÐÐà
XÕ(Ð
XÐ
X¨E¯LªL©N¬N×,@Ò,@Ñ,BÔ,BÐ
XÐ
XÀeÇmÂmÁoÄoÐ
XÐ
XÐ
X€CàØ$,Ø!$Ø ,ð	ð ð r\   c            u       ó:  — e Zd ZdZdZedefd„¦   «         Zej        deddfd„¦   «         Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 �d2dededededede	e         dz  dede	e         dz  dede
dedee         dee         dedededede
d ed!ee         d"ee         d#ee         d$ed%ed&ed'ed(ed)ed*ed+ed,ed-ed.ed/ed0ed1ed2ed3e
d4eeef         d5ed6eeef         d7eeeef                  d8ed9ed:ed;ed<ed=ed>ed?ed@edAedBedCdDdEeeef         dFedGe
dHeftdI„ZdJ„ Z�d3dK„ZdL„ ZddMœdNefdO„ZdefdP„ZdefdQ„ZdReddfdS„ZdReddfdT„ZdUedVeddfdW„Zdeeef         fdX„Z�d4dY„Z�d4dZ„Z�d5dedefd[„Z�d5dedefd\„Z defd]„Z!de"eef         fd^„Z#d_e	e$eef                  defd`„Z%defda„Z&dddddbœde'e         de'e         de'e         de'e         de"eef         f
dc„Z(e)dedefdd„¦   «         Z*e)ddeœdede'e         defdf„¦   «         Z+de
de$fdg„Z,dhedefdi„Z-dhedefdj„Z.e)dhedefdk„¦   «         Z/defdl„Z0	 �d5dmed_e'e	         defdn„Z1doedped_eeeef                  defdq„Z2de'e         fdr„Z3dseddfdt„Z4duZ5dvZ6dwZ7e)dxee         dyee         dee         fdz„¦   «         Z8	 	 �d6d{ee         d|ed}eddfd~„Z9dddddœd€e'e         d�e'e         dse'e         d‚e'e         deeef         f
dƒ„Z:d_ee         ddfd„„Z;�d5d_ee         d…ee         fd†„Z<�d5d_ee         d…ee         fd‡„Z=d_ee         dee         fdˆ„Z>defd‰„Z?d_eeeef                  dŠed‹edeeeef                  fdŒ„Z@d_eeeef                  dŠed‹efd�„ZAe)dŽeBdefd�„¦   «         ZCd�e'e         de'e         fd‘„ZDd’edefd“„ZEe)dŽeBdeeef         fd”„¦   «         ZFd•ede'eeef                  fd–„ZGdd—œd˜eeef         d™edŽe'eB         de'eH         fdš„ZIe)dhedefd›„¦   «         ZJ�d5d_eeeef                  fdœ„ZK�d5dReddfd�„ZL�d4dž„ZMdŸedefd „ZNde'e         fd¡„ZOd_e	d¢e
ddfd£„ZPd¤eddfd¥„ZQd¦eddfd§„ZRd¨„ ZSde$fd©„ZT�d5d_e	ddfdª„ZU�d5d_e	ddfd«„ZVd¬ed­ed®eddfd¯„ZW�d4d°„ZX�d4d±„ZYd²eeeef                  ddfd³„ZZedefd´„¦   «         Z[�d5dµedefd¶„Z\e)defd·„¦   «         Z] e^h d¸£¦  «        Z_e)d_eeeef                  deeeef                  fd¹„¦   «         Z`e)dºe	de	fd»„¦   «         Zae)dºe	de	fd¼„¦   «         Zbd½ededz  fd¾„Zcd¿„ Zde)�d7dÁedÂedÃe
defdÄ„¦   «         Zee)dÅede"e'e         e'e         f         fdÆ„¦   «         Zf	 �d5dÇedÈe'e         defdÉ„ZgdefdÊ„ZhdefdË„Zidejjk        fdÌ„Zle)dÍedefdÎ„¦   «         Zme)�d8dedefdÏ„¦   «         ZndÐe$d™edÑedefdÒ„Zoe)dÍede
fdÓ„¦   «         ZpdÍed™edÑeddfdÔ„Zqd™edefdÕ„Zrd™edefdÖ„Zsdefd×„Ztd™edefdØ„ZudÍed™eddfdÙ„Zv�d9d˜e$dÍedÚefdÛ„Zw�d5d˜e$dÍefdÜ„ZxdÝdMœdNedefdÞ„ZydÝdMœdNedefdß„Zzdefdà„Z{defdá„Z|deddfdâ„Z}�d4dã„Z~dddäœdåe'e
         dæedçe'e         dèe'eeef                  de"eef         f
dé„Z€d˜e$fdê„Z��d4dë„Z‚d˜e$fdì„Zƒ�d4dí„Z„dŸeddfdî„Z…e)dŸedefdï„¦   «         Z†dhedefdð„Z‡dñeeef         ddfdò„ZˆdŸeddfdó„Z‰dŸeddfdô„ZŠd½eddfdõ„Z‹defdö„ZŒdd÷œd˜e$dÚefdø„Z��d5d™dùdefdú„ZŽdefdû„Z� e^h dü£¦  «        Z�dýeBdþe
dÿe
def�d „Z‘e)dhedef�d„¦   «         Z’e)�dede"ee'eH         f         f�d„¦   «         Z“�de�dedef�d„Z”dhe�dedef�d„Z•�d5def�d„Z–�de	de	f�d	„Z—def�d
„Z˜def�d„Z™�de	de	f�d„Zšd_e	ddf�d„Z›�de	de$f�d„Zœdef�d„Z�de$dz  f�d„Zždmede$f�d„ZŸdef�d„Z def�d„Z¡�de$�de$ddf�d„Z¢e)�de$de$f�d„¦   «         Z£e)dd�dœd_e	d'ede
f�d„¦   «         Z¤def�d„Z¥d�dd�dœd_e	dµe�de
dse�dede"f�d„Z¦�d7d_e	�d e�d!e
ddf�d"„Z§�d#e$def�d$„Z¨	 �d9�d%e�d#e$�d ed‚e'e         d_e	def�d&„Z©e)�d:�d(edŸe�d)edef�d*„¦   «         Zª�d7d_e	�d e�d!e
ddf�d+„Z«�d7d_e	�d e�d!e
ddf�d,„Z¬d_e	�d!e
def�d-„Z­	 	 	 	 	 �d;doedµed…eeeef                  dse�d.e'e         �d/e'e         deeef         f�d0„Z®�d5dRe�d.e'e         def�d1„Z¯dS (<  ÚAIAgentz¸
    AI Agent with tool calling capabilities.

    This class manages the conversation flow, tool execution, and response handling
    for AI models that support function calling.
    zŠ[hermes-agent: tool call arguments were corrupted in this session and have been dropped to keep the conversation alive. See issue #15236.]rx   c                 ó   — | j         S rg   )Ú	_base_urlri   s    rZ   rˆ   zAIAgent.base_url7  s
   € àŒ~Ðr\   r†   Nc                 óv   — || _         |r|                     ¦   «         nd| _        t          |¦  «        | _        d S ©Nr€   )rr  rj  Ú_base_url_lowerrO   Ú_base_url_hostname©rX   r†   s     rZ   rˆ   zAIAgent.base_url;  s8   € àˆŒØ05Ð=˜uŸ{š{™}œ}˜}¸2ˆÔÝ"3°EÑ":Ô":ˆÔÐÐr\   r€   éZ   ç      ð?Féd   r3  rˆ   Úapi_keyÚproviderÚapi_modeÚacp_commandÚacp_argsÚcommandÚargsÚmodelÚmax_iterationsÚ
tool_delayÚenabled_toolsetsÚdisabled_toolsetsÚsave_trajectoriesÚverbose_loggingÚ
quiet_modeÚephemeral_system_promptÚlog_prefix_charsÚ
log_prefixÚproviders_allowedÚproviders_ignoredÚproviders_orderÚprovider_sortÚprovider_require_parametersÚprovider_data_collectionÚ
session_idÚtool_progress_callbackÚtool_start_callbackÚtool_complete_callbackÚthinking_callbackÚreasoning_callbackÚclarify_callbackÚstep_callbackÚstream_delta_callbackÚinterim_assistant_callbackÚtool_gen_callbackÚstatus_callbackÚ
max_tokensÚreasoning_configÚservice_tierÚrequest_overridesÚprefill_messagesrg  Úuser_idÚ	user_nameÚchat_idÚ	chat_nameÚ	chat_typeÚ	thread_idÚgateway_session_keyÚskip_context_filesÚskip_memoryÚparent_session_idÚiteration_budgetrš   Úfallback_modelÚcheckpoints_enabledÚcheckpoint_max_snapshotsÚpass_session_idc=                 ónG  — t          ¦   «          |	| _        |
| _        |7pt          |
¦  «        | _        || _        || _        || _        || _        || _	        |+| _
        |,| _        |-| _        |.| _        |/| _        |0| _        |1| _        |2| _        d| _        d| _        |3| _        |<| _        |9| _        || _        |r|› d�nd| _        |pd| _        t5          |t6          ¦  «        r:|                     ¦   «         r&|                     ¦   «                              ¦   «         nd}=|=pd| _        |p|| _        tA          |p|pg ¦  «        | _!        |dv r	|| _"        �n| j        dk    rd| _"        nù| j        dk    rd| _"        næ|=€#| j#        dk    rd	| j$        v rd| _"        d| _        nÁ|=€| j#        d
k    rd| _"        d| _        n¥| j        dk    s|=€| j#        dk    rd| _"        d| _        n~| j$         %                    d¦  «         &                    d¦  «        rd| _"        nI| j        dk    s/| j#         '                    d¦  «        rtQ          | j$        d¦  «        rd| _"        nd| _"        	 |  )                    ¦   «          n# tT          $ r Y nw xY w	 ddl+m,}>m-}? | j        |>vr |?| j        | j        ¦  «        | _        n# tT          $ r Y nw xY w|�€| j"        dk    rú| j        dk    rït7          | j        pd¦  «                             ¦   «          '                    d¦  «        s´t7          | j        pd¦  «                             ¦   «          '                    d¦  «        sy|  .                    ¦   «         se|  /                    ¦   «         s!|  0                    | j        | j        ¬¦  «        r0d| _"        tc          | d¦  «        r| j2         3                    ¦   «          | j        dk    s|  4                    ¦   «         r)tk          j6        d„ d¬¦  «         7                    ¦   «          || _8        || _9        || _:        d | _;        || _<        || _=        | | _>        |!| _?        |"| _@        |#| _A        |%| _B        |$| _C        d | _D        d | _E        d| _F        d| _G        d | _H        tk          jI        ¦   «         | _J        d| _K        tk          jL        ¦   «         | _M        t�          ¦   «         | _O        tk          jL        ¦   «         | _P        d| _Q        g | _R        tk          jL        ¦   «         | _S        || _T        || _U        || _V        || _W        || _X        || _Y        || _Z        || _[        |&| _\        |'| _]        |(| _^        t¿          |)pi ¦  «        | _`        |*pg | _a        d | _b        |  c                    ¦   «         \  | _d        | _e        d!| _f        	 dd"lgmh}@  |@¦   «          i                    d#i ¦  «        pi }A|A i                    d$d!¦  «        }B|Bd%v r|B| _f        n# tT          $ r Y nw xY wd | _j        d | _k        tÙ          jl        ¦   «         | _m        d&| _n        d| _o        d| _p        d| _q        dd'lrms}Cmt}D  |Ctê          ¬(¦  «         | j        r% |D¦   «          tì           w                    d)¦  «         n=| j        r6d*D ]3}Etñ          jy        |E¦  «         z                    tð          j{        ¦  «         Œ4d| _|        d | _}        d| _~        d| _        d| _€        i | _�        d| _‚        d | _ƒ        �t	          | j        | j        ¦  «        }F| j"        dk    �rdd+l…m†}Gm‡}H | j        dk    }I|Ir�dd,l…mˆ}J �t          jŠ        d-|pd¦  «        }K|Kr|K ‹                    d.¦  «        nd/}L|L| _Œ         |J|L¦  «        | _‚        d0| _�        || _Ž        d | _ƒ        d0| _�        d| _�        i | _‘        | j        s�t%          d1| j        › d2|L› d3�¦  «         �n¦| j        dk    }M|Mr|p |H¦   «         pdn|pd}N|N| _�        |N| _�        || _Ž        dd4l…m“}O |Mr |O|N¦  «        nd | _ƒ         |G|N||F¬5¦  «        | _‚        d| _�        i | _‘        | j        sU�t%          d1| j        › d6�¦  «         |Nr:�t)          |N¦  «        d7k    r&�t%          d8|Ndd9…         › d:|Nd;d…         › �¦  «         �nÙ| j"        dk    �rV�t          jŠ        d-|pd¦  «        }K|Kr|K ‹                    d.¦  «        nd/| _Œ        d| _•        	 dd"lgmh}P  |P¦   «          i                    di ¦  «         i                    d<i ¦  «        }Q|Q i                    d=¦  «        ru|Q i                    d>¦  «        r`|Qd=         |Qd>         d?œ| _•        |Q i                    d@¦  «        r|Qd@         | j•        dA<   |Q i                    dB¦  «        r|QdB         | j•        dB<   n# tT          $ r Y nw xY wd| _�        i | _‘        | j        s.| j•        rdCnd}R�t%          d1| j        › dD| jŒ        › |R› d3�¦  «         �nw|�rj|�rg�t-          |¦  «        }S|Sj—        r\�t1          |S ™                    d¬E¦  «        ¦  «        }TdF„ �t5          |Sj—        ¦  «         ›                    ¦   «         D ¦   «         }U||T|UdGœ}Vn||dHœ}V|F�|F|VdI<   | j        dk    r| j        |VdJ<   | j!        |VdK<   |}WtQ          |WdL¦  «        rdMdNdOdPœ|VdQ<   �n×tQ          |WdR¦  «        r�t9          ¦   «         |VdQ<   �n³tQ          |WdS¦  «        rddTl�mž}X  |X¦   «         |VdQ<   �nŽtQ          |WdU¦  «        r	dVdWi|VdQ<   �nutQ          |WdX¦  «        r�t?          ¦   «         |VdQ<   �nQtQ          |Wd¦  «        rddYl m¡}Y  |Y|¦  «        |VdQ<   �n+ddZl m¢}Z  |Z| j        pd[| j        d¬\¦  «        \  }[}\|[�R|[j�        t7          |[j        ¦  «        dHœ}V|F�|F|VdI<   tc          |[d]¦  «        r|[j£        rt¿          |[j£        ¦  «        |VdQ<   n´| j        pd                     ¦   «                              ¦   «         }]|]ru|]d^vrq|] ¤                    ¦   «         › d_�}^	 dd`l¥m¦}_ |_ i                    |]¦  «        }`|`r|`j§        r|`j§        d         }^n# tT          $ r Y nw xY w�tQ          da|]› db|^› dc�¦  «        ‚�tQ          dd¦  «        ‚|V| _‘        t7          |V i                    ded¦  «        ¦  «                             ¦   «         }atQ          |adL¦  «        rgdf| j        pd                     ¦   «         v rJ|V i                    dQ¦  «        pi }b|b i                    dgd¦  «        }cdh}d|d|cvr|cr|c› di|d› �|bdg<   n|d|bdg<   |b|VdQ<   |V i                    djd¦  «        | _�        |V i                    de| j        ¦  «        | _        	 |  ©                    |Vdkd¬l¦  «        | _�        | j        s¦�t%          d1| j        › �¦  «         |r�t%          dm|› �¦  «         |V i                    djdn¦  «        }e|erA|edok    r;�t)          |e¦  «        d7k    r'�t%          dp|edd9…         › d:|ed;d…         › �¦  «         n �t%          dq|er
|eddr…         ndn› ds�¦  «         n%# tT          $ r}f�tQ          dt|f› �¦  «        ‚d}f~fww xY wt5          |8t@          ¦  «        rdu„ |8D ¦   «         | _ª        nOt5          |8t¾          ¦  «        r3|8 i                    dv¦  «        r|8 i                    dw¦  «        r	|8g| _ª        ng | _ª        d| _«        d | _¬        | jª        r| jª        d         nd| _­        | jª        r�| j        s–�t)          | jª        ¦  «        d.k    r1| jª        d         }g�t%          dx|gdw         › dy|gdv         › d3�¦  «         nL�t%          dz�t)          | jª        ¦  «        › d{�d| ®                    d}„ | jª        D ¦   «         ¦  «        z   ¦  «         �t_          ||| j        ¬~¦  «        | _°        t�          ¦   «         | _±        | j°        r¿d„ | j°        D ¦   «         | _±        �te          | j±        ¦  «        }h| j        sŒ�t%          d€�t)          | j°        ¦  «        › d�d‚ ®                    |h¦  «        › �¦  «         |r&�t%          dƒd‚ ®                    |¦  «        › �¦  «         |r&�t%          d„d‚ ®                    |¦  «        › �¦  «         n| j        s�t%          d…¦  «         | j°        rI| j        sB�tg          ¦   «         }id†„ |i ›                    ¦   «         D ¦   «         }j|jr�t%          d‡|j› �¦  «         | j        r| j        s�t%          dˆ¦  «         | j	        rM| j        sF�t)          | j	        ¦  «        d‰k    r| j	        dd‰…         d:z   n| j	        }k�t%          dŠ|k› d‹�¦  «         | jd        rD| j        s=| je        r| j        dk    rdŒ}ln| je        rd�}lndŽ}l�t%          d�|l› d‚| jf        › d��¦  «         �ti          jµ        ¦   «         | _¶        |r|| _·        nG| j¶         ¸                    d‘¦  «        }m�ts          jº        ¦   «         j»        dd’…         }n|m› d“|n› �| _·        �ty          ¦   «         }o|od”z  | _½        | j½         ¾                    dd¬•¦  «         | j½        d–| j·        › d—�z  | _¿        g | _À        d˜| _Á        d™| _Â        d| _Ã        ddšlÄmÅ}p  |p|:|;¬›¦  «        | _Æ        |5| _Ç        |6| _È        d| _É        | jÇ        r’	 | jÇ         Ê                    | j·        | j
        p �t–          jÌ         i                    dœd�¦  «        | j        | j        |'|&džœd| jÈ        ¬Ÿ¦  «         n2# tT          $ r%}ftì           Í                    d |f¦  «         Y d}f~fnd}f~fww xY wdd¡lÎmÏ}q  |q¦   «         | _Ð        	 dd"lgmh}r  |r¦   «         }sn# tT          $ r i }sY nw xY wd| _Ñ        d| _Ò        d | _Ó        d | _Ô        d¢| _Õ        d| _Ö        d| _×        |4sî	 |s i                    d£i ¦  «        }t|t i                    d¤d ¦  «        | _Ó        |t i                    d¥d ¦  «        | _Ô        �t±          |t i                    d¦d¢¦  «        ¦  «        | _Õ        | jÓ        s| jÔ        rYdd§lÙmÚ}u  |u|t i                    d¨d©¦  «        |t i                    dªd«¦  «        ¬¬¦  «        | _Ò        | jÒ         Û                    ¦   «          n# tT          $ r Y nw xY wd| _Ü        |4�s	 |tr|t i                    dvd¦  «        nd}v|v�r¾dd­lÝmÞ}w dd®lßmà}x  |w¦   «         | _Ü         |x|v¦  «        }y|yr.|y á                    ¦   «         r| jÜ         â                    |y¦  «         | jÜ        jã        �r9| j·        |+pd�t7          �ty          ¦   «         ¦  «        d¯d°œ}z| jÇ        r8	 | jÇ         ä                    | j·        ¦  «        }{|{r|{|zd±<   n# tT          $ r Y nw xY w| j        r
| j        |zd²<   | j        r
| j        |zd³<   | j        r
| j        |zd´<   | j        r
| j        |zdµ<   | j        r
| j        |zd¶<   | j        r
| j        |zd·<   | j        r
| j        |zd¸<   	 dd¹låmæ}|  ||¦   «         }}|}|zdº<   d»|zd¼<   n# tT          $ r Y nw xY w | jÜ        jç        �di |z¤Ž tì           w                    d½|v¦  «         n"tì           è                    d¾|v¦  «         d| _Ü        n9# tT          $ r,}~tì           Í                    d¿|~¦  «         d| _Ü        Y d}~~~nd}~~~ww xY w| jÜ        r¡| j°        �šdÀ„ | j°        D ¦   «         }| jÜ         é                    ¦   «         D ]o}€|€ i                    dÁd¦  «        }�|�r|�|v rŒdÂ|€dÃœ}‚| j°         ê                    |‚¦  «         |�r/| j±         ë                    |�¦  «         | ë                    |�¦  «         Œpd¢| _ì        	 |s i                    dÄi ¦  «        }ƒ�t±          |ƒ i                    dÅd¢¦  «        ¦  «        | _ì        n# tT          $ r Y nw xY w|s i                    dÆi ¦  «        }„t5          |„t¾          ¦  «        si }„|„ i                    dÇd[¦  «        | _í        	 |„ i                    dÈdÉ¦  «        }…�t±          |…¦  «        }†|†d.k     rd.}†n# �tÜ          �tÞ          f$ r dÉ}†Y nw xY w|†| _ð        |s i                    dÊi ¦  «        }‡t5          |‡t¾          ¦  «        si }‡�tã          |‡ i                    dËdÌ¦  «        ¦  «        }ˆt7          |‡ i                    dÍd¦  «        ¦  «                             ¦   «         dÎv }‰�tã          |‡ i                    dÏdÐ¦  «        ¦  «        }Š�t±          |‡ i                    dÑdr¦  «        ¦  «        }‹	 |s i                    dÒi ¦  «         i                    dÊi ¦  «        }Œn# tT          $ r i }ŒY nw xY wt5          |Œt¾          ¦  «        r|Œ i                    dÓ¦  «        }�nd}�|��-	 �t±          |�¦  «        }�n# �tÜ          �tÞ          f$ r d}�Y nw xY w|�| _Ñ        |s i                    dwi ¦  «        }Žt5          |Žt¾          ¦  «        r|Ž i                    dÓ¦  «        }�nd}�|��i	 �t±          |�¦  «        }�nW# �tÜ          �tÞ          f$ rA tì           Í                    dÔ|�¦  «         �t%          dÕ|�›dÖ��tä          jó        ¬×¦  «         d}�Y nw xY w|�| _ô        	 ddØlgmõ}�  |�|s¦  «        }‘n<# tT          $ r/ |s i                    dÙ¦  «        }‘t5          |‘t@          ¦  «        sg }‘Y nw xY w|��€³|‘�r°	 ddÚlgmö}’  |’| j        | j        |‘¬Û¦  «        }“|“r�t±          |“¦  «        }�n# tT          $ r d}“Y nw xY w|��€i| j        r| j         %                    d¦  «        nd}”|‘D �]B}•t5          |•t¾          ¦  «        sŒ|• i                    de¦  «        pd %                    d¦  «        }–|”rý|–|”k    r÷|• i                    dÜi ¦  «        }—t5          |—t¾          ¦  «        rÊ|— i                    | j        i ¦  «        }˜t5          |˜t¾          ¦  «        rš|˜ i                    dÓ¦  «        }™|™�ƒ	 �t±          |™¦  «        }š|šdk    r�tÞ          ‚nc# �tÜ          �tÞ          f$ rM tì           Í                    dÝ| j        |™¦  «         �t%          dÞ| j        ›dß|™›dà��tä          jó        ¬×¦  «         Y nw xY w n�ŒDd}›dá}œ	 t5          |st¾          ¦  «        r|s i                    dâi ¦  «        ni }�|� i                    dãdá¦  «        pdá}œn# tT          $ r Y nw xY w|œdák    r•	 ddäl÷mø}ž  |ž|œ¦  «        }›n2# tT          $ r%}Ÿtì           è                    då|Ÿ¦  «         Y d}Ÿ~Ÿnd}Ÿ~Ÿww xY w|›€1	 ddælùmú}   | ¦   «         }¡|¡r|¡jû        |œk    r|¡}›n# tT          $ r Y nw xY w|›€tì           Í                    dç|œ¦  «         |›�¤|›| _ü        ddèlýmþ}¢  |¢| j        | j        �tÿ          | djd¦  «        |�| j        |‘¬é¦  «        }£| jü        �                      | j        |£| j        �tÿ          | djd¦  «        | j        ¬ê¦  «         | j        s tì           w                    dë|›jû        ¦  «         nJ�t          | j        |ˆdÉ|‹|Šd| j        | j        �tÿ          | djd¦  «        |�| j        | j"        ¬ì¦  «        | _ü        |‰| �_        ddílý�m}¤ �tÿ          | jü        dÓd¦  «        }¥|¥r-|¥|¤k     r'�tß          dî| j        › dï|¥di›dð|¤di›dñ|¤dòz  › dó�	¦  «        ‚t�          ¦   «         | �_        tc          | dô¦  «        r—| jü        r�| j°        �‰| jü        �                     ¦   «         D ]n}€dÂ|€dÃœ}‚| j°         ê                    |‚¦  «         |€ i                    dÁd¦  «        }�|�r5| j±         ë                    |�¦  «         | �j         ë                    |�¦  «         Œotc          | dô¦  «        r›| jü        r”	 | jü        �                     | j·        t7          �ty          ¦   «         ¦  «        | j
        pd�| j        �tÿ          | jü        dÓd¦  «        ¬õ¦  «         n2# tT          $ r%}¦tì           è                    dö|¦¦  «         Y d}¦~¦nd}¦~¦ww xY w�t          �t—          �j        d÷¦  «        pd¬ø¦  «        | �_	        d| �_
        d| �_        d| �_        d| �_        d| �_        d| �_        d| �_        d| �_        d| �_        d| �_        dù| �_        dú| �_        dn| �_        d| �_        d}§t5          |Žt¾          ¦  «        r|Ž i                    dû¦  «        }§|§�L	 �t±          |§¦  «        | �_        n4# �tÜ          �tÞ          f$ r tì           è                    dü|§¦  «         Y nw xY w| �j        €„| j        r}�t1          | j        ¦  «        rh	 �t3          | j        | j        | j�        pd¬ý¦  «        }¨|¨r|¨dk    r|¨| �_        n2# tT          $ r%}©tì           è                    dþ|©¦  «         Y d}©~©nd}©~©ww xY w| �j        r(| j        s!tì           w                    dÿ| �j        ¦  «         | j        sl|‰rH�t%          �d | jü        �j        di›�d�t±          |ˆ�dz  ¦  «        › �d| jü        �j        di›d3�¦  «         n"�t%          �d | jü        �j        di›�d�¦  «         d| �_        | �                     ¦   «          | jü        }ª| j        | j        | j        | j"        �tÿ          | djd¦  «        t¿          | j‘        ¦  «        | jd        | je        �tÿ          |ªdw| j        ¦  «        �tÿ          |ªde| j        ¦  «        �tÿ          |ªdjd¦  «        �tÿ          |ªdv| j        ¦  «        |ª�j        |ª�j        �dœ| �_        | j"        dk    r2| �j        �                     | j�        | jŽ        | jƒ        �dœ¦  «         dS dS (  až  
        Initialize the AI Agent.

        Args:
            base_url (str): Base URL for the model API (optional)
            api_key (str): API key for authentication (optional, uses env var if not provided)
            provider (str): Provider identifier (optional; used for telemetry/routing hints)
            api_mode (str): API mode override: "chat_completions" or "codex_responses"
            model (str): Model name to use (default: "anthropic/claude-opus-4.6")
            max_iterations (int): Maximum number of tool calling iterations (default: 90)
            tool_delay (float): Delay between tool calls in seconds (default: 1.0)
            enabled_toolsets (List[str]): Only enable tools from these toolsets (optional)
            disabled_toolsets (List[str]): Disable tools from these toolsets (optional)
            save_trajectories (bool): Whether to save conversation trajectories to JSONL files (default: False)
            verbose_logging (bool): Enable verbose logging for debugging (default: False)
            quiet_mode (bool): Suppress progress output for clean CLI experience (default: False)
            ephemeral_system_prompt (str): System prompt used during agent execution but NOT saved to trajectories (optional)
            log_prefix_chars (int): Number of characters to show in log previews for tool calls/responses (default: 100)
            log_prefix (str): Prefix to add to all log messages for identification in parallel processing (default: "")
            providers_allowed (List[str]): OpenRouter providers to allow (optional)
            providers_ignored (List[str]): OpenRouter providers to ignore (optional)
            providers_order (List[str]): OpenRouter providers to try in order (optional)
            provider_sort (str): Sort providers by price/throughput/latency (optional)
            session_id (str): Pre-generated session ID for logging (optional, auto-generated if not provided)
            tool_progress_callback (callable): Callback function(tool_name, args_preview) for progress notifications
            clarify_callback (callable): Callback function(question, choices) -> str for interactive user questions.
                Provided by the platform layer (CLI or gateway). If None, the clarify tool returns an error.
            max_tokens (int): Maximum tokens for model responses (optional, uses model default if not set)
            reasoning_config (Dict): OpenRouter reasoning configuration override (e.g. {"effort": "none"} to disable thinking).
                If None, defaults to {"enabled": True, "effort": "medium"} for OpenRouter. Set to disable/customize reasoning.
            prefill_messages (List[Dict]): Messages to prepend to conversation history as prefilled context.
                Useful for injecting a few-shot example or priming the model's response style.
                Example: [{"role": "user", "content": "Hi!"}, {"role": "assistant", "content": "Hello!"}]
                NOTE: Anthropic Sonnet 4.6+ and Opus 4.6+ reject a conversation that ends on an
                assistant-role message (400 error).  For those models use structured outputs or
                output_config.format instead of a trailing-assistant prefill.
            platform (str): The interface platform the user is on (e.g. "cli", "telegram", "discord", "whatsapp").
                Used to inject platform-specific formatting hints into the system prompt.
            skip_context_files (bool): If True, skip auto-injection of SOUL.md, AGENTS.md, and .cursorrules
                into the system prompt. Use this for batch processing and data generation to avoid
                polluting trajectories with user-specific persona or project instructions.
        NÚ r€   >   Úcodex_responsesÚbedrock_converseÚchat_completionsÚanthropic_messagesúopenai-codexrµ  Úxaiúchatgpt.comú/backend-api/codexúapi.x.aiÚ	anthropicúapi.anthropic.comr¸  ú/ú
/anthropicÚbedrockúbedrock-runtime.úamazonaws.comr¶  r·  r   )Ú_AGGREGATOR_PROVIDERSÚnormalize_model_for_providerúcopilot-acpúacp://copilotz
acp+tcp://©r|  Ú_transport_cacheÚ
openrouterc                  ó   — t          ¦   «         S rg   )r*   rw   r\   rZ   ú<lambda>z"AIAgent.__init__.<locals>.<lambda>(  s   € Õ3Ñ5Ô5€ r\   T©ÚtargetÚdaemonFÚ5m)Úload_configÚprompt_cachingÚ	cache_ttl)rÑ  Ú1hÚinitializing)Úsetup_loggingÚsetup_verbose_logging)r   z=Verbose logging enabled (third-party library logs suppressed))rR  Ú	run_agentÚtrajectory_compressorÚcronr[  )Úbuild_anthropic_clientÚresolve_anthropic_token©Úbuild_anthropic_bedrock_clientzbedrock-runtime\.([a-z0-9-]+)\.r¢   ú	us-east-1zaws-sdku&   ðŸ¤– AI Agent initialized with model: z& (AWS Bedrock + AnthropicBedrock SDK, re  ©Ú_is_oauth_token©Útimeoutz (Anthropic native)é   u   ðŸ”‘ Using token: r½   ú...éüÿÿÿÚ	guardrailÚguardrail_identifierÚguardrail_version)ÚguardrailIdentifierÚguardrailVersionÚstream_processing_modeÚstreamProcessingModeÚtracez + Guardrailsz (AWS Bedrock, )Úqueryc                 ó&   — i | ]\  }}||d          “ŒS ©r   rw   ©rÉ   ÚkÚvs      rZ   ú
<dictcomp>z$AIAgent.__init__.<locals>.<dictcomp>.  s/   € ð %ð %ð %Ù$( A q˜˜1˜Qœ4ð%ð %ð %r\   )r{  rˆ   Údefault_query©r{  rˆ   rä  r€  r�  úopenrouter.aiz%https://hermes-agent.nousresearch.comzHermes Agentzproductivity,cli-agent)zHTTP-RefererzX-OpenRouter-TitlezX-OpenRouter-CategoriesÚdefault_headersúapi.routermint.comúapi.githubcopilot.com©Úcopilot_default_headersúapi.kimi.comrZ  úclaude-code/0.1.0úportal.qwen.ai©Ú_codex_cloudflare_headers©Úresolve_provider_clientÚauto)r‚  Ú	raw_codexÚ_default_headers)r  rË  ÚcustomÚ_API_KEY)ÚPROVIDER_REGISTRYz
Provider 'z:' is set in config.yaml but no API key was found. Set the zM environment variable, or switch to a different provider with `hermes model`.zxNo LLM provider configured. Run `hermes model` to select a provider, or run `hermes setup` for first-time configuration.rˆ   Úclaudezx-anthropic-betaz&fine-grained-tool-streaming-2025-05-14r,  r{  Ú
agent_init©ÚreasonÚsharedu   ðŸ”— Using custom base URL: Únonez	dummy-keyu   ðŸ”‘ Using API key: u;   âš ï¸�  Warning: API key appears invalid or missing (got: 'é   z...')z$Failed to initialize OpenAI client: c                 ó�   — g | ]C}t          |t          ¦  «        ¯|                     d ¦  «        ¯,|                     d¦  «        ¯A|‘ŒDS )r|  r‚  ©rb   rÚ   rƒ   ©rÉ   Úfs     rZ   rË   z$AIAgent.__init__.<locals>.<listcomp>©  s^   € ð $ð $ð $ØÝ˜a¥Ñ&Ô&ð$à+,¯5ª5°Ñ+<Ô+<ð$àABÇÂÀwÁÄð$Øð$ð $ð $r\   r|  r‚  u   ðŸ”„ Fallback model: rd  u   ðŸ”„ Fallback chain (z providers): õ    â†’ c              3   ó>   K  — | ]}|d          › d|d         › d�V — ŒdS )r‚  rd  r|  re  Nrw   r  s     rZ   rÎ   z#AIAgent.__init__.<locals>.<genexpr>»  s;   è è € Ð"cÐ"cÈ a¨¤jÐ#DÐ#D°A°j´MÐ#DÐ#DÐ#DÐ"cÐ"cÐ"cÐ"cÐ"cÐ"cr\   )r…  r†  r‰  c                 ó*   — h | ]}|d          d         ’ŒS rÆ   rw   )rÉ   Útools     rZ   ú	<setcomp>z#AIAgent.__init__.<locals>.<setcomp>Ç  s"   € Ð$UÐ$UÐ$UÀ$ T¨*Ô%5°fÔ%=Ð$UÐ$UÐ$Ur\   u   ðŸ› ï¸�  Loaded z tools: ú, u      âœ… Enabled toolsets: u      â�Œ Disabled toolsets: u@   ðŸ› ï¸�  No tools loaded (all tools filtered out or unavailable)c                 ó   — g | ]	\  }}|°|‘Œ
S rw   rw   )rÉ   rp   Ú	availables      rZ   rË   z$AIAgent.__init__.<locals>.<listcomp>×  s"   € Ð^Ð^Ð^¡_ T¨9ÐT]Ð^˜DÐ^Ð^Ð^r\   u=   âš ï¸�  Some tools may not work due to missing requirements: u   ðŸ“� Trajectory saving enabledé<   u   ðŸ”’ Ephemeral system prompt: 'z' (not saved to trajectories)znative AnthropiczAnthropic-compatible endpointzClaude via OpenRouteru   ðŸ’¾ Prompt caching: ENABLED (z TTL)ú%Y%m%d_%H%M%Sé   rE  Úsessions)ÚparentsÚexist_okÚsession_ú.jsonÚassistant_toolÚ
foreground)ÚCheckpointManager)ÚenabledÚmax_snapshotsÚHERMES_SESSION_SOURCEÚcli)rƒ  r   rŸ  )r“  Úsourcer‚  Úmodel_configr¤  r­  zESession DB create_session failed (session_search still available): %s)Ú	TodoStoreé
   ÚmemoryÚmemory_enabledÚuser_profile_enabledÚnudge_interval)ÚMemoryStoreÚmemory_char_limiti˜  Úuser_char_limiti_  )r7  r8  )ÚMemoryManager)Úload_memory_providerÚprimary)r“  rg  r   Úagent_contextÚsession_titler¤  r¥  r¦  r§  r¨  r©  rª  )Úget_active_profile_nameÚagent_identityÚhermesÚagent_workspacezMemory provider '%s' activatedz/Memory provider '%s' not found or not availablez&Memory provider plugin init failed: %sc                 óŠ   — h | ]@}t          |t          ¦  «        ¯|                     d i ¦  «                             d¦  «        ’ŒAS rÆ   r  ©rÉ   Úts     rZ   r  z#AIAgent.__init__.<locals>.<setcomp>™  sT   € ð $ð $ð $àÝ˜a¥Ñ&Ô&ð$Ø—’�j "Ñ%Ô%×)Ò)¨&Ñ1Ô1ð$ð $ð $r\   rp   rÇ   )rÛ   rÇ   ÚskillsÚcreation_nudge_intervalÚagentÚtool_use_enforcementÚapi_max_retriesé   ÚcompressionÚ	thresholdg      à?r*  )ÚtrueÚ1ÚyesÚtarget_ratioçš™™™™™É?Úprotect_last_nÚ	auxiliaryÚcontext_lengthu†   Invalid model.context_length in config.yaml: %r â€” must be a plain integer (e.g. 256000, not '256K'). Falling back to auto-detection.u2   
âš  Invalid model.context_length in config.yaml: zf
  Must be a plain integer (e.g. 256000, not '256K').
  Falling back to auto-detected context window.
)Úfile)Úget_compatible_custom_providersÚcustom_providers)Ú"get_custom_provider_context_length)r‚  rˆ   rW  Úmodelsu•   Invalid context_length for model %r in custom_providers: %r â€” must be a positive integer (e.g. 256000, not '256K'). Falling back to auto-detection.u&   
âš  Invalid context_length for model z in custom_providers: zi
  Must be a positive integer (e.g. 256000, not '256K').
  Falling back to auto-detected context window.
Ú
compressorÚcontextÚengine)Úload_context_enginez4Context engine load from plugins/context_engine/: %s)Úget_plugin_context_engineuE   Context engine '%s' not found â€” falling back to built-in compressor©Úget_model_context_length)rˆ   r{  Úconfig_context_lengthr|  rW  ©r‚  rT  rˆ   r{  r|  zUsing context engine: %s)r‚  Úthreshold_percentÚprotect_first_nrR  Úsummary_target_ratioÚsummary_model_overrider‰  rˆ   r{  ra  r|  r}  )ÚMINIMUM_CONTEXT_LENGTHzModel ú has a context window of ú$ tokens, which is below the minimum z9 required by Hermes Agent.  Choose a model with at least éè  zBK context, or set model.context_length in config.yaml to override.Úcontext_compressor)r   rg  r‚  rT  z#Context engine on_session_start: %sÚTERMINAL_CWD)Úworking_dirç        ÚunknownÚollama_num_ctxz'Invalid ollama_num_ctx config value: %r)r{  z#Ollama num_ctx detection failed: %szAOllama num_ctx: will request %d tokens (model max from /api/show)u   ðŸ“Š Context limit: z tokens (compress at rz  z% = z# tokens (auto-compression disabled)©r‚  r|  rˆ   r}  r{  Úclient_kwargsÚuse_prompt_cachingÚuse_native_cache_layoutÚcompressor_modelÚcompressor_base_urlÚcompressor_api_keyÚcompressor_providerÚcompressor_context_lengthÚcompressor_threshold_tokens©Úanthropic_api_keyÚanthropic_base_urlÚis_anthropic_oauthrw   (   r˜   r‚  rƒ  rš   r®  r„  r‡  rˆ  r‰  rŠ  rg  Ú_user_idÚ
_user_nameÚ_chat_idÚ
_chat_nameÚ
_chat_typeÚ
_thread_idÚ_gateway_session_keyÚ	_print_fnÚbackground_review_callbackr«  r²  Ú_credential_poolr‹  rŒ  rˆ   rb   rc   r„   rj  r|  r~  r  r  r}  rv  ru  Úrstripr>  Ú
startswithrN   Ú_get_transportr�   Úhermes_cli.model_normalizerÅ  rÆ  Ú_is_azure_openai_urlÚ_is_direct_openai_urlÚ&_provider_model_requires_responses_apiÚhasattrrÊ  ÚclearÚ_is_openrouter_urlrž   ÚThreadÚstartr”  r•  r–  Úsuppress_status_outputr—  r˜  r™  rš  r›  rœ  rž  r�  Ú_executing_toolsÚ_interrupt_requestedÚ_interrupt_messageÚ_execution_thread_idÚ _interrupt_thread_signal_pendingÚRLockÚ_client_lockÚ_pending_steerrŸ   Ú_pending_steer_lockÚsetÚ_tool_worker_threadsÚ_tool_worker_threads_lockÚ_delegate_depthÚ_active_childrenÚ_active_children_lockr�  rŽ  r�  r�  r‘  r’  r…  r†  rŸ  r   r¡  rÚ   r¢  r£  Ú_force_ascii_payloadÚ_anthropic_prompt_cache_policyÚ_use_prompt_cachingÚ_use_native_cache_layoutÚ
_cache_ttlÚhermes_cli.configrÒ  rƒ   Ú_budget_exhausted_injectedÚ_budget_grace_callÚtimeÚ_last_activity_tsÚ_last_activity_descÚ_current_toolÚ_api_call_countÚ_rate_limit_stateÚhermes_loggingr×  rØ  Ú_hermes_homer6  ÚinforØ   Ú	getLoggerÚsetLevelÚERRORÚ_stream_callbackÚ_stream_needs_breakÚ _current_streamed_assistant_textÚ_persist_user_message_idxÚ_persist_user_message_overrideÚ_anthropic_image_fallback_cacheÚ_anthropic_clientÚ_is_anthropic_oauthr   Úagent.anthropic_adapterrÜ  rÝ  rß  r;  rÁ   ÚgroupÚ_bedrock_regionÚ_anthropic_api_keyÚ_anthropic_base_urlr{  ÚclientÚ_client_kwargsÚprintrâ  rd   Ú_bedrock_guardrail_configr   rð  r
   Ú_replacer	   r  r]  Úhermes_cli.modelsrþ  rn  Úagent.auxiliary_clientr  r  r  ÚupperÚhermes_cli.authr  Úapi_key_env_varsÚRuntimeErrorÚ_create_openai_clientÚ_fallback_chainÚ_fallback_indexÚ_fallback_activatedÚ_fallback_modelr  r   rR  Úvalid_tool_namesÚsortedr   r   ÚnowÚsession_startr“  ÚstrftimeÚuuidÚuuid4Úhexr   Úlogs_dirÚmkdirÚsession_log_fileÚ_session_messagesÚ_memory_write_originÚ_memory_write_contextÚ_cached_system_promptÚtools.checkpoint_managerr)  Ú_checkpoint_mgrÚ_session_dbÚ_parent_session_idÚ_last_flushed_db_idxÚcreate_sessionr�   r‚   r7  Útools.todo_toolr0  Ú_todo_storeÚ&_aux_compression_context_length_configÚ_memory_storeÚ_memory_enabledÚ_user_profile_enabledÚ_memory_nudge_intervalÚ_turns_since_memoryÚ_iters_since_skillr¬   Útools.memory_toolr6  Úload_from_diskÚ_memory_managerÚagent.memory_managerr9  Úplugins.memoryr:  Úis_availableÚadd_providerÚ	providersÚget_session_titleÚhermes_cli.profilesr>  Úinitialize_allrÙ   Úget_all_tool_schemasrÞ   ÚaddÚ_skill_nudge_intervalÚ_tool_use_enforcementr:  ra   Ú_api_max_retriesÚfloatr”   r“   Ú_config_context_lengthrV  rX  Úplugins.context_enginer]  Úhermes_cli.pluginsr^  rp   rk  Úagent.model_metadatar`  ro   Úupdate_modelr4   Úcompression_enabledrg  Ú_context_engine_tool_namesÚget_tool_schemasÚon_session_startr5   ÚgetenvÚ_subdirectory_hintsÚ_user_turn_countÚsession_prompt_tokensÚsession_completion_tokensÚsession_total_tokensÚsession_api_callsÚsession_input_tokensÚsession_output_tokensÚsession_cache_read_tokensÚsession_cache_write_tokensÚsession_reasoning_tokensÚsession_estimated_cost_usdÚsession_cost_statusÚsession_cost_sourceÚ_ollama_num_ctxr2   r3   rT  Úthreshold_tokensÚ_compression_warningÚ$_check_compression_model_feasibilityÚ_primary_runtimeÚupdate)«rX   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š  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  rg  r¤  r¥  r¦  r§  r¨  r©  rª  r«  r¬  Ú
session_dbr­  r®  r¯  Úcredential_poolr°  r±  r²  Úprovider_namerÅ  rÆ  Ú_load_pc_cfgÚ_pc_cfgÚ_ttlr×  rØ  Úquiet_loggerÚ_provider_timeoutrÜ  rÝ  Ú_is_bedrock_anthropicrß  Ú_region_matchÚ
_br_regionÚ_is_native_anthropicÚeffective_keyÚ_is_oatÚ_load_br_cfgÚ_grÚ	_gr_labelÚ_parsed_urlÚ
_clean_urlÚ_query_paramsrr  Úeffective_baserþ  r  r  Ú_routed_clientrE  Ú	_explicitÚ	_env_hintr  Ú_pcfgÚ_effective_baseÚheadersÚexisting_betaÚ_FINE_GRAINEDÚkey_usedÚeÚfbrá   ÚrequirementsÚmissing_reqsÚprompt_previewr.  Útimestamp_strÚ
short_uuidr   r)  r0  Ú_load_agent_configÚ
_agent_cfgÚ
mem_configr6  Ú_mem_provider_nameÚ_MemoryManagerÚ	_load_memÚ_mpÚ_init_kwargsÚ_str>  Ú_profileÚ_mpeÚ_existing_tool_namesÚ_schemaÚ_tnameÚ_wrappedÚskills_configÚ_agent_sectionÚ_raw_api_retriesÚ_api_retriesÚ_compression_cfgÚcompression_thresholdr
  Úcompression_target_ratioÚcompression_protect_lastÚ_aux_cfgÚ_aux_context_configÚ
_model_cfgr  rV  Ú_custom_providersrX  Ú_cp_ctx_resolvedÚ_targetÚ	_cp_entryÚ_cp_urlÚ
_cp_modelsÚ_cp_model_cfgÚ_cp_ctxÚ_parsedÚ_selected_engineÚ_engine_nameÚ_ctx_cfgr]  Ú_ce_load_errr^  Ú
_candidater`  Ú_plugin_ctx_lenrg  Ú_ctxÚ_ce_errÚ_ollama_num_ctx_overrideÚ	_detectedÚexcÚ_ccs«                                                                                                                                                                              rZ   r[   zAIAgent.__init__A  sÄ,  € õR 	ÑÔÐàˆŒ
Ø,ˆÔð !1Ð SµOÀNÑ4SÔ4SˆÔØ$ˆŒØ!2ˆÔØ.ˆÔØ$ˆŒØ'>ˆÔ$Ø ˆŒØˆŒØ#ˆŒØˆŒØ#ˆŒØ#ˆŒØ#ˆŒØ$7ˆÔ!ð
 ˆŒØ*.ˆÔ'Ø"4ˆÔØ.ˆÔØ /ˆÔØ 0ˆÔØ.8Ð@˜ZÐ*Ð*Ð*Ð*¸bˆŒà ˜ BˆŒÝ4>¸xÍÑ4MÔ4MÐlÐRZ×R`ÒR`ÑRbÔRbÐl˜ŸšÑ(Ô(×.Ò.Ñ0Ô0Ð0ÐhlˆØ%Ð+¨ˆŒØ&Ð1¨'ˆÔÝ˜XÐ3¨Ð3°Ñ4Ô4ˆŒØÐhÐhÐhØ$ˆDŒM‰MØŒ]˜nÒ,Ð,Ø-ˆDŒMˆMØŒ]˜eÒ#Ð#Ø-ˆDŒMˆMØÐ#ØÔ# }Ò4Ð4Ø$¨Ô(<Ð<Ð<à-ˆDŒMØ*ˆDŒMˆMØÐ#¨Ô)@ÀJÒ)NÐ)NØ-ˆDŒMØ!ˆDŒMˆMØŒ]˜kÒ)Ð)¨mÐ.CÈÔH_ÐcvÒHvÐHvØ0ˆDŒMØ'ˆDŒMˆMØÔ!×(Ò(¨Ñ-Ô-×6Ò6°|ÑDÔDð 	/ð 1ˆDŒMˆMØŒ]˜iÒ'Ð'ØÔ#×.Ò.Ð/AÑBÔBð (å% dÔ&:¸OÑLÔLð (ð /ˆDŒMˆMà.ˆDŒMð	Ø×ÒÑ!Ô!Ð!Ð!øÝð 	ð 	ð 	ØˆDð	øøøð		ðð ð ð ð ð ð ð ð
 Œ}Ð$9Ð9Ð9Ø9Ð9¸$¼*ÀdÄmÑTÔT�”
øøÝð 	ð 	ð 	ØˆDð	øøøð  ÑØ”Ð!3Ò3Ð3Ø” Ò.Ð.Ý˜œÐ+¨Ñ,Ô,×2Ò2Ñ4Ô4×?Ò?ÀÑPÔPð /å˜œÐ+¨Ñ,Ô,×2Ò2Ñ4Ô4×?Ò?ÀÑMÔMð /ð ×-Ò-Ñ/Ô/ð /ð
 ×*Ò*Ñ,Ô,ð /ð ×>Ò>Ø”JØ!œ]ð ?ñ ô ð /ð .ˆDŒMõ �tÐ/Ñ0Ô0ð .ØÔ%×+Ò+Ñ-Ô-Ð-ð
 Œ=˜LÒ(Ð(¨D×,CÒ,CÑ,EÔ,EÐ(ÝÔØ5Ð5Øðñ ô ÷ Še‰gŒgˆgà&<ˆÔ#Ø#6ˆÔ Ø&<ˆÔ#Ø&+ˆÔ#Ø!2ˆÔØ"4ˆÔØ 0ˆÔØ*ˆÔØ%:ˆÔ"Ø*DˆÔ'Ø.ˆÔØ!2ˆÔð
 !&ˆÔð %*ˆÔ!Ø"&ˆÔØ04ˆÔ!Ø05ˆÔ-Ý%œOÑ-Ô-ˆÔð .2ˆÔÝ#,¤>Ñ#3Ô#3ˆÔ õ /2©e¬eˆÔ!Ý)2¬Ñ)9Ô)9ˆÔ&ð  !ˆÔØ "ˆÔÝ%.¤^Ñ%5Ô%5ˆÔ"ð "3ˆÔØ!2ˆÔØ.ˆÔØ*ˆÔØ+FˆÔ(Ø(@ˆÔ%ð !1ˆÔØ!2ˆÔð %ˆŒØ 0ˆÔØ(ˆÔÝ!%Ð&7Ð&=¸2Ñ!>Ô!>ˆÔØ 0Ð 6°BˆÔØ$)ˆÔ!ð ×/Ò/Ñ1Ô1ñ 	@ˆÔ  $Ô"?ð ˆŒð	ØEÐEÐEÐEÐEÐEà"�l‘n”n×(Ò(Ð)9¸2Ñ>Ô>ÐDÀ"ˆGØ—;’;˜{¨DÑ1Ô1ˆDØ�|Ð#Ð#Ø"&�”øøÝð 	ð 	ð 	ØˆDð	øøøð +0ˆÔ'Ø"'ˆÔõ )-¬	©¬ˆÔØ(6ˆÔ Ø)-ˆÔØ$%ˆÔð >BˆÔð
 	HÐGÐGÐGÐGÐGÐGÐGØˆ¥,Ð/Ñ/Ô/Ð/àÔð 	LØ!Ð!Ñ#Ô#Ð#Ý�KŠKÐWÑXÔXÐXÐXàŒð Lð
%ð Lð L�Lõ Ô% lÑ3Ô3×<Ò<½W¼]ÑKÔKÐKÐKð !%ˆÔð $)ˆÔ ð
 13ˆÔ-ð
 *.ˆÔ&Ø.2ˆÔ+ð
 @BˆÔ,ð "&ˆÔØ#(ˆÔ ö 9¸¼ÈÌ
ÑSÔSÐàŒ=Ð0Ò0Ñ0Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_ð %)¤M°YÒ$>Ð!Ø$ð '_ØRÐRÐRÐRÐRÐRÞ "¤	Ð*LÈhÈnÐZ\Ñ ]Ô ]�Ø7DÐU˜]×0Ò0°Ñ3Ô3Ð3È+�
Ø'1�Ô$Ø)GÐ)GÈ
Ñ)SÔ)S�Ô&Ø*3�Ô'Ø+3�Ô(Ø+0�Ô(Ø(�”Ø"�”Ø&(�Ô#Ø”ð DÞð  CÀ4Ä:ð  Cð  CÐuð  Cð  Cð  Cñ  Dô  Dð  Dùð
 (,¤}¸Ò'CÐ$ØPdÐ y Ð!KÐ,CÐ,CÑ,EÔ,EÐ!KÈøÐkrÐkxÐvx�Ø,�”Ø*7�Ô'Ø+3�Ô(ð OÐNÐNÐNÐNÐNØEYÐ+d¨7¨7°=Ñ+AÔ+AÐ+AÐ_d�Ô(Ø)?Ð)?ÀÈxÐarÐ)sÑ)sÔ)s�Ô&à"�”Ø&(�Ô#Ø”ð _ÞÐbÀ4Ä:ÐbÐbÐbÑcÔcÐcØ$ð _®¨]Ñ);Ô);¸bÒ)@Ð)@ÞÐ]°=ÀÀ!ÀÔ3DÐ]Ð]ÈÐWYÐWZÐWZÔI[Ð]Ð]Ñ^Ô^Ð^ùØŒ]Ð0Ò0Ñ0ö œIÐ&HÈ(È.ÐVXÑYÔYˆMØ=JÐ#[ =×#6Ò#6°qÑ#9Ô#9Ð#9ÐP[ˆDÔ à-1ˆDÔ*ðØIÐIÐIÐIÐIÐIØ"�l‘n”n×(Ò(¨°BÑ7Ô7×;Ò;¸KÈÑLÔL�Ø—7’7Ð1Ñ2Ô2ð O°s·w²wÐ?RÑ7SÔ7Sð Oà/2Ð3IÔ/JØ,/Ð0CÔ,Dð6ð 6�DÔ2ð —w’wÐ7Ñ8Ô8ð oØQTÐUmÔQn˜Ô6Ð7MÑNØ—w’w˜wÑ'Ô'ð OØBEÀgÄ,˜Ô6°wÑ?øøÝð ð ð Ø�ðøøøàˆDŒKØ"$ˆDÔØ”?ð ~Ø/3Ô/MÐU˜O˜OÐSU�	ÞÐ|¸t¼zÐ|Ð|ÐZ^ÔZnÐ|ÐpyÐ|Ð|Ð|Ñ}Ô}Ð}ùàñ X˜8ñ Xö ' xÑ0Ô0�ØÔ$ð OÞ!+¨K×,@Ò,@ÀrÐ,@Ñ,JÔ,JÑ!KÔ!K�Jð%ð %Þ,4°[Ô5FÑ,GÔ,G×,MÒ,MÑ,OÔ,Oð%ñ %ô %�Mð $+Ø$.Ø)6ð%ð %�M�Mð 18ÀXÐ$NÐ$N�MØ$Ð0Ø/@�M )Ñ,Ø”= MÒ1Ð1Ø/3Ô/?�M )Ñ,Ø,0¬M�M &Ñ)Ø!)�Ý(¨¸ÑIÔIð Zà(OØ.<Ø3Kð8ð 8�MÐ"3Ñ4Ñ4õ
 +¨>Ð;OÑPÔPð ZÞ7JÑ7LÔ7L�MÐ"3Ñ4Ñ4Ý*¨>Ð;RÑSÔSð ZØIÐIÐIÐIÐIÐIà7NÐ7NÑ7PÔ7P�MÐ"3Ñ4Ñ4Ý*¨>¸>ÑJÔJð Zà$Ð&9ð8�MÐ"3Ñ4Ñ4õ +¨>Ð;KÑLÔLð ZÞ7KÑ7MÔ7M�MÐ"3Ñ4Ñ4Ý*¨>¸=ÑIÔIð ZØPÐPÐPÐPÐPÐPØ7PÐ7PÐQXÑ7YÔ7Y�MÐ"3Ñ4ùð KÐJÐJÐJÐJÐJØ$;Ð$;Ø”MÐ+ V°4´:Èð%Oñ %Oô %OÑ!� à!Ð-à#1Ô#9Ý$'¨Ô(?Ñ$@Ô$@ð%ð %�Mð )Ð4Ø3D˜ iÑ0å˜~Ð/AÑBÔBð aÀ~ÔGfð aÝ;?ÀÔ@_Ñ;`Ô;`˜Ð&7Ñ8øð
 "&¤Ð!4°"× ;Ò ;Ñ =Ô =× CÒ CÑ EÔ E�IØ ð  YÐ6VÐ%VÐ%Vð (1§¢Ñ'8Ô'8Ð$BÐ$BÐ$B˜	ð!ØIÐIÐIÐIÐIÐIØ$5×$9Ò$9¸)Ñ$DÔ$D˜EØ$ð F¨Ô)?ð FØ,1Ô,BÀ1Ô,E 	øøÝ(ð !ð !ð !Ø ˜Dð!øøøæ*ð`¨ð `ð `Ø2;ð`ð `ð `ñô ð ö 'ð)ñô ð ð #0ˆDÔõ " -×"3Ò"3°JÀÑ"CÔ"CÑDÔD×JÒJÑLÔLˆOÝ$ _°oÑFÔFð 	?È8ÐX\ÔXbÐXhÐfh×WoÒWoÑWqÔWqÐKqÐKqØ'×+Ò+Ð,=Ñ>Ô>ÐDÀ"�Ø '§¢Ð,>ÀÑ CÔ C�Ø H�Ø ¨Ð5Ð5Ø$ð DØ9FÐ6XÐ6XÈÐ6XÐ6X˜Ð 2Ñ3Ð3à6C˜Ð 2Ñ3Ø7>�MÐ"3Ñ4à(×,Ò,¨Y¸Ñ;Ô;ˆDŒLØ)×-Ò-¨j¸$¼-ÑHÔHˆDŒMðOØ"×8Ò8¸È|ÐdhÐ8ÑiÔi�”Ø”ð 	JÞÐOÀ4Ä:ÐOÐOÑPÔPÐPØð IÞÐG¸XÐGÐGÑHÔHÐHà,×0Ò0°¸FÑCÔC�HØð J H°Ò$;Ð$;ÆÀHÁÄÐPRÒ@RÐ@RÞÐU°X¸b¸q¸b´\ÐUÐUÀhÈrÈsÈsÄmÐUÐUÑVÔVÐVÐVæð  IÐmuð  ]BÐ\dÐehÐfhÐehÔ\iÐ\ið  |Bð  Ið  Ið  Iñ  Jô  Jð  JøøÝð Oð Oð OÞ"Ð#MÈ!Ð#MÐ#MÑNÔNÐNøøøøðOøøøõ �n¥dÑ+Ô+ð 	&ð$ð $Ø)ð$ñ $ô $ˆDÔ Ð õ ˜­Ñ-Ô-ð 	&°.×2DÒ2DÀZÑ2PÔ2Pð 	&ÐUc×UgÒUgÐhoÑUpÔUpð 	&Ø$2Ð#3ˆDÔ Ð à#%ˆDÔ Ø ˆÔØ#(ˆÔ à:>Ô:NÐX˜tÔ3°AÔ6Ð6ÐTXˆÔØÔð 	e¨¬ð 	eÞ�4Ô'Ñ(Ô(¨AÒ-Ð-ØÔ)¨!Ô,�ÞÐN¨b°¬kÐNÐN¸RÀ
¼^ÐNÐNÐNÑOÔOÐOÐOæÐV®c°$Ô2FÑ.GÔ.GÐVÐVÐVØ—l’lÐ"cÐ"cÈdÔNbÐ"cÑ"cÔ"cÑcÔcñdñ eô eð eö *Ø-Ø/Ø”ð
ñ 
ô 
ˆŒ
õ !$¡¤ˆÔØŒ:ð 	VØ$UÐ$UÈ$Ì*Ð$UÑ$UÔ$UˆDÔ!Þ Ô 5Ñ6Ô6ˆJØ”?ð WÞÐY®¨T¬Z©¬ÐYÐYÀ$Ç)Â)ÈJÑBWÔBWÐYÐYÑZÔZÐZð $ð UÞÐS°d·i²iÐ@PÑ6QÔ6QÐSÐSÑTÔTÐTØ$ð WÞÐU°t·y²yÐARÑ7SÔ7SÐUÐUÑVÔVÐVøØ”ð 	VÞÐTÑUÔUÐUð Œ:ð 	f˜dœoð 	fÞ5Ñ7Ô7ˆLØ^Ð^¸×8JÒ8JÑ8LÔ8LÐ^Ñ^Ô^ˆLØð fÞÐdÐVbÐdÐdÑeÔeÐeð Ô!ð 	4¨$¬/ð 	4ÞÐ2Ñ3Ô3Ð3ð Ô'ð 	c°´ð 	cÞJMÈdÔNjÑJkÔJkÐnpÒJpÐJp˜TÔ9¸#¸2¸#Ô>ÀÑFÐFÐvzô  wSˆNÞÐa°NÐaÐaÐaÑbÔbÐbð Ô#ð 	U¨D¬Oð 	UØÔ,ð 1°´À+Ò1MÐ1MØ+��ØÔ.ð 1Ø8��à0�ÞÐS°6ÐSÐS¸T¼_ÐSÐSÐSÑTÔTÐTö &œ\™^œ^ˆÔØð 	>à(ˆDŒOˆOð !Ô.×7Ò7¸ÑHÔHˆMÞœ™œÔ)¨"¨1¨"Ô-ˆJØ!.Ð=Ð=°Ð=Ð=ˆDŒOö &Ñ'Ô'ˆØ# jÑ0ˆŒØŒ×Ò D°4ÐÑ8Ô8Ð8Ø $¤Ð0Q¸4¼?Ð0QÐ0QÐ0QÑ QˆÔð 8:ˆÔØ$4ˆÔ!Ø%1ˆÔ"ð 59ˆÔ"ð 	?Ð>Ð>Ð>Ð>Ð>Ø0Ð0Ø'Ø2ð 
ñ  
ô  
ˆÔð &ˆÔØ"3ˆÔØ$%ˆÔ!ØÔð 	ðØÔ ×/Ò/Ø#œØœ=ÐZ®B¬J¯NªNÐ;RÐTYÑ,ZÔ,ZØœ*à*.Ô*=Ø,<Ø&0ð"ð "ð
 !Ø&*Ô&=ð 0ñ ô ð ð øõ ð 	ð 	ð 	õ —’Ø[Ð]^ñô ð ð ð ð ð ð øøøøð	øøøð 	.Ð-Ð-Ð-Ð-Ð-Ø$˜9™;œ;ˆÔð	ØKÐKÐKÐKÐKÐKØ+Ð+Ñ-Ô-ˆJˆJøÝð 	ð 	ð 	ØˆJˆJˆJð	øøøð
 7;ˆÔ3ð "ˆÔØ$ˆÔØ%*ˆÔ"Ø&(ˆÔ#Ø#$ˆÔ Ø"#ˆÔØð 	ðØ'Ÿ^š^¨H°bÑ9Ô9�
Ø'1§~¢~Ð6FÈÑ'NÔ'N�Ô$Ø-7¯^ª^Ð<RÐTYÑ-ZÔ-Z�Ô*Þ.1°*·.².ÐAQÐSUÑ2VÔ2VÑ.WÔ.W�Ô+ØÔ'ð 8¨4Ô+Eð 8Ø=Ð=Ð=Ð=Ð=Ð=Ø)4¨Ø*4¯.ª.Ð9LÈdÑ*SÔ*SØ(2¯ªÐ7HÈ$Ñ(OÔ(Oð*ñ *ô *�DÔ&ð Ô&×5Ò5Ñ7Ô7Ð7øøÝð ð ð Ø�ðøøøð  $ˆÔØñ :	,ð9,ØGQÐ%Y Z§^¢^°JÀÑ%CÔ%CÐ%CÐWYÐ"à%ñ 34ØTÐTÐTÐTÐTÐTØPÐPÐPÐPÐPÐPØ+9¨>Ñ+;Ô+;�DÔ(Ø#˜)Ð$6Ñ7Ô7�CØð ?˜s×/Ò/Ñ1Ô1ð ?ØÔ,×9Ò9¸#Ñ>Ô>Ð>ØÔ+Ô5ñ ,4à*.¬/Ø(0Ð(9°EÝ+.®Ñ/@Ô/@Ñ+AÔ+AØ-6ð	(ð (˜ð  Ô+ð %ð%Ø&*Ô&6×&HÒ&HÈÌÑ&YÔ&Y Ø#&ð !HØDG L°Ñ$AøøÝ#,ð %ð %ð %Ø $ ð%øøøð  œ=ð DØ6:´m˜L¨Ñ3Øœ?ð HØ8<¼˜L¨Ñ5Øœ=ð DØ6:´m˜L¨Ñ3Øœ?ð HØ8<¼˜L¨Ñ5Øœ?ð HØ8<¼˜L¨Ñ5Øœ?ð HØ8<¼˜L¨Ñ5àÔ4ð \ØBFÔB[˜LÐ)>Ñ?ð!ØSÐSÐSÐSÐSÐSØ'>Ð'>Ñ'@Ô'@˜HØ=E˜LÐ)9Ñ:Ø>F˜LÐ):Ñ;Ð;øÝ(ð !ð !ð !Ø ˜Dð!øøøà;˜Ô,Ô;ÑKÐK¸lÐKÐKÐKÝŸšÐ$DÐFXÑYÔYÐYÐYåŸšÐ%VÐXjÑkÔkÐkØ/3˜Ô,øøÝð ,ð ,ð ,Ý—’ÐGÈÑNÔNÐNØ'+�Ô$Ð$Ð$Ð$Ð$Ð$øøøøð,øøøð Ôð 	5 D¤JÐ$:ð$ð $àœð$ñ $ô $Ð ð
  Ô/×DÒDÑFÔFð 5ð 5�Ø Ÿš V¨RÑ0Ô0�Øð ˜fÐ(<Ð<Ð<ØØ$.¸GÐDÐD�Ø”
×!Ò! (Ñ+Ô+Ð+Øð 5ØÔ)×-Ò-¨fÑ5Ô5Ð5Ø(×,Ò,¨VÑ4Ô4Ð4øð &(ˆÔ"ð	Ø&ŸNšN¨8°RÑ8Ô8ˆMÞ),¨]×->Ò->Ð?XÐZ\Ñ-]Ô-]Ñ)^Ô)^ˆDÔ&Ð&øÝð 	ð 	ð 	ØˆDð	øøøð
 $Ÿš¨°Ñ4Ô4ˆÝ˜.­$Ñ/Ô/ð 	 ØˆNØ%3×%7Ò%7Ð8NÐPVÑ%WÔ%WˆÔ"ð	Ø-×1Ò1Ð2CÀQÑGÔGÐÞÐ/Ñ0Ô0ˆLØ˜aÒÐØ �øøÞž:Ð&ð 	ð 	ð 	ØˆLˆLˆLð	øøøà ,ˆÔð
 &Ÿ>š>¨-¸Ñ<Ô<ÐÝÐ*­DÑ1Ô1ð 	"Ø!ÐÞ %Ð&6×&:Ò&:¸;ÈÑ&MÔ&MÑ NÔ NÐÝ!Ð"2×"6Ò"6°yÀ$Ñ"GÔ"GÑHÔH×NÒNÑPÔPÐThÐhÐÞ#(Ð)9×)=Ò)=¸nÈdÑ)SÔ)SÑ#TÔ#TÐ Þ#&Ð'7×';Ò';Ð<LÈbÑ'QÔ'QÑ#RÔ#RÐ ð
	Ø!—~’~ k°2Ñ6Ô6×:Ò:¸=È"ÑMÔMˆHˆHøÝð 	ð 	ð 	ØˆHˆHˆHð	øøøå�h¥Ñ%Ô%ð 	'Ø"*§,¢,Ð/?Ñ"@Ô"@ÐÐà"&ÐØÐ*ð+Þ&)Ð*=Ñ&>Ô&>Ð#Ð#øÞžzÐ*ð +ð +ð +Ø&*Ð#Ð#Ð#ð+øøøà6IˆÔ3ð  —^’^ G¨RÑ0Ô0ˆ
Ý�j¥$Ñ'Ô'ð 	*Ø%/§^¢^Ð4DÑ%EÔ%EÐ"Ð"à%)Ð"Ø!Ð-ð.Þ),Ð-CÑ)DÔ)DÐ&Ð&øÞžzÐ*ð .ð .ð .Ý—’ð6ð +ñ	ô ð ö ðIÐJ`ð Ið Ið Iö œð	ñ ô ð ð *.Ð&Ð&Ð&ð.øøøð  '=ˆÔ#ð	'ØIÐIÐIÐIÐIÐIØ ?Ð ?À
Ñ KÔ KÐÐøÝð 	'ð 	'ð 	'Ø *§¢Ð/AÑ BÔ BÐÝÐ/µÑ6Ô6ð 'Ø$&Ð!øøð	'øøøð "Ñ)Ð.?Ñ)ð
(ØPÐPÐPÐPÐPÐPØ#EÐ#EØœ*Ø!œ]Ø%6ð$ñ $ô $Ð ð
 $ð CÞ-0Ð1AÑ-BÔ-BÐ*øøÝð (ð (ð (Ø#'Ð Ð Ð ð(øøøð
 &Ñ-Ø7;´}ÐL˜$œ-×.Ò.¨sÑ3Ô3Ð3È"�Ø!2ð ñ �IÝ% iµÑ6Ô6ð !Ø Ø(Ÿ}š}¨ZÑ8Ô8Ð>¸B×FÒFÀsÑKÔK�GØð  7¨gÒ#5Ð#5Ø%.§]¢]°8¸RÑ%@Ô%@˜
Ý% jµ$Ñ7Ô7ð *Ø,6¯NªN¸4¼:ÀrÑ,JÔ,J˜MÝ)¨-½Ñ>Ô>ð *Ø*7×*;Ò*;Ð<LÑ*MÔ*M Ø#*Ð#6ð%*Þ25°g±,´,¨Ø+2°aª<¨<Þ2<Ð,<ð ,8øæ,5¶zÐ+Bð %*ð %*ð %*Ý(.¯ªð-Nð -1¬J¸ñ)*ô )*ð )*ö ).ð-aÐVZÔV`ð -að -að  {Bð -að -að -aö 25´ð	)*ñ )*ô )*ð )*ð )*ð )*ð%*øøøð ˜ùð  ÐØ#ˆð	Ý8BÀ:ÍtÑ8TÔ8TÐ\�z—~’~ i°Ñ4Ô4Ð4ÐZ\ˆHØ#Ÿ<š<¨°,Ñ?Ô?ÐOÀ<ˆLˆLøÝð 	ð 	ð 	ØˆDð	øøøð ˜<Ò'Ð'ðcØFÐFÐFÐFÐFÐFØ#6Ð#6°|Ñ#DÔ#DÐ Ð øÝð cð cð cÝ—’ÐSÐUaÑbÔbÐbÐbÐbÐbÐbÐbøøøøðcøøøð  Ð'ðØLÐLÐLÐLÐLÐLØ!:Ð!:Ñ!<Ô!<�JØ!ð 6 j¤o¸Ò&EÐ&EØ+5Ð(øøÝ ð ð ð Ø�Dðøøøð  Ð'Ý—’Ø[Ø ñô ð ð Ð'Ø&6ˆDÔ#àEÐEÐEÐEÐEÐEØ6Ð6Ø”
ØœÞ  i°Ñ4Ô4Ø&<ØœØ!2ðñ ô ˆOð Ô#×0Ó0Ø”jØ.ØœÞ  i°Ñ4Ô4Øœð 1ñ ô ð ð ”?ð OÝ—’Ð6Ð8HÔ8MÑNÔNÐNøæ&7Ø”jØ"7Ø !Ø7Ø%=Ø'+Øœ?ØœÞ  i°Ñ4Ô4Ø&<ØœØœð'ñ 'ô 'ˆDÔ#ð $7ˆÕ ð 	@Ð?Ð?Ñ?Ð?Ð?Þ�tÔ.Ð0@À!ÑDÔDˆØð 	�DÐ1Ò1Ð1ÞðD˜œð Dð D¸dÐOð Dð DØ.DÐRðDð Dð *¨TÑ1ðDð Dð Dñô ð õ 03©u¬uˆÕ'Ý�4Ð-Ñ.Ô.ð 	@°4Ô3Jð 	@ÈtÌzÐOeØÔ2×CÓCÑEÔEð @ð @�Ø$.¸GÐDÐD�Ø”
×!Ò! (Ñ+Ô+Ð+Ø Ÿš V¨RÑ0Ô0�Øð @ØÔ)×-Ò-¨fÑ5Ô5Ð5ØÕ3×7Ò7¸Ñ?Ô?Ð?øõ �4Ð-Ñ.Ô.ð 
	M°4Ô3Jð 
	Mð	MØÔ'×8Ó8Ø”OÝ #¦OÑ$5Ô$5Ñ 6Ô 6Ø!œ]Ð3¨eØœ*Þ#*¨4Ô+BÐDTÐVWÑ#XÔ#Xð 9ñ ô ð ð øõ ð Mð Mð MÝ—’ÐBÀGÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøö $;Þ�	 .Ñ1Ô1Ð9°Tð$
ñ $
ô $
ˆÕ ð !"ˆÕð &'ˆÕ"Ø)*ˆÕ&Ø$%ˆÕ!Ø!"ˆÕØ$%ˆÕ!Ø%&ˆÕ"Ø)*ˆÕ&Ø*+ˆÕ'Ø()ˆÕ%Ø*-ˆÕ'Ø#,ˆÕ Ø#)ˆÕ ð ,0ˆÕØ#'Ð Ý�j¥$Ñ'Ô'ð 	HØ'1§~¢~Ð6FÑ'GÔ'GÐ$Ø#Ð/ðbÞ'*Ð+CÑ'DÔ'D�Õ$Ð$øÞžzÐ*ð bð bð bÝ—’ÐFÐH`ÑaÔaÐaÐaÐaðbøøøàÕÐ'¨D¬MÐ'Ö>OÐPTÔP]Ñ>^Ô>^Ð'ðIÞ0°´¸T¼]ÐTXÔT`ÐTfÐdfÐgÑgÔg�	Øð 5 ¨Q¢ Ø+4�DÕ(øøÝð Ið Ið IÝ—’ÐBÀCÑHÔHÐHÐHÐHÐHÐHÐHøøøøðIøøøàÕð 	¨¬ð 	Ý�KŠKØSØÕ$ñô ð ð
 Œð 	|Ø"ð |Þñ  ~¨TÔ-DÕ-Sð  ~ð  ~ñ  ~Öloð  qFñ  GJñ  qJñ  mKô  mKð  ~ñ  ~ð  QUô  Qhõ  Qyð  ~ð  ~ð  ~ð  ~ñ  ô  ð  ð  æÑz¨TÔ-DÕ-SÐzÐzÑzÐzÑ{Ô{Ð{ð
 %)ˆÕ!Ø×1Ó1Ñ3Ô3Ð3ð Ô%ˆà”ZØœØœØœÞ˜t Y°Ñ3Ô3Ý! $Ô"5Ñ6Ô6Ø"&Ô":Ø'+Ô'Dö !(¨¨W°d´jÑ AÔ AÞ#*¨3°
¸D¼MÑ#JÔ#JÞ")¨#¨y¸"Ñ"=Ô"=Þ#*¨3°
¸D¼MÑ#JÔ#JØ),Õ);Ø+.Õ+?ñ#!
ð !
ˆÕð& Œ=Ð0Ò0Ð0ØÕ!×(Ó(Ø%)Ô%<Ø&*Ô&>Ø&*Ô&>ñ*ð *ñ ô ð ð ð ð 1Ð0s¶  É$I9 É9
JÊJÊ
,J7 Ê7
KËKÖ2AW: ×:
XØXã6Cf9 æ9
gçgð=1q/ ñ/
q<ñ;q<öC
y  ù 
zù*y=ù=zÁK*AAM	 ÁM	
AM8ÁMAM3ÁM3AM8ÁNAN" ÁN"AN1ÁN0AN1ÁO(CAS ÁS
ASÁSASÁS B/AZ< ÁV&AV7 ÁV6AZ< ÁV7
AWÁWAZ< ÁWAWÁWA:AZ< ÁX?AY ÁYAZ< ÁY
AY'ÁY$AZ< ÁY&AY'ÁY'AAZ< ÁZ<
A[2Á["A[-Á[-A[2Á^%?A_% Á_%
A_2Á_1A_2Á`>.Aa- Áa-AbÁbAbÁe *Af ÁfAfÁfAfÁgAg ÁgAg6Ág5Ag6ÁiAi ÁiAAj+Áj*Aj+Áj6Ak Ák6AlÁl AlÁl0Al< Ál<AmÁm
AmÁp4AqÁqAAr3Ár2Ar3Ár?AAt Át
AtÁtAtÁtAt. Át.
AuÁt8AuÁuAuÁu#Av Áv
AvÁvAvÁA B@) Â@)
BAÂ@3BAÂABAÂD'BD> ÂD>.BE/ÂE.BE/ÂF4BG ÂG
BG;ÂGBG6ÂG6BG;c                 ó$  — d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        t          | d¦  «        r"| j        r| j                             ¦   «          dS dS dS )a³  Reset all session-scoped token counters to 0 for a fresh session.
        
        This method encapsulates the reset logic for all session-level metrics
        including:
        - Token usage counters (input, output, total, prompt, completion)
        - Cache read/write tokens
        - API call count
        - Reasoning tokens
        - Estimated cost tracking
        - Context compressor internal counters
        
        The method safely handles optional attributes (e.g., context compressor)
        using ``hasattr`` checks.
        
        This keeps the counter reset logic DRY and maintainable in one place
        rather than scattering it across multiple methods.
        r   rn  ro  r  rk  N)r  r  r  r  r  r  r  r  r  r  r  r  r  r�  rk  Úon_session_resetri   s    rZ   Úreset_session_statezAIAgent.reset_session_stateÿ  s¼   € ð& %&ˆÔ!Ø$%ˆÔ!Ø%&ˆÔ"Ø%&ˆÔ"Ø)*ˆÔ&Ø)*ˆÔ&Ø*+ˆÔ'Ø()ˆÔ%Ø!"ˆÔØ*-ˆÔ'Ø#,ˆÔ Ø#)ˆÔ ð !"ˆÔõ �4Ð-Ñ.Ô.ð 	7°4Ô3Jð 	7ØÔ#×4Ò4Ñ6Ô6Ð6Ð6Ð6ð	7ð 	7ð 	7ð 	7r\   c                 ór	  ‡‡— ddl m} |s |||¦  «        }|dk    r1|dv r-t          |t          ¦  «        r|rt	          j        dd|¦  «        }| j        }| j        }|| _        || _        |p| j        | _        || _	        t          | d¦  «        r| j                             ¦   «          |r|| _        |dk    r«ddlm}	m}
m} |d	k    }|r|p| j        p |
¦   «         pdn
|p| j        pd}|| _        || _        |pt'          | d
d¦  «        | _         |	|| j        t+          | j        | j        ¦  «        ¬¦  «        | _        |r ||¦  «        nd| _        d| _        i | _        nq|p| j        }|p| j        }||dœ| _        t+          | j        | j        ¦  «        }|�
|| j        d<   |                      t7          | j        ¦  «        dd¬¦  «        | _        |                      || j        ||¬¦  «        \  | _        | _        t          | d¦  «        r·| j        r°ddl m!} d}	 ddl"m#}m$}  |¦   «         } ||¦  «        }n# tJ          $ r d}Y nw xY w || j        | j        | j        | j        t'          | dd¦  «        |¬¦  «        }| j         &                    | j        || j        t'          | dd¦  «        | j        | j	        ¬¦  «         d| _'        t          | d¦  «        r| j        r| j        nd}| j        | j        | j        | j	        t'          | dd¦  «        t7          | j        ¦  «        | j        | j        |rt'          |d| j        ¦  «        n| j        |rt'          |d| j        ¦  «        n| j        |rt'          |dd¦  «        nd|rt'          |d| j        ¦  «        n| j        |r|j(        nd|r|j)        nddœ| _*        |dk    r-| j*         +                    | j        | j        | j        dœ¦  «         d| _,        d| _-        |pd .                    ¦   «          /                    ¦   «         Š|pd .                    ¦   «          /                    ¦   «         Šta          t'          | d g ¦  «        pg ¦  «        }‰r‰r‰‰k    rˆˆfd!„|D ¦   «         }|| _1        |r|d         nd| _2        tg          j4        d"||||¦  «         dS )#a]  Switch the model/provider in-place for a live agent.

        Called by the /model command handlers (CLI and gateway) after
        ``model_switch.switch_model()`` has resolved credentials and
        validated the model.  This method performs the actual runtime
        swap: rebuilding clients, updating caching flags, and refreshing
        the context compressor.

        The implementation mirrors ``_try_activate_fallback()`` for the
        client-swap logic but also updates ``_primary_runtime`` so the
        change persists across turns (unlike fallback which is
        turn-scoped).
        r   )Údetermine_api_moder¸  )úopencode-zenúopencode-goz/v1/?$r€   rÊ  ©rÜ  rÝ  râ  r¾  rÅ  Nrã  Frø  rä  Úswitch_modelTr  ©r|  rˆ   r}  r‚  rk  r_  )rÒ  rV  r  )rˆ   r{  r|  ra  rW  r{  )r‚  rT  rˆ   r{  r|  r}  r‚  rˆ   r|  rq  r{  rÒ  c                 ó’   •— g | ]C}|                      d ¦  «        pd                     ¦   «                              ¦   «         ‰‰hv¯A|‘ŒDS )r|  r€   )rƒ   r„   rj  )rÉ   ÚentryÚnew_normÚold_norms     €€rZ   rË   z(AIAgent.switch_model.<locals>.<listcomp>Î  s]   ø€ ð ð ð ØØ—I’I˜jÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8×>Ò>Ñ@Ô@ÈÐS[ÐH\Ð\Ð\ð Ø\Ð\Ð\r\   z+Model switched in-place: %s (%s) -> %s (%s))5Úhermes_cli.providersr{  rb   rc   r;  rû   r‚  r|  rˆ   r}  r�  rÊ  r‘  r{  rÁ  rÜ  rÝ  râ  rÄ  ro   rÅ  r   r¿  rÀ  rÆ  rÇ  rÑ  rÚ   r¦  r§  r¨  rk  r  r`  rª  rÒ  rV  r�   r	  rä  rT  r  r!  r"  rÔ  rÓ  r„   rj  r  rÒ  rÕ  rØ   rµ  )rX   Ú	new_modelÚnew_providerr{  rˆ   r}  r{  Ú	old_modelÚold_providerrÜ  rÝ  râ  r.  r/  r7  Ú_sm_timeoutr`  Ú_sm_custom_providersrÒ  rV  Ú_sm_cfgÚnew_context_lengthrv  Úfallback_chainrƒ  r„  s                           @@rZ   r  zAIAgent.switch_model&  sW  øø€ ð 	<Ð;Ð;Ð;Ð;Ð;ð ð 	BØ)Ð)¨,¸ÑAÔAˆHð Ð,Ò,Ð,ØÐ ?Ð?Ð?Ý˜8¥SÑ)Ô)ð @àð @õ ”v˜i¨¨XÑ6Ô6ˆHà”Jˆ	Ø”}ˆð ˆŒ
Ø$ˆŒØ Ð1 D¤MˆŒØ ˆŒå�4Ð+Ñ,Ô,ð 	*ØÔ!×'Ò'Ñ)Ô)Ð)Øð 	#Ø"ˆDŒLð Ð+Ò+Ð+ðð ð ð ð ð ð ð ð ð ð $0°;Ò#>Ð Ø\pð  V˜WÐW¨¬ÐWÐ8OÐ8OÑ8QÔ8QÐWÐUWøÐw~ð  xUð  CGô  COð  xUð  SUˆMØ(ˆDŒLØ&3ˆDÔ#Ø'/Ð']µ7¸4ÐAVÐX\Ñ3]Ô3]ˆDÔ$Ø%;Ð%;Ø˜tÔ7Ý4°T´]ÀDÄJÑOÔOð&ñ &ô &ˆDÔ"ð J^Ð'h  °}Ñ'EÔ'EÐ'EÐchˆDÔ$ØˆDŒKØ"$ˆDÔÐà#Ð3 t¤|ˆMØ%Ð6¨¬ˆNà(Ø*ð#ð #ˆDÔõ 7°t´}ÀdÄjÑQÔQˆKØÐ&Ø1<�Ô# IÑ.Ø×4Ò4Ý�TÔ(Ñ)Ô)Ø%Øð 5ñ ô ˆDŒKð ×/Ò/Ø%ØœØ!Øð	 0ñ ô ñ 	@ˆÔ  $Ô"?õ �4Ð-Ñ.Ô.ð 	°4Ô3Jð 	ØEÐEÐEÐEÐEÐEð $(Ð ð,ØZÐZÐZÐZÐZÐZÐZÐZØ%˜+™-œ-�Ø'FÐ'FÀwÑ'OÔ'OÐ$Ð$øÝð ,ð ,ð ,Ø'+Ð$Ð$Ð$ð,øøøà!9Ð!9Ø”
ØœØœØœÝ&-¨dÐ4LÈdÑ&SÔ&SØ!5ð"ñ "ô "Ðð Ô#×0Ò0Ø”jØ1ØœÝ  i°Ñ4Ô4ØœØœð 1ñ ô ð ð &*ˆÔ"õ *1°Ð7KÑ)LÔ)LÐrÐQUÔQhÐrˆdÔ%Ð%Ðnrˆà”ZØœØœØœÝ˜t Y°Ñ3Ô3Ý! $Ô"5Ñ6Ô6Ø"&Ô":Ø'+Ô'DØEHÐ X¥¨¨W°d´jÑ AÔ AÐ AÈdÌjØNQÐ#d¥7¨3°
¸D¼MÑ#JÔ#JÐ#JÐW[ÔWdØADÐ"L¥'¨#¨y¸"Ñ"=Ô"=Ð"=È"ØNQÐ#d¥7¨3°
¸D¼MÑ#JÔ#JÐ#JÐW[ÔWdØ?BÐ)I¨Ô);Ð);ÈØCFÐ+M¨3Ô+?Ð+?ÈAð!
ð !
ˆÔð  Ð+Ò+Ð+ØÔ!×(Ò(Ø%)Ô%<Ø&*Ô&>Ø&*Ô&>ð*ð *ñ ô ð ð $)ˆÔ Ø ˆÔð !Ð& B×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆØ Ð& B×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆÝ�g dÐ,=¸rÑBÔBÐHÀbÑIÔIˆØð 	˜ð 	 X°Ò%9Ð%9ðð ð ð ð Ø#1ðñ ô ˆNð  .ˆÔØ4BÐL˜~¨aÔ0Ð0ÈˆÔåŒØ9Ø�| Y°ñ	
ô 	
ð 	
ð 	
ð 	
s   ÈH< È<IÉ
Ic                 ód   — 	 | j         pt          } ||i |¤Ž dS # t          t          f$ r Y dS w xY w)a3  Print that silently handles broken pipes / closed stdout.

        In headless environments (systemd, Docker, nohup) stdout may become
        unavailable mid-session.  A raw ``print()`` raises ``OSError`` which
        can crash cron jobs and lose completed work.

        Internally routes through ``self._print_fn`` (default: builtin
        ``print``) so callers such as the CLI can inject a renderer that
        handles ANSI escape sequences properly (e.g. prompt_toolkit's
        ``print_formatted_text(ANSI(...))``) without touching this method.
        N)r†  rÈ  r`   ra   )rX   r�  Úkwargsr  s       rZ   Ú_safe_printzAIAgent._safe_printÚ  sU   € ð	Ø”Ð(¥5ˆBØˆB�Ð˜ÐÐÐÐÐøÝ�Ð$ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ š/®/©Úforcer“  c                ó®   — t          | dd¦  «        rdS |st          | dd¦  «        rdS |s|                      ¦   «         r	| j        sdS  | j        |i |¤Ž dS )ue  Verbose print â€” suppressed when actively streaming tokens.

        Pass ``force=True`` for error/warning messages that should always be
        shown even during streaming playback (TTS or display).

        During tool execution (``_executing_tools`` is True), printing is
        allowed even with stream consumers registered because no tokens
        are being streamed at that point.

        After the main response has been delivered and the remaining tool
        calls are post-response housekeeping (``_mute_post_response``),
        all non-forced output is suppressed.

        ``suppress_status_output`` is a stricter CLI automation mode used by
        parseable single-query flows such as ``hermes chat -q``. In that mode,
        all status/diagnostic prints routed through ``_vprint`` are suppressed
        so stdout stays machine-readable.
        r•  FNÚ_mute_post_response)ro   Ú_has_stream_consumersr–  r‘  )rX   r“  r�  r�  s       rZ   Ú_vprintzAIAgent._vprintì  s‡   € õ& �4Ð1°5Ñ9Ô9ð 	ØˆFØð 	� Ð'<¸eÑDÔDð 	ØˆFØð 	˜×3Ò3Ñ5Ô5ð 	¸dÔ>Sð 	ØˆFØˆÔ˜$Ð) &Ð)Ð)Ð)Ð)Ð)r\   c                 óÈ   — | j         �dS t          t          dd¦  «        }|€dS 	 t          |                     ¦   «         ¦  «        S # t
          t          t          f$ r Y dS w xY w)aŠ  Return True when quiet-mode spinner output has a safe sink.

        In headless/stdio-protocol environments, a raw spinner with no custom
        ``_print_fn`` falls back to ``sys.stdout`` and can corrupt protocol
        streams such as ACP JSON-RPC. Allow quiet spinners only when either:
        - output is explicitly rerouted via ``_print_fn``; or
        - stdout is a real TTY.
        NTr’   F)r†  ro   r”   r­   rm   ÚAttributeErrorra   r`   )rX   r—   s     rZ   Ú_should_start_quiet_spinnerz#AIAgent._should_start_quiet_spinner	  sp   € ð Œ>Ð%Ø�4Ý�˜h¨Ñ-Ô-ˆØˆ>Ø�5ð	Ý˜Ÿš™œÑ(Ô(Ð(øÝ¥
­GÐ4ð 	ð 	ð 	Ø�5�5ð	øøøs   ¥ A ÁA!Á A!c                 óJ   — | j         o| j         ot          | dd¦  «        dk    S )aZ  Return True when quiet-mode tool summaries should print directly.

        Quiet mode is used by both the interactive CLI and embedded/library
        callers. The CLI may still want compact progress hints when no callback
        owns rendering. Embedded/library callers, on the other hand, expect
        quiet mode to be truly silent.
        rg  r€   r-  )r‰  r”  ro   ri   s    rZ   Ú _should_emit_quiet_tool_messagesz(AIAgent._should_emit_quiet_tool_messages	  s5   € ð ŒOð 7ØÔ/Ð/ð7å˜˜j¨"Ñ-Ô-°Ò6ð	
r\   Úmessagec                 ó  — 	 |                       | j        › |› �d¬¦  «         n# t          $ r Y nw xY w| j        rF	 |                      d|¦  «         dS # t          $ r  t                               dd¬¦  «         Y dS w xY wdS )u˜  Emit a lifecycle status message to both CLI and gateway channels.

        CLI users see the message via ``_vprint(force=True)`` so it is always
        visible regardless of verbose/quiet mode.  Gateway consumers receive
        it through ``status_callback("lifecycle", ...)``.

        This helper never raises â€” exceptions are swallowed so it cannot
        interrupt the retry/fallback logic.
        Tr’  Ú	lifecyclez%status_callback error in _emit_status©Úexc_infoN©r—  rŒ  r�   rž  r6  rÙ   ©rX   r�  s     rZ   Ú_emit_statuszAIAgent._emit_status(	  sÆ   € ð	Ø�LŠL˜DœOÐ6¨WÐ6Ð6¸dˆLÑCÔCÐCÐCøÝð 	ð 	ð 	ØˆDð	øøøàÔð 	UðUØ×$Ò$ [°'Ñ:Ô:Ð:Ð:Ð:øÝð Uð Uð UÝ—’ÐDÈt�ÑTÔTÐTÐTÐTÐTðUøøøð	Uð 	Uó   ‚ # £
0¯0»A Á&A=Á<A=c                 ó  — 	 |                       | j        › |› �d¬¦  «         n# t          $ r Y nw xY w| j        rF	 |                      d|¦  «         dS # t          $ r  t                               dd¬¦  «         Y dS w xY wdS )a+  Emit a user-visible warning through the same status plumbing.

        Unlike debug logs, these warnings are meant for degraded side paths
        such as auxiliary compression or memory flushes where the main turn can
        continue but the user needs to know something important failed.
        Tr’  Úwarnz&status_callback error in _emit_warningr   Nr¢  r£  s     rZ   Ú_emit_warningzAIAgent._emit_warning<	  sÇ   € ð	Ø�LŠL˜DœOÐ6¨WÐ6Ð6¸dˆLÑCÔCÐCÐCøÝð 	ð 	ð 	ØˆDð	øøøàÔð 	VðVØ×$Ò$ V¨WÑ5Ô5Ð5Ð5Ð5øÝð Vð Vð VÝ—’ÐEÐPT�ÑUÔUÐUÐUÐUÐUðVøøøð	Vð 	Vr¥  Útaskru  c                 óL  — 	 |                       |¦  «        }n# t          $ r t          |¦  «        }Y nw xY w|p|j        j                             ¦   «         }t          |¦  «        dk    r|dd…                              ¦   «         dz   }|                      d|› d|› �¦  «         dS )z4Surface a compact warning for failed auxiliary work.éÜ   NéÙ   ræ  u   âš  Auxiliary z	 failed: )	Ú_summarize_api_errorr�   rc   Ú	__class__rr   r„   rd   r‰  r¨  )rX   r©  ru  Údetails       rZ   Ú_emit_auxiliary_failurezAIAgent._emit_auxiliary_failureM	  s»   € ð	Ø×.Ò.¨sÑ3Ô3ˆFˆFøÝð 	ð 	ð 	Ý˜‘X”XˆFˆFˆFð	øøøàÐ2˜CœMÔ2×9Ò9Ñ;Ô;ˆÝˆv‰;Œ;˜ÒÐØ˜D˜S˜D”\×(Ò(Ñ*Ô*¨UÑ2ˆFØ×ÒÐC¨DÐCÐC¸6ÐCÐCÑDÔDÐDÐDÐDs   ‚ ˜4³4c           	      ó¼   — t          | dd¦  «        pdt          | dd¦  «        pdt          | dd¦  «        pdt          | dd¦  «        pdt          | dd¦  «        pddœS )zBReturn the live main runtime for session-scoped auxiliary routing.r‚  r€   r|  rˆ   r{  r}  )r‚  r|  rˆ   r{  r}  )ro   ri   s    rZ   Ú_current_main_runtimezAIAgent._current_main_runtimeX	  sw   € õ ˜T 7¨BÑ/Ô/Ð5°2Ý  j°"Ñ5Ô5Ð;¸Ý  j°"Ñ5Ô5Ð;¸Ý˜t Y°Ñ3Ô3Ð9°rÝ  j°"Ñ5Ô5Ð;¸ð
ð 
ð 	
r\   c                 óð  — | j         sdS 	 ddlm} ddlm}m}  |d|                      ¦   «         ¬¦  «        \  }}|�|s:d}|| _        |                      |¦  «         t           
                    d¦  «         dS t          t          |d	d
¦  «        ¦  «        }t          t          |dd
¦  «        ¦  «        } ||||t          | dd¦  «        t          | dd
¦  «        ¬¦  «        }	|	r'|	|k     r!t          d|› d|	d›d|d›d|dz  › d�	¦  «        ‚| j        j        }
|	|
k     r›|
}|	}|| j        _        | j        j        }|r||z  | j        _        |rt%          |	|z  dz  ¦  «        nd}d|› d|	d›d|d›d|d›d|d›d|d›�}|| _        |                      |¦  «         t           
                    d||	||¦  «         dS dS # t          $ r ‚ t&          $ r&}t                               d |¦  «         Y d}~dS d}~ww xY w)!a”  Warn at session start if the auxiliary compression model's context
        window is smaller than the main model's compression threshold.

        When the auxiliary model cannot fit the content that needs summarising,
        compression will either fail outright (the LLM call errors) or produce
        a severely truncated summary.

        Called during ``__init__`` so CLI users see the warning immediately
        (via ``_vprint``).  The gateway sets ``status_callback`` *after*
        construction, so ``_replay_compression_warning()`` re-sends the
        stored warning through the callback on the first
        ``run_conversation()`` call.
        Nr   )Úget_text_auxiliary_client)rg  r`  rK  )Úmain_runtimeu˜   âš  No auxiliary LLM provider configured â€” context compression will drop middle turns without a summary. Run `hermes setup` or set OPENROUTER_API_KEY.uL   No auxiliary LLM provider for compression â€” summaries will be unavailable.rˆ   r€   r{  rí  r|  )rˆ   r{  ra  r|  zAuxiliary compression model rh  r,  ri  zE required by Hermes Agent.  Choose a compression model with at least rj  z–K context (set auxiliary.compression.model in config.yaml), or set auxiliary.compression.context_length to override the detected value if it is wrong.rz  r3  u   âš  Compression model (z) context is z8 tokens, but the main model's compression threshold was z2 tokens. Auto-lowered this session's threshold to uÂ    tokens so compression can run.
  To make this permanent, edit config.yaml â€” either:
  1. Use a larger compression model:
       auxiliary:
         compression:
           model: <model-with-z[+-context>
  2. Lower the compression threshold:
       compression:
         threshold: 0.Ú02du´   Auxiliary compression model %s has %d token context, below the main model's compression threshold of %d tokens â€” auto-lowered session threshold to %d to keep compression working.z4Compression feasibility check failed (non-fatal): %s)r
  rÌ  r´  r  rg  r`  r²  r  r¤  r6  r7  rc   ro   ra   rk  r  rT  rc  r¬   r�   rÙ   )rX   r´  rg  r`  rÆ  Ú	aux_modelr  Úaux_base_urlÚaux_api_keyÚaux_contextrL  Úold_thresholdÚnew_thresholdÚmain_ctxÚsafe_pctru  s                   rZ   r   z,AIAgent._check_compression_model_feasibilityb	  ss  € ð Ô'ð 	ØˆFðo	ØHÐHÐHÐHÐHÐHðð ð ð ð ð ð ð ð
 !:Ð 9ØØ!×7Ò7Ñ9Ô9ð!ñ !ô !ÑˆF�Ið ˆ~ Yˆ~ðDð ð
 -0�Ô)Ø×!Ò! #Ñ&Ô&Ð&Ý—’ð5ñô ð ð �å�w v¨z¸2Ñ>Ô>Ñ?Ô?ˆLÝ�g f¨i¸Ñ<Ô<Ñ=Ô=ˆKà2Ð2ØØ%Ø#Ý&-¨dÐ4\Ð^bÑ&cÔ&cÝ   z°2Ñ6Ô6ðñ ô ˆKð ð 
˜{Ð-CÒCÐCÝ ð6°9ð 6ð 6Ø!,ÐLð6ð 6à5ÐMð6ð 6ð .°Ñ5ð	6ð 6ð 6ñ	ô 	ð 	ð Ô/Ô@ˆIØ˜YÒ&Ð&ð !*�Ø +�Ø;H�Ô'Ô8ð  Ô2ÔA�Øð à%¨Ñ0ð Ô+Ô=ð CKÐR�3 ¨hÑ 6¸#Ñ=Ñ>Ô>Ð>ÐPR�ð<¨ið <ð <Ø"ÐDð<ð <à1>ÐKð<ð <ð %ÐIð	<ð <ð 6CÐRð<ð <ð .6Ð;ð<ð <ð ð -0�Ô)Ø×!Ò! #Ñ&Ô&Ð&Ý—’ð0ð ØØ!Ø!ñ	ô 	ð 	ð 	ð 	ðO 'Ð&øõb ð 	ð 	ð 	ð Ýð 	ð 	ð 	Ý�LŠLØFÈñô ð ð ð ð ð ð ð øøøøð	øøøs   ‹A,F; Á9D>F; Æ;G5ÇG0Ç0G5c                 ó’   — t          | dd¦  «        }|r1| j        r,	 |                      d|¦  «         dS # t          $ r Y dS w xY wdS dS )u¶  Re-send the compression warning through ``status_callback``.

        During ``__init__`` the gateway's ``status_callback`` is not yet
        wired, so ``_emit_status`` only reaches ``_vprint`` (CLI).  This
        method is called once at the start of the first
        ``run_conversation()`` â€” by then the gateway has set the callback,
        so every platform (Telegram, Discord, Slack, etc.) receives the
        warning.
        r  NrŸ  )ro   rž  r�   )rX   r  s     rZ   Ú_replay_compression_warningz#AIAgent._replay_compression_warningã	  s   € õ �dÐ2°DÑ9Ô9ˆØð 	�4Ô'ð 	ðØ×$Ò$ [°#Ñ6Ô6Ð6Ð6Ð6øÝð ð ð Ø��ðøøøð	ð 	ð 	ð 	s   œ4 ´
AÁAc                 ó�   — |�t          |¦  «        }n/t          | dd¦  «        pt          t          | dd¦  «        ¦  «        }|dk    S )z8Return True when a base URL targets OpenAI's native API.Nrv  r€   ru  zapi.openai.com)rO   ro   )rX   rˆ   Úhostnames      rZ   rŽ  zAIAgent._is_direct_openai_urlô	  s[   € àÐÝ(¨Ñ2Ô2ˆHˆHå˜tÐ%9¸2Ñ>Ô>ð ÕBSÝ˜Ð/°Ñ4Ô4ñCô CˆHð Ð+Ò+Ð+r\   c                 óx   — |�"t          |¦  «                             ¦   «         }nt          | dd¦  «        pd}d|v S )uÍ  Return True when a base URL targets Azure OpenAI.

        Azure OpenAI exposes an OpenAI-compatible endpoint at
        ``{resource}.openai.azure.com/openai/v1`` that accepts the
        standard ``openai`` Python client.  Unlike api.openai.com it
        does NOT support the Responses API â€” gpt-5.x models are served
        on the regular ``/chat/completions`` path â€” so routing decisions
        must treat Azure separately from direct OpenAI.
        Nru  r€   zopenai.azure.com)rc   rj  ro   )rX   rˆ   Úurls      rZ   r�  zAIAgent._is_azure_openai_urlþ	  sE   € ð ÐÝ�h‘-”-×%Ò%Ñ'Ô'ˆCˆCå˜$Ð 1°2Ñ6Ô6Ð<¸"ˆCØ! SÐ(Ð(r\   c                 ó‚   — t          | j        | j        ¦  «        }|�|S t          t	          j        dd¦  «        ¦  «        S )aÁ  Resolve the effective per-call request timeout in seconds.

        Priority:
          1. ``providers.<id>.models.<model>.timeout_seconds`` (per-model override)
          2. ``providers.<id>.request_timeout_seconds`` (provider-wide)
          3. ``HERMES_API_TIMEOUT`` env var (legacy escape hatch)
          4. 1800.0s default

        Used by OpenAI-wire chat completions (streaming and non-streaming) so
        the per-provider config knob wins over the 1800s default.  Without this
        helper, the hardcoded ``HERMES_API_TIMEOUT`` fallback would always be
        passed as a per-call ``timeout=`` kwarg, overriding the client-level
        timeout the AIAgent.__init__ path configured.
        NÚHERMES_API_TIMEOUTç      œ@)r   r|  r‚  r  r�   r  )rX   Úcfgs     rZ   Ú_resolved_api_call_timeoutz"AIAgent._resolved_api_call_timeout
  s<   € õ +¨4¬=¸$¼*ÑEÔEˆØˆ?ØˆJÝ•R”YÐ3°VÑ<Ô<Ñ=Ô=Ð=r\   c                 ó”   — t          | j        | j        ¦  «        }|�|dfS t          j        d¦  «        }|�t          |¦  «        dfS dS )a9  Resolve the base non-stream stale timeout and whether it is implicit.

        Priority:
          1. ``providers.<id>.models.<model>.stale_timeout_seconds``
          2. ``providers.<id>.stale_timeout_seconds``
          3. ``HERMES_API_CALL_STALE_TIMEOUT`` env var
          4. 300.0s default

        Returns ``(timeout_seconds, uses_implicit_default)`` so the caller can
        preserve legacy behaviors that only apply when the user has *not*
        explicitly configured a stale timeout, such as auto-disabling the
        detector for local endpoints.
        NFÚHERMES_API_CALL_STALE_TIMEOUT)ç     Àr@T)r   r|  r‚  r�   r  r  )rX   rÈ  Úenv_timeouts      rZ   Ú%_resolved_api_call_stale_timeout_basez-AIAgent._resolved_api_call_stale_timeout_base"
  sT   € õ )¨¬¸¼
ÑCÔCˆØˆ?Ø˜�:Ðå”iÐ ?Ñ@Ô@ˆØÐ"Ý˜Ñ%Ô% uÐ,Ð,àˆ{r\   r
  c                 ó<  — |                       ¦   «         \  }}t          | dd¦  «        p| j        pd}|r |rt          |¦  «        rt	          d¦  «        S t          d„ |D ¦   «         ¦  «        dz  }|dk    rt          |d¦  «        S |d	k    rt          |d
¦  «        S |S )z@Compute the effective non-stream stale timeout for this request.rr  Nr€   Úinfc              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S rg   ©rd   rc   ©rÉ   rõ  s     rZ   rÎ   z<AIAgent._compute_non_stream_stale_timeout.<locals>.<genexpr>A
  s.   è è € Ð7Ð7¨��S ™VœV™œÐ7Ð7Ð7Ð7Ð7Ð7r\   é   é † g     À‚@éPÃ  g      |@)rÎ  ro   rˆ   r2   r  Úsumr©   )rX   r
  Ú
stale_baseÚuses_implicit_defaultrˆ   Ú
est_tokenss         rZ   Ú!_compute_non_stream_stale_timeoutz)AIAgent._compute_non_stream_stale_timeout:
  s¾   € à,0×,VÒ,VÑ,XÔ,XÑ)ˆ
Ð)Ý˜4 ¨dÑ3Ô3ÐJ°t´}ÐJÈˆØ ð 	  Xð 	 Õ2CÀHÑ2MÔ2Mð 	 Ý˜‘<”<ÐåÐ7Ð7¨hÐ7Ñ7Ô7Ñ7Ô7¸1Ñ<ˆ
Ø˜ÒÐÝ�z 5Ñ)Ô)Ð)Ø˜ÒÐÝ�z 5Ñ)Ô)Ð)ØÐr\   c                 ó,   — t          | j        d¦  «        S )z1Return True when the base URL targets OpenRouter.rù  ©rN   ru  ri   s    rZ   r’  zAIAgent._is_openrouter_urlH
  s   € å$ TÔ%9¸?ÑKÔKÐKr\   r€  c                óŒ  — |�|n| j         pd}|�|n| j        pd}|�|n| j        pd}|�|n| j        pd}|                     ¦   «         }	|                     ¦   «         }
|                     ¦   «         }d|
v }t          |d¦  «        }|dk    }|o|dk    pt          |¦  «        dk    }|rdS |r|rd	S |r|rdS d
|
v }|dv }|r|rd	S dS )u¦  Decide whether to apply Anthropic prompt caching and which layout to use.

        Returns ``(should_cache, use_native_layout)``:
          * ``should_cache`` â€” inject ``cache_control`` breakpoints for this
            request (applies to OpenRouter Claude, native Anthropic, and
            third-party gateways that speak the native Anthropic protocol).
          * ``use_native_layout`` â€” place markers on the *inner* content
            blocks (native Anthropic accepts and requires this layout);
            when False markers go on the message envelope (OpenRouter and
            OpenAI-wire proxies expect the looser layout).

        Third-party providers using the native Anthropic transport
        (``api_mode == 'anthropic_messages'`` + Claude-named model) get
        caching with the native layout so they benefit from the same
        cost reduction as direct Anthropic callers, provided their
        gateway implements the Anthropic cache_control contract
        (MiniMax, Zhipu GLM, LiteLLM's Anthropic proxy mode all do).

        Qwen / Alibaba-family models on OpenCode, OpenCode Go, and direct
        Alibaba (DashScope) also honour Anthropic-style ``cache_control``
        markers on OpenAI-wire chat completions. Upstream pi-mono #3392 /
        pi #3393 documented this for opencode-go Qwen. Without markers
        these providers serve zero cache hits, re-billing the full prompt
        on every turn.
        Nr€   r  rù  r¸  r¾  r¿  )TT©TFÚqwen>   ÚalibabaÚopencoder}  r|  ©FF)r|  rˆ   r}  r‚  rj  rN   rO   )rX   r|  rˆ   r}  r‚  Úeff_providerÚeff_base_urlÚeff_api_modeÚ	eff_modelÚ
base_lowerÚmodel_lowerÚprovider_lowerÚ	is_claudeÚis_openrouterÚis_anthropic_wireÚis_native_anthropicÚmodel_is_qwenÚprovider_is_alibaba_familys                     rZ   r¦  z&AIAgent._anthropic_prompt_cache_policyL
  sJ  € ðB %-Ð$8˜˜¸d¼mÐRÐPRˆØ#+Ð#7�x�x¸d¼mÐ>QÈrˆØ#+Ð#7�x�x¸d¼mÐ>QÈrˆØ#Ð/�U�U°T´ZÐFÀBˆ	à!×'Ò'Ñ)Ô)ˆ
Ø—o’oÑ'Ô'ˆØ%×+Ò+Ñ-Ô-ˆØ Ð+ˆ	Ý-¨l¸OÑLÔLˆØ(Ð,@Ò@Ðàð hØ Ò,ÐfÕ0AÀ,Ñ0OÔ0OÐSfÒ0fð 	ð
 ð 	Ø�:Øð 	˜Yð 	Ø�;Øð 	 ð 	à�:ð  +Ð-ˆØ%3ð 8
ð &
Ð"ð &ð 	¨-ð 	ð �;àˆ|r\   c                 ó”   — |                       ¦   «         }d|v r|                     dd¦  «        d         }|                     d¦  «        S )a>  Return True for models that require the Responses API path.

        GPT-5.x models are rejected on /v1/chat/completions by both
        OpenAI and OpenRouter (error: ``unsupported_api_for_model``).
        Detect these so the correct api_mode is set regardless of
        which provider is serving the model.
        rÀ  r¢   r4  zgpt-5)rj  ÚrsplitrŠ  )r‚  Úms     rZ   Ú_model_requires_responses_apiz%AIAgent._model_requires_responses_api–
  sD   € ð �KŠK‰MŒMˆà�!ˆ8ˆ8Ø—’˜˜aÑ Ô  Ô$ˆAØ�|Š|˜GÑ$Ô$Ð$r\   rÉ  c                óÖ   — |pd                      ¦   «                              ¦   «         }|dk    r"	 ddlm}  || ¦  «        S # t          $ r Y nw xY wt
                               | ¦  «        S )zCReturn True when this provider/model pair should use Responses API.r€   Úcopilotr   )Ú!_should_use_copilot_responses_api)r„   rj  rË  r÷  r�   rp  rô  )r‚  r|  Únormalized_providerr÷  s       rZ   r�  z.AIAgent._provider_model_requires_responses_api¥
  s‘   € ð  (˜~¨2×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ÐØ )Ò+Ð+ðØOÐOÐOÐOÐOÐOØ8Ð8¸Ñ?Ô?Ð?øÝð ð ð ð �ðøøøõ ×4Ò4°UÑ;Ô;Ð;s   °A Á
AÁAc                 ób   — |                       ¦   «         s|                      ¦   «         rd|iS d|iS )av  Return the correct max tokens kwarg for the current provider.

        OpenAI's newer models (gpt-4o, o-series, gpt-5+) require
        'max_completion_tokens'. Azure OpenAI also requires
        'max_completion_tokens' for gpt-5.x models served via the
        OpenAI-compatible endpoint. OpenRouter, local models, and older
        OpenAI models use 'max_tokens'.
        Úmax_completion_tokensrŸ  )rŽ  r�  rw  s     rZ   Ú_max_tokens_paramzAIAgent._max_tokens_param·
  sA   € ð ×%Ò%Ñ'Ô'ð 	4¨4×+DÒ+DÑ+FÔ+Fð 	4Ø+¨UÐ3Ð3Ø˜eÐ$Ð$r\   r  c                 óv   — |sdS |                       |¦  «        }t          |                     ¦   «         ¦  «        S )aî  
        Check if content has actual text after any reasoning/thinking blocks.

        This detects cases where the model only outputs reasoning but no actual
        response, which indicates an incomplete generation that should be retried.
        Must stay in sync with _strip_think_blocks() tag variants.

        Args:
            content: The assistant message content to check

        Returns:
            True if there's meaningful content after think blocks, False otherwise
        F)Ú_strip_think_blocksr­   r„   )rX   r  Úcleaneds      rZ   Ú_has_content_after_think_blockz&AIAgent._has_content_after_think_blockÄ
  s>   € ð ð 	Ø�5ð ×*Ò*¨7Ñ3Ô3ˆõ �G—M’M‘O”OÑ$Ô$Ð$r\   c                 óž  — |sdS 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        z  ¬¦  «        }t          j        dd|t           j        t           j        z  ¬¦  «        }dD ]8}t          j        d	|› d
|› d�d|t           j        t           j        z  ¬¦  «        }Œ9t          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        ¬¦  «        }|S )uÃ  Remove reasoning/thinking blocks from content, returning only visible text.

        Handles four cases:
          1. Closed tag pairs (``<think>â€¦</think>``) â€” the common path when
             the provider emits complete reasoning blocks.
          2. Unterminated open tag at a block boundary (start of text or
             after a newline) â€” e.g. MiniMax M2.7 / NIM endpoints where the
             closing tag is dropped.  Everything from the open tag to end
             of string is stripped.  The block-boundary check mirrors
             ``gateway/stream_consumer.py``'s filter so models that mention
             ``<think>`` in prose aren't over-stripped.
          3. Stray orphan open/close tags that slip through.
          4. Tag variants: ``<think>``, ``<thinking>``, ``<reasoning>``,
             ``<REASONING_SCRATCHPAD>``, ``<thought>`` (Gemma 4), all
             case-insensitive.

        Additionally strips standalone tool-call XML blocks that some open
        models (notably Gemma variants on OpenRouter) emit inside assistant
        content instead of via the structured ``tool_calls`` field:
          * ``<tool_call>â€¦</tool_call>``
          * ``<tool_calls>â€¦</tool_calls>``
          * ``<tool_result>â€¦</tool_result>``
          * ``<function_call>â€¦</function_call>``
          * ``<function_calls>â€¦</function_calls>``
          * ``<function name="â€¦">â€¦</function>`` (Gemma style)
        Ported from openclaw/openclaw#67318. The ``<function>`` variant is
        boundary-gated (only strips when the tag sits at start-of-line or
        after punctuation and carries a ``name="..."`` attribute) so prose
        mentions like "Use <function> in JavaScript" are preserved.
        r€   z<think>.*?</think>©Úflagsz<thinking>.*?</thinking>z<reasoning>.*?</reasoning>z0<REASONING_SCRATCHPAD>.*?</REASONING_SCRATCHPAD>z<thought>.*?</thought>)rã   rà   Útool_resultÚfunction_callÚfunction_callsÚ<z\b[^>]*>.*?</Ú>zd(?:(?<=^)|(?<=[\n\r.!?:]))[ \t]*<function\b[^>]*\bname\s*=[^>]*>(?:(?:(?!</function>).)*)</function>zS(?:^|\n)[ \t]*<(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)\b[^>]*>.*$z@</?(?:think|thinking|reasoning|thought|REASONING_SCRATCHPAD)>\s*zP</(?:tool_call|tool_calls|tool_result|function_call|function_calls|function)>\s*)r;  rû   ÚDOTALLÚ
IGNORECASE)rX   r  Ú_tc_names      rZ   rý  zAIAgent._strip_think_blocksÛ
  sÊ  € ð> ð 	Ø�2õ ”&Ð.°°GÅ2Ä9ÍrÌ}ÑC\Ð]Ñ]Ô]ˆÝ”&Ð4°b¸'ÍÌÕUWÔUbÑIbÐcÑcÔcˆÝ”&Ð6¸¸GÍ2Ì9ÕWYÔWdÑKdÐeÑeÔeˆÝ”&ÐLÈbÐRYÕacÔajÕmoÔmzÑazÐ{Ñ{Ô{ˆÝ”&Ð2°B¸ÅrÄyÕSUÔS`ÑG`ÐaÑaÔaˆð=ð 	ð 	ˆHå”fØ7�XÐ7Ð7¨HÐ7Ð7Ð7ØØÝ”i¥"¤-Ñ/ð	ñ ô ˆGˆGõ ”&ð4ð ØÝ”)�bœmÑ+ð
ñ 
ô 
ˆõ ”&ØbØØÝ”)�bœmÑ+ð	
ñ 
ô 
ˆõ ”&ØOØØÝ”-ð	
ñ 
ô 
ˆõ ”&Ø_ØØÝ”-ð	
ñ 
ô 
ˆð ˆr\   c                 ó|   — | sdS |                       ¦   «         }|sdS |                     d¦  «        rdS |d         dv S )zCHeuristic: does visible assistant text look intentionally finished?Fz```Tr4  u$   .!?:)"']}ã€‚ï¼�ï¼Ÿï¼šï¼‰ã€‘ã€�ã€�ã€‹)r‰  r>  )r  Ústrippeds     rZ   Ú_has_natural_response_endingz$AIAgent._has_natural_response_ending9  sX   € ð ð 	Ø�5Ø—>’>Ñ#Ô#ˆØð 	Ø�5Ø×Ò˜UÑ#Ô#ð 	Ø�4Ø˜Œ|ÐFÐFÐFr\   c                 óþ   — | j         pd                     ¦   «         }| j        pd                     ¦   «         }d|vr|dk    rdS d| j        v s	d| j        v rdS t	          | j        ot          | j        ¦  «        ¦  «        S )zHDetect the narrow backend family affected by Ollama/GLM stop misreports.r€   ÚglmÚzaiFÚollamaz:11434T)r‚  rj  r|  ru  r­   rˆ   r2   )rX   ré  rê  s      rZ   Ú_is_ollama_glm_backendzAIAgent._is_ollama_glm_backendE  sŒ   € à”zÐ' R×.Ò.Ñ0Ô0ˆØœ-Ð-¨2×4Ò4Ñ6Ô6ˆØ˜Ð#Ð#¨¸%Ò(?Ð(?Ø�5Ø�tÔ+Ð+Ð+¨x¸4Ô;OÐ/OÐ/OØ�4Ý�D”MÐFÕ&7¸¼Ñ&FÔ&FÑGÔGÐGr\   Úfinish_reasonc                 óÞ  — |dk    s| j         dk    rdS |                      ¦   «         sdS t          d„ |pg D ¦   «         ¦  «        sdS |�t          |dd¦  «        rdS t          |dd¦  «        }t	          |t
          ¦  «        sdS |                      |¦  «                             ¦   «         }|sdS t          |¦  «        dk     st          j
        d	|¦  «        sdS |                      |¦  «         S )
zIDetect conservative stop->length misreports for Ollama-hosted GLM models.Ústopr·  Fc              3   ór   K  — | ]2}t          |t          ¦  «        o|                     d ¦  «        dk    V — Œ3dS ©r  r  Nr  ©rÉ   r  s     rZ   rÎ   z:AIAgent._should_treat_stop_as_truncated.<locals>.<genexpr>Z  sT   è è € ð 
ð 
àõ �s�DÑ!Ô!Ð? c§g¢g¨f¡o¤o¸Ò&?ð
ð 
ð 
ð 
ð 
ð 
r\   Nrà   r  r  z\s)r}  r  rÔ   ro   rb   rc   rý  r„   rd   r;  rÁ   r  )rX   r  Úassistant_messager
  r  Úvisible_texts         rZ   Ú_should_treat_stop_as_truncatedz'AIAgent._should_treat_stop_as_truncatedO  s&  € ð ˜FÒ"Ð" d¤mÐ7IÒ&IÐ&IØ�5Ø×*Ò*Ñ,Ô,ð 	Ø�5Ýð 
ð 
à ˜ Bð
ñ 
ô 
ñ 
ô 
ð 	ð �5ØÐ$­Ð0AÀ<ÐQUÑ(VÔ(VÐ$Ø�5åÐ+¨Y¸Ñ=Ô=ˆÝ˜'¥3Ñ'Ô'ð 	Ø�5à×/Ò/°Ñ8Ô8×>Ò>Ñ@Ô@ˆØð 	Ø�5Ýˆ|ÑÔ˜rÒ!Ð!­¬°5¸,Ñ)GÔ)GÐ!Ø�5à×4Ò4°\ÑBÔBÐBÐBr\   Úuser_messageÚassistant_contentc                 óF  ‡
‡— t          d„ |D ¦   «         ¦  «        rdS |                      |pd¦  «                             ¦   «                              ¦   «         Š
‰
sdS t	          ‰
¦  «        dk    rdS t          t          j        d‰
¦  «        ¦  «        }|sdS d}d}|pd                     ¦   «                              ¦   «         Št          ˆfd„|D ¦   «         ¦  «        pd	‰v pd
‰v }t          ˆ
fd„|D ¦   «         ¦  «        }t          ˆ
fd„|D ¦   «         ¦  «        }	|s|	o|S )zNDetect a planning/ack message that should continue instead of ending the turn.c              3   ór   K  — | ]2}t          |t          ¦  «        o|                     d ¦  «        dk    V — Œ3dS r  r  r  s     rZ   rÎ   z=AIAgent._looks_like_codex_intermediate_ack.<locals>.<genexpr>u  s@   è è € ÐWÐWÀs�z˜#�tÑ$Ô$ÐB¨¯ª°©¬¸FÒ)BÐWÐWÐWÐWÐWÐWr\   Fr€   i°  u@   \b(i['â€™]ll|i will|let me|i can do that|i can help with that)\b)z	look intozlook atÚinspectÚscanÚcheckÚanalyzÚreviewÚexploreÚreadÚopenÚrunÚtestÚfixrÙ   rÁ   ÚfindÚwalkthroughzreport backÚ	summarize)Ú	directoryzcurrent directoryzcurrent dirrì   ÚrepoÚ
repositoryÚcodebaseÚprojectÚfolderÚ
filesystemz	file treeÚfilesrè   c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   )rÉ   ÚmarkerÚ	user_texts     €rZ   rÎ   z=AIAgent._looks_like_codex_intermediate_ack.<locals>.<genexpr>«  s(   øè è € ÐDÐD¨�˜)Ð#ÐDÐDÐDÐDÐDÐDr\   z~/rÀ  c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   ©rÉ   r7  Úassistant_texts     €rZ   rÎ   z=AIAgent._looks_like_codex_intermediate_ack.<locals>.<genexpr>¯  s(   øè è € Ð'^Ð'^ÀV¨°.Ð(@Ð'^Ð'^Ð'^Ð'^Ð'^Ð'^r\   c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   r:  s     €rZ   rÎ   z=AIAgent._looks_like_codex_intermediate_ack.<locals>.<genexpr>°  s9   øè è € ð *
ð *
Ø)/ˆF�nÐ$ð*
ð *
ð *
ð *
ð *
ð *
r\   )rÔ   rý  r„   rj  rd   r­   r;  rÁ   )rX   r  r  r
  Úhas_future_ackÚaction_markersÚworkspace_markersÚuser_targets_workspaceÚassistant_mentions_actionÚassistant_targets_workspacer;  r8  s             @@rZ   Ú"_looks_like_codex_intermediate_ackz*AIAgent._looks_like_codex_intermediate_ackn  s‘  øø€ õ ÐWÐWÈhÐWÑWÔWÑWÔWð 	Ø�5à×1Ò1Ð2CÐ2IÀrÑJÔJ×PÒPÑRÔR×XÒXÑZÔZˆØð 	Ø�5Ýˆ~ÑÔ Ò%Ð%Ø�5åÝŒIÐYÐ[iÑjÔjñ
ô 
ˆð ð 	Ø�5ð
ˆð*
Ðð  "Ð' R×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8ˆ	åÐDÐDÐDÐDÐ2CÐDÑDÔDÑDÔDð  Ø�yÐ ð à�iÐð 	õ
 %(Ð'^Ð'^Ð'^Ð'^È~Ð'^Ñ'^Ô'^Ñ$^Ô$^Ð!Ý&)ð *
ð *
ð *
ð *
Ø3Dð*
ñ *
ô *
ñ '
ô '
Ð#ð 'ÐEÐ*EÐdÐKdÐdr\   c                 ó~  — g }t          |d¦  «        r!|j        r|                     |j        ¦  «         t          |d¦  «        r*|j        r#|j        |vr|                     |j        ¦  «         t          |d¦  «        r•|j        rŽ|j        D ]†}t          |t          ¦  «        ro|                     d¦  «        p>|                     d¦  «        p)|                     d¦  «        p|                     d¦  «        }|r||vr|                     |¦  «         Œ‡t          |dd¦  «        }|s€t          |t          ¦  «        rk|rid	}|D ]d}t          j        t          j        z  }t          j        |||¬
¦  «        D ]1}	|	                     ¦   «         }
|
r|
|vr|                     |
¦  «         Œ2Œe|rd                     |¦  «        S dS )ay  
        Extract reasoning/thinking content from an assistant message.
        
        OpenRouter and various providers can return reasoning in multiple formats:
        1. message.reasoning - Direct reasoning field (DeepSeek, Qwen, etc.)
        2. message.reasoning_content - Alternative field (Moonshot AI, Novita, etc.)
        3. message.reasoning_details - Array of {type, summary, ...} objects (OpenRouter unified)
        
        Args:
            assistant_message: The assistant message object from the API response
            
        Returns:
            Combined reasoning text, or None if no reasoning found
        Ú	reasoningÚreasoning_contentÚreasoning_detailsÚsummaryÚthinkingr  r÷   N)ú<think>(.*?)</think>z<thinking>(.*?)</thinking>z<thought>(.*?)</thought>z<reasoning>(.*?)</reasoning>z2<REASONING_SCRATCHPAD>(.*?)</REASONING_SCRATCHPAD>r  ú

)r�  rE  rÞ   rF  rG  rb   rÚ   rƒ   ro   rc   r;  r  r	  Úfindallr„   r  )rX   r  Úreasoning_partsr¯  rH  r  Úinline_patternsÚpatternr  Úblockrþ  s              rZ   Ú_extract_reasoningzAIAgent._extract_reasoning¶  s"  € ð ˆõ Ð$ kÑ2Ô2ð 	@Ð7HÔ7Rð 	@Ø×"Ò"Ð#4Ô#>Ñ?Ô?Ð?õ Ð$Ð&9Ñ:Ô:ð 	LÐ?PÔ?bð 	Là Ô2¸/ÐIÐIØ×&Ò&Ð'8Ô'JÑKÔKÐKõ Ð$Ð&9Ñ:Ô:ð 	8Ð?PÔ?bð 	8Ø+Ô=ð 
8ð 
8�Ý˜f¥dÑ+Ô+ð 	8ð Ÿ
š
 9Ñ-Ô-ð .Ø!Ÿ:š: jÑ1Ô1ð.à!Ÿ:š: iÑ0Ô0ð.ð "Ÿ:š: fÑ-Ô-ð	 ð ð 8 7°/Ð#AÐ#AØ'×.Ò.¨wÑ7Ô7Ð7øõ
 Ð+¨Y¸Ñ=Ô=ˆØð 	8¥:¨gµsÑ#;Ô#;ð 	8Àð 	8ðˆOð +ð 8ð 8�Ýœ	¥B¤MÑ1�ÝœZ¨°ÀÐFÑFÔFð 8ð 8�EØ#Ÿkšk™mœm�GØð 8 7°/Ð#AÐ#AØ'×.Ò.¨wÑ7Ô7Ð7øð8ð ð 	0Ø—;’;˜Ñ/Ô/Ð/àˆtr\   Útask_idc                 ó”  — 	 t          |¦  «        r | j        rt          j        d|› d�¦  «         nt	          |¦  «         n8# t
          $ r+}| j        rt          j        d|› d|› �¦  «         Y d}~nd}~ww xY w	 t          |¦  «         dS # t
          $ r2}| j        r t          j        d|› d|› �¦  «         Y d}~dS Y d}~dS d}~ww xY w)aH  Clean up VM and browser resources for a given task.

        Skips ``cleanup_vm`` when the active terminal environment is marked
        persistent (``persistent_filesystem=True``) so that long-lived sandbox
        containers survive between turns. The idle reaper in
        ``terminal_tool._cleanup_inactive_envs`` still tears them down once
        ``terminal.lifetime_seconds`` is exceeded. Non-persistent backends are
        torn down per-turn as before to prevent resource leakage (the original
        intent of this hook for the Morph backend, see commit fbd3a2fd).
        z0Skipping per-turn cleanup_vm for persistent env z; idle reaper will handle it.zFailed to cleanup VM for task ú: Nz#Failed to cleanup browser for task )r   rˆ  rØ   rÙ   r   r�   r7  r   )rX   rR  rA  s      rZ   Ú_cleanup_task_resourceszAIAgent._cleanup_task_resourcesù  sU  € ð	QÝ  Ñ)Ô)ð $ØÔ'ð Ý”Mð7È7ð 7ð 7ð 7ñô ð øõ
 ˜7Ñ#Ô#Ð#øøÝð 	Qð 	Qð 	QØÔ#ð QÝ”Ð OÀÐ OÐ OÈAÐ OÐ OÑPÔPÐPøøøøøøøøøð	Qøøøð	VÝ˜GÑ$Ô$Ð$Ð$Ð$øÝð 	Vð 	Vð 	VØÔ#ð VÝ”Ð TÀgÐ TÐ TÐQRÐ TÐ TÑUÔUÐUÐUÐUÐUÐUÐUÐUðVð Vð Vð Vð Vð Vøøøøð	Vøøøs/   ‚>A Á
A6Á!A1Á1A6Á:B Â
CÂ!CÃCuÊ  Review the conversation above and consider saving to memory if appropriate.

Focus on:
1. Has the user revealed things about themselves â€” their persona, desires, preferences, or personal details worth remembering?
2. Has the user expressed expectations about how you should behave, their work style, or ways they want you to operate?

If something stands out, save it using the memory tool. If nothing is worth saving, just say 'Nothing to save.' and stop.uÏ  Review the conversation above and consider whether a skill should be saved or updated.

Work in this order â€” do not skip steps:

1. SURVEY the existing skill landscape first. Call skills_list to see what you have. If anything looks potentially relevant, skill_view it before deciding. You are looking for the CLASS of task that just happened, not the exact task. Example: a successful Tauri build is in the class "desktop app build troubleshooting", not "fix my specific Tauri error today".

2. THINK CLASS-FIRST. What general pattern of task did the user just complete? What conditions will trigger this pattern again? Describe the class in one sentence before looking at what to save.

3. PREFER GENERALIZING AN EXISTING SKILL over creating a new one. If a skill already covers the class â€” even partially â€” update it (skill_manage patch) with the new insight. Broaden its "when to use" trigger if needed.

4. ONLY CREATE A NEW SKILL when no existing skill reasonably covers the class. When you create one, name and scope it at the class level ("react-i18n-setup", not "add-i18n-to-my-dashboard-app"). The trigger section must describe the class of situations, not this one session.

5. If you notice two existing skills that overlap, note it in your response so a future review can consolidate them. Do not consolidate now unless the overlap is obvious and low-risk.

Only act when something is genuinely worth saving. If nothing stands out, just say 'Nothing to save.' and stop.u‹  Review the conversation above and consider two things:

**Memory**: Has the user revealed things about themselves â€” their persona, desires, preferences, or personal details? Has the user expressed expectations about how you should behave, their work style, or ways they want you to operate? If so, save using the memory tool.

**Skills**: Was a non-trivial approach used to complete a task that required trial and error, changing course due to experiential findings, or a different method or outcome than the user expected? If so, work in this order:
  a. SURVEY existing skills first (skills_list, then skill_view on candidates).
  b. Identify the CLASS of task, not the specific task ("desktop app build troubleshooting", not "fix my Tauri error").
  c. PREFER UPDATING/GENERALIZING an existing skill that covers the class.
  d. ONLY CREATE A NEW SKILL if no existing one covers the class. Scope at the class level, not this one session.
  e. If you notice overlapping skills during the survey, note it so a future review can consolidate them.

Only act if there's something genuinely worth saving. If nothing stands out, just say 'Nothing to save.' and stop.Úreview_messagesÚprior_snapshotc                 ó>  — t          ¦   «         }t          ¦   «         }|pg D ]�}t          |t          ¦  «        r|                     d¦  «        dk    rŒ1|                     d¦  «        }|r|                     |¦  «         Œ^|                     d¦  «        }t          |t
          ¦  «        r|                     |¦  «         Œžg }| pg D �]V}t          |t          ¦  «        r|                     d¦  «        dk    rŒ2|                     d¦  «        }|r||v rŒN|s/|                     d¦  «        }	t          |	t
          ¦  «        r|	|v rŒ	 t          j        |                     dd¦  «        ¦  «        }
n# t          j        t          f$ r Y ŒÁw xY wt          |
t          ¦  «        r|
                     d¦  «        sŒð|
                     dd¦  «        }|
                     d	d¦  «        }d
| 
                    ¦   «         v r|                     |¦  «         �ŒId| 
                    ¦   «         v r|                     |¦  «         �Œvd| 
                    ¦   «         v s|rBd| 
                    ¦   «         v r,|dk    rdn	|dk    rdn|}|                     |› d�¦  «         �ŒÐd|v r,|dk    rdn	|dk    rdn|}|                     |› d�¦  «         �Œ d| 
                    ¦   «         v sd| 
                    ¦   «         v r*|dk    rdn	|dk    rdn|}|                     |› d�¦  «         �ŒX|S )aS  Build the human-facing action summary for a background review pass.

        Walks the review agent's session messages and collects "successful tool
        action" descriptions to surface to the user (e.g. "Memory updated").
        Tool messages already present in ``prior_snapshot`` are skipped so we
        don't re-surface stale results from the prior conversation that the
        review agent inherited via ``conversation_history`` (issue #14944).

        Matching is by ``tool_call_id`` when available, with a content-equality
        fallback for tool messages that lack one.
        r  r  Útool_call_idr  r(  Úsuccessr�  r€   rÏ  ÚcreatedÚupdatedÚaddedr   r2  ÚMemoryÚuserzUser profilez updatedzEntry addedÚremovedÚreplaced)rŸ  rb   rÚ   rƒ   r   rc   rÕ   rÖ   r9  r:  rj  rÞ   )rV  rW  Úexisting_tool_call_idsÚexisting_tool_contentsÚpriorÚtcidr  Úactionsr  Úcontent_strre   r�  rÏ  Úlabels                 rZ   Ú$_summarize_background_review_actionsz,AIAgent._summarize_background_review_actionsS  sk  € õ  "%¡¤ÐÝ!$¡¤ÐØ#Ð) rð 		8ð 		8ˆEÝ˜e¥TÑ*Ô*ð ¨e¯iªi¸Ñ.?Ô.?À6Ò.IÐ.IØØ—9’9˜^Ñ,Ô,ˆDØð 8Ø&×*Ò*¨4Ñ0Ô0Ð0Ð0àŸ)š) IÑ.Ô.�Ý˜g¥sÑ+Ô+ð 8Ø*×.Ò.¨wÑ7Ô7Ð7øàˆØ"Ð( bð 	3ñ 	3ˆCÝ˜c¥4Ñ(Ô(ð ¨C¯GªG°F©O¬O¸vÒ,EÐ,EØØ—7’7˜>Ñ*Ô*ˆDØð ˜Ð 6Ð6Ð6ØØð Ø!Ÿgšg iÑ0Ô0�Ý˜k­3Ñ/Ô/ð °KÐCYÐ4YÐ4YØðÝ”z #§'¢'¨)°TÑ":Ô":Ñ;Ô;��øÝÔ(­)Ð4ð ð ð Ø�ðøøøå˜d¥DÑ)Ô)ð °·²¸)Ñ1DÔ1Dð ØØ—h’h˜y¨"Ñ-Ô-ˆGØ—X’X˜h¨Ñ+Ô+ˆFØ˜GŸMšM™OœOÐ+Ð+Ø—’˜wÑ'Ô'Ð'Ñ'Ø˜gŸmšm™oœoÐ-Ð-Ø—’˜wÑ'Ô'Ð'Ñ'Ø˜GŸMšM™OœOÐ+Ð+°Ð+¸5ÀGÇMÂMÁOÄOÐ;SÐ;SØ$*¨hÒ$6Ð$6˜˜ÈfÐX^ÒN^ÐN^¸N¸NÐdj�Ø—’ %Ð1Ð1Ð1Ñ2Ô2Ð2Ñ2Ø 'Ð)Ð)Ø$*¨hÒ$6Ð$6˜˜ÈfÐX^ÒN^ÐN^¸N¸NÐdj�Ø—’ %Ð1Ð1Ð1Ñ2Ô2Ð2Ñ2Ø˜gŸmšm™oœoÐ-Ð-°¸w¿}º}¹¼Ð1NÐ1NØ$*¨hÒ$6Ð$6˜˜ÈfÐX^ÒN^ÐN^¸N¸NÐdj�Ø—’ %Ð1Ð1Ð1Ñ2Ô2Ð2ùØˆs   Å(E.Å.FÆFÚmessages_snapshotÚreview_memoryÚreview_skillsc                 óª   ‡ ‡‡— ddl }|r
|r‰ j        Šn|r‰ j        Šn‰ j        Šˆˆˆ fd„} |j        |dd¬¦  «        }|                     ¦   «          dS )a   Spawn a background thread to review the conversation for memory/skill saves.

        Creates a full AIAgent fork with the same model, tools, and context as the
        main session. The review prompt is appended as the next user turn in the
        forked conversation. Writes directly to the shared memory/skill stores.
        Never modifies the main conversation history or produces user-visible output.
        r   Nc                  óü  •— dd l } d }	 t          t          j        d¦  «        5 }|                      |¦  «        5  |                      |¦  «        5  ‰
                     ¦   «         }t          ‰
j        dd‰
j	        ‰
j
        |                     d¦  «        pd |                     d¦  «        pd |                     d¦  «        pd t          ‰
dd ¦  «        ‰
j        ¬	¦
  «
        }d
|_        d
|_        ‰
j        |_        ‰
j        |_        ‰
j        |_        d|_        d|_        |                     ‰	‰¬¦  «         d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   d d d ¦  «         n# 1 swxY w Y   ‰
                     t          |dg ¦  «        ‰¦  «        }|rnd                     t0                               |¦  «        ¦  «        }‰
                     d|› �¦  «         ‰
j        }|r 	  |d|› �¦  «         n# t8          $ r Y nw xY wnH# t8          $ r;}t:                               d|¦  «         ‰
                     d|¦  «         Y d }~nd }~ww xY w|�N	 |                      ¦   «          n# t8          $ r Y nw xY w	 | !                    ¦   «          d S # t8          $ r Y d S w xY wd S # |�L	 |                      ¦   «          n# t8          $ r Y nw xY w	 | !                    ¦   «          w # t8          $ r Y w w xY ww xY w)Nr   Úwr½   Tr}  rˆ   r{  rˆ  )
r‚  rƒ  r‰  rg  r|  r}  rˆ   r{  r$  r­  Úbackground_review)r  Úconversation_historyrá  u    Â· u     ðŸ’¾ u   ðŸ’¾ z)Background memory/skill review failed: %szbackground review)"Ú
contextlibr'  r�   ÚdevnullÚredirect_stdoutÚredirect_stderrr²  rp  r‚  rg  r|  rƒ   ro   r“  râ  rã  rî  rï  rð  rñ  r  Úrun_conversationri  r  rÚ   Úfromkeysr‘  r‡  r�   r6  r7  r°  Úshutdown_memory_providerÚclose)rr  Úreview_agentÚ_devnullÚ_parent_runtimerf  rH  Ú_bg_cbrA  rj  ÚpromptrX   s           €€€rZ   Ú_run_reviewz5AIAgent._spawn_background_review.<locals>._run_review©  sw  ø€ ØÐÐÐØˆLðOÝ�"œ* cÑ*Ô*ð #¨hØ×/Ò/°Ñ9Ô9ð#ð #à×/Ò/°Ñ9Ô9ð#ð #ð '+×&@Ò&@Ñ&BÔ&B�OÝ#*Ø"œjØ'(Ø#'Ø!%¤Ø!%¤Ø!0×!4Ò!4°ZÑ!@Ô!@Ð!HÀDØ!0×!4Ò!4°ZÑ!@Ô!@Ð!HÀDØ /× 3Ò 3°IÑ >Ô >Ð FÀ$Ý(/°Ð6HÈ$Ñ(OÔ(OØ*.¬/ð$ñ $ô $�Lð 9L�LÔ5Ø9L�LÔ6Ø15Ô1C�LÔ.Ø37Ô3G�LÔ0Ø9=Ô9S�LÔ6Ø:;�LÔ7Ø9:�LÔ6à ×1Ò1Ø%+Ø->ð 2ñ ô ð ðA#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð #ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ðV ×CÒCÝ˜LÐ*=¸rÑBÔBØ%ñô �ð
 ð !Ø$Ÿkšk­$¯-ª-¸Ñ*@Ô*@ÑAÔA�GØ×$Ò$Ð%8¨wÐ%8Ð%8Ñ9Ô9Ð9Ø!Ô<�FØð !ð!Ø"˜FÐ#4¨7Ð#4Ð#4Ñ5Ô5Ð5Ð5øÝ(ð !ð !ð !Ø ˜Dð!øøøøøõ ð Eð Eð EÝ—’ÐJÈAÑNÔNÐNØ×,Ò,Ð-@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøð  Ð+ðØ$×=Ò=Ñ?Ô?Ð?Ð?øÝ$ð ð ð Ø˜ðøøøðØ$×*Ò*Ñ,Ô,Ð,Ð,Ð,øÝ$ð ð ð Ø˜˜ðøøøð ,Ð+ø�<Ð+ðØ$×=Ò=Ñ?Ô?Ð?Ð?øÝ$ð ð ð Ø˜ðøøøðØ$×*Ò*Ñ,Ô,Ð,Ð,øÝ$ð ð ð Ø˜ðøøøð ,øøøs+  ‰H £E0¹EÁC'EÄ6EÅEÅEÅ	EÅ
EÅE0ÅE	ÅE0Å E	Å!E0Å$H Å0E4Å4H Å7E4Å8A8H Ç1H  Ç?H È 
HÈ
H ÈHÈH ÈJ+ È
IÈ1IÉJ+ ÉIÉJ+ ÉI1 É1
I>É=I>ÊJ Ê
J&Ê%J&Ê+K;Ê/KËK;Ë
KËK;ËKËK;ËK*Ë)K;Ë*
K7Ë4K;Ë6K7Ë7K;Tz	bg-review)rÏ  rÐ  rp   )rž   Ú_COMBINED_REVIEW_PROMPTÚ_MEMORY_REVIEW_PROMPTÚ_SKILL_REVIEW_PROMPTr“  r”  )rX   rj  rk  rl  rž   r  rD  r~  s   ``     @rZ   Ú_spawn_background_reviewz AIAgent._spawn_background_review’  sŸ   øøø€ ð 	ÐÐÐð ð 	/˜]ð 	/ØÔ1ˆFˆFØð 	/ØÔ/ˆFˆFàÔ.ˆFðR	ð R	ð R	ð R	ð R	ð R	ð R	ðh ˆIÔ K¸À;ÐOÑOÔOˆØ	�Š‰	Œ	ˆ	ˆ	ˆ	r\   )Úwrite_originÚexecution_contextrR  rY  r„  r…  rY  c                ó  — |pt          | dd¦  «        |pt          | dd¦  «        | j        pd| j        pd| j        pt          j                             dd¦  «        dd	œ}|r||d
<   |r||d<   d„ |                     ¦   «         D ¦   «         S )z?Build provenance metadata for external memory-provider mirrors.râ  r'  rã  r(  r€   r,  r-  r2  )r„  r…  r“  r­  rg  rä   rR  rY  c                 ó"   — i | ]\  }}|d v¯	||“ŒS )rt  rw   ró  s      rZ   rö  z8AIAgent._build_memory_write_metadata.<locals>.<dictcomp>  s(   € ÐIÐIÐI™˜˜A°Q¸jÐ5HÐ5H��1Ð5HÐ5HÐ5Hr\   )ro   r“  rè  rg  r�   r‚   rƒ   r  )rX   r„  r…  rR  rY  Úmetadatas         rZ   Ú_build_memory_write_metadataz$AIAgent._build_memory_write_metadata   s·   € ð )Ðc­G°DÐ:PÐRbÑ,cÔ,cà!ð HÝ˜4Ð!8¸,ÑGÔGàœ/Ð/¨RØ!%Ô!8Ð!>¸BØœÐW­¬¯ªÐ8OÐQVÑ)WÔ)WØ!ð
$
ð 
$
ˆð ð 	*Ø")ˆH�YÑØð 	4Ø'3ˆH�^Ñ$ØIÐI §¢Ñ!1Ô!1ÐIÑIÔIÐIr\   c                 ó  — t          | dd¦  «        }t          | dd¦  «        }|�|€dS d|cxk    rt          |¦  «        k     rAn dS ||         }t          |t          ¦  «        r"|                     d¦  «        dk    r||d<   dS dS dS dS )a�  Rewrite the current-turn user message before persistence/return.

        Some call paths need an API-only user-message variant without letting
        that synthetic text leak into persisted transcripts or resumed session
        history. When an override is configured for the active turn, mutate the
        in-memory messages list in place so both persistence and returned
        history stay clean.
        r¼  Nr½  r   r  r_  r  )ro   rd   rb   rÚ   rƒ   )rX   r
  r  Úoverrider  s        rZ   Ú$_apply_persist_user_message_overridez,AIAgent._apply_persist_user_message_override  s¶   € õ �dÐ7¸Ñ>Ô>ˆÝ˜4Ð!AÀ4ÑHÔHˆØÐ˜s˜{ØˆFØ�Ð#Ð#Ò#Ð#•c˜(‘m”mÒ#Ð#Ð#Ð#Ð#Ð#Ø˜3”-ˆCÝ˜#�tÑ$Ô$ð *¨¯ª°©¬¸FÒ)BÐ)BØ!)��I‘��ð $Ð#ð*ð *Ð)BÐ)Br\   rq  c                 ó”   — |                       |¦  «         || _        |                      |¦  «         |                      ||¦  «         dS )z™Save session state to both JSON log and SQLite on any exit path.

        Ensures conversations are never lost, even on errors or early returns.
        N)rŒ  rá  Ú_save_session_logÚ_flush_messages_to_session_db)rX   r
  rq  s      rZ   Ú_persist_sessionzAIAgent._persist_session,  sQ   € ð
 	×1Ò1°(Ñ;Ô;Ð;Ø!)ˆÔØ×Ò˜xÑ(Ô(Ð(Ø×*Ò*¨8Ð5IÑJÔJÐJÐJÐJr\   c                 ó²  — | j         sdS |                      |¦  «         	 | j                              | j        | j        pd| j        ¬¦  «         |rt          |¦  «        nd}t          || j        ¦  «        }||d…         D �]Ž}| 	                    dd¦  «        }| 	                    d¦  «        }d}t          |d¦  «        r3t          |j        t          ¦  «        r|j        rd	„ |j        D ¦   «         }n0t          | 	                    d¦  «        t          ¦  «        r|d         }| j                              | j        ||| 	                    d
¦  «        || 	                    d¦  «        | 	                    d¦  «        |dk    r| 	                    d¦  «        nd|dk    r| 	                    d¦  «        nd|dk    r| 	                    d¦  «        nd|dk    r| 	                    d¦  «        nd|dk    r| 	                    d¦  «        nd¬¦  «         �Œ�t          |¦  «        | _        dS # t          $ r&}	t                                d|	¦  «         Y d}	~	dS d}	~	ww xY w)u%  Persist any un-flushed messages to the SQLite session store.

        Uses _last_flushed_db_idx to track which messages have already been
        written, so repeated calls (from multiple exit paths) only write
        truly new messages â€” preventing the duplicate-write bug (#860).
        Nr-  )r.  r‚  r   r  ro  r  rà   c                 ó@   — g | ]}|j         j        |j         j        d œ‘ŒS )©rp   r×   )rÇ   rp   r×   rÈ   s     rZ   rË   z9AIAgent._flush_messages_to_session_db.<locals>.<listcomp>P  s:   € ð 'ð 'ð 'àð "$¤Ô!1ÀÄÔ@UÐVÐVð'ð 'ð 'r\   rä   rY  r  Ú	assistantrE  rF  rG  Úcodex_reasoning_itemsÚcodex_message_items)r“  r  r  rä   rà   rY  r  rE  rF  rG  r•  r–  z$Session DB append_message failed: %s)rç  rŒ  Úensure_sessionr“  rg  r‚  rd   r©   ré  rƒ   r�  rb   rà   r  Úappend_messager�   r6  r7  )
rX   r
  rq  Ú	start_idxÚ
flush_fromr  r  r  Útool_calls_datarA  s
             rZ   r�  z%AIAgent._flush_messages_to_session_db6  s®  € ð Ôð 	ØˆFØ×1Ò1°(Ñ;Ô;Ð;ð&	Fð Ô×+Ò+Ø”Ø”}Ð-¨Ø”jð ,ñ ô ð ð
 6JÐP�Ð0Ñ1Ô1Ð1ÈqˆIÝ˜Y¨Ô(AÑBÔBˆJØ 
  Ô,ð ñ �Ø—w’w˜v yÑ1Ô1�ØŸ'š' )Ñ,Ô,�Ø"&�Ý˜3 Ñ-Ô-ð 8µ*¸S¼^ÍTÑ2RÔ2Rð 8ÐWZÔWeð 8ð'ð 'à"%¤.ð'ñ 'ô '�O�Oõ   §¢¨Ñ 5Ô 5µtÑ<Ô<ð 8Ø&)¨,Ô&7�OØÔ ×/Ò/Ø#œØØ#Ø!Ÿgšg kÑ2Ô2Ø.Ø!$§¢¨Ñ!8Ô!8Ø"%§'¢'¨/Ñ":Ô":Ø6:¸kÒ6IÐ6I˜cŸgšg kÑ2Ô2Ð2ÈtØFJÈkÒFYÐFY c§g¢gÐ.AÑ&BÔ&BÐ&BÐ_cØFJÈkÒFYÐFY c§g¢gÐ.AÑ&BÔ&BÐ&BÐ_cØNRÐVaÒNaÐNa¨#¯'ª'Ð2IÑ*JÔ*JÐ*JÐgkØJNÐR]ÒJ]ÐJ]¨¯ªÐ0EÑ(FÔ(FÐ(FÐcgð 0ñ ô ð ñ õ ),¨H©¬ˆDÔ%Ð%Ð%øÝð 	Fð 	Fð 	FÝ�NŠNÐAÀ1ÑEÔEÐEÐEÐEÐEÐEÐEÐEøøøøð	Føøøs    HH& È&
IÈ0IÉIc                 óÜ   — |sg S d}t          t          |¦  «        dz
  dd¦  «        D ]%}||                              d¦  «        dk    r|} nŒ&|€|                     ¦   «         S |d|…         S )aÍ  
        Get messages up to (but not including) the last assistant turn.
        
        This is used when we need to "roll back" to the last successful point
        in the conversation, typically when the final assistant message is
        incomplete or malformed.
        
        Args:
            messages: Full message list
            
        Returns:
            Messages up to the last complete assistant turn (ending with user/tool message)
        Nr¢   r4  r  r”  )r=  rd   rƒ   Úcopy)rX   r
  Úlast_assistant_idxr!  s       rZ   Ú"_get_messages_up_to_last_assistantz*AIAgent._get_messages_up_to_last_assistanth  s”   € ð ð 	ØˆIð "ÐÝ•s˜8‘}”} qÑ(¨"¨bÑ1Ô1ð 	ð 	ˆAØ˜Œ{�Š˜vÑ&Ô&¨+Ò5Ð5Ø%&Ð"Ø�ð 6ð Ð%à—=’=‘?”?Ð"ð Ð+Ð+Ð+Ô,Ð,r\   c                 óü   — | j         sdS g }| j         D ]T}|d         }|d         |                     dd¦  «        |                     di ¦  «        ddœ}|                     |¦  «         ŒUt          j        |d	¬
¦  «        S )z´
        Format tool definitions for the system message in the trajectory format.
        
        Returns:
            str: JSON string representation of tool definitions
        z[]rÇ   rp   Údescriptionr€   Ú
parametersN)rp   r¡  r¢  ÚrequiredF©Úensure_ascii)rR  rƒ   rÞ   rÕ   r8  )rX   Úformatted_toolsr  ÚfuncÚformatted_tools        rZ   Ú _format_tools_for_system_messagez(AIAgent._format_tools_for_system_message‡  s›   € ð Œzð 	Ø�4ð ˆØ”Jð 	3ð 	3ˆDØ˜
Ô#ˆDà˜VœØ#Ÿxšx¨°rÑ:Ô:Ø"Ÿhšh |°RÑ8Ô8Ø ð	ð ˆNð ×"Ò" >Ñ2Ô2Ð2Ð2åŒz˜/¸Ð>Ñ>Ô>Ð>r\   Ú
user_queryÚ	completedc                 óô  — g }d|                       ¦   «         › d�}|                     d|dœ¦  «         |                     d|dœ¦  «         d}|t          |¦  «        k     �r||         }|d         dk    �r¿d	|v �r-|d	         �r$d
}|                     d¦  «        r&|d                              ¦   «         rd|d         › d�}|                     d¦  «        r5|d                              ¦   «         r|t          |d         ¦  «        dz   z  }|d	         D ]Û}	|	rt          |	t          ¦  «        sŒ	 t          |	d         d         t          ¦  «        r t          j
        |	d         d         ¦  «        n|	d         d         }
nB# t          j        $ r0 t          j        d|	d         d         dd…         › �¦  «         i }
Y nw xY w|	d         d         |
dœ}|dt          j        |d¬¦  «        › d�z  }ŒÜd|vrd|z   }|                     d|                     ¦   «         dœ¦  «         g }|dz   }|t          |¦  «        k     �r8||         d         dk    �r%||         }d}|d         }	 |                     ¦   «                              d ¦  «        rt          j
        |¦  «        }n# t          j        t"          f$ r Y nw xY wt          |¦  «        }|t          |d	         ¦  «        k     r|d	         |         d         d         nd!}|t          j        |                     d"d
¦  «        ||d#œd¬¦  «        z  }|d$z  }|                     |¦  «         |dz  }|t          |¦  «        k     r||         d         dk    �°%|r0|                     dd                     |¦  «        dœ¦  «         |dz
  }n·d
}|                     d¦  «        r&|d                              ¦   «         rd|d         › d�}|d         pd
}|t          |¦  «        z  }d|vrd|z   }|                     d|                     ¦   «         dœ¦  «         n*|d         d%k    r|                     d|d         dœ¦  «         |dz  }|t          |¦  «        k     �°|S )&ay  
        Convert internal message format to trajectory format for saving.
        
        Args:
            messages (List[Dict]): Internal message history
            user_query (str): Original user query
            completed (bool): Whether the conversation completed successfully
            
        Returns:
            List[Dict]: Messages in trajectory format
        a  You are a function calling AI model. You are provided with function signatures within <tools> </tools> XML tags. You may call one or more functions to assist with the user query. If available tools are not relevant in assisting with user query, just respond in natural conversational language. Don't make assumptions about what values to plug into functions. After calling & executing the functions, you will be provided with function results within <tool_response> </tool_response> XML tags. Here are the available tools:
<tools>
aÖ  
</tools>
For each function call return a JSON object, with the following pydantic model json schema for each:
{'title': 'FunctionCall', 'type': 'object', 'properties': {'name': {'title': 'Name', 'type': 'string'}, 'arguments': {'title': 'Arguments', 'type': 'object'}}, 'required': ['name', 'arguments']}
Each function call should be enclosed within <tool_call> </tool_call> XML tags.
Example:
<tool_call>
{'name': <function-name>,'arguments': <args-dict>}
</tool_call>ri  )Úfromr†   Úhumanr¢   r  r”  rà   r€   rE  z<think>
z

</think>
r  Ú
rÇ   r×   z2Unexpected invalid JSON in trajectory conversion: Nrz  rp   r“  z<tool_call>
Fr¤  z
</tool_call>
ú<think>z<think>
</think>
Úgptr  z<tool_response>
)r/  r1  ro  rY  )rY  rp   r  z
</tool_response>r_  )r©  rÞ   rd   rƒ   r„   rJ   rb   rÚ   rc   rÕ   rÖ   r9  rØ   r7  r8  r‰  rŠ  r™  r  )rX   r
  rª  r«  Ú
trajectoryÚ
system_msgr!  r  r  rã   r×   Útool_call_jsonÚtool_responsesÚjÚtool_msgÚtool_responseÚtool_contentÚ
tool_indexrä   Úraw_contents                       rZ   Ú_convert_to_trajectory_formatz%AIAgent._convert_to_trajectory_formatŸ  s!  € ð ˆ
ð
fð
 ×=Ò=Ñ?Ô?ð
fð 
fð 
fð 	ð 	×ÒØØð
ð 
ñ 	ô 	ð 	ð 	×ÒØØð
ð 
ñ 	ô 	ð 	ð ˆà•#�h‘-”-ÒÑØ˜1”+ˆCà�6Œ{˜kÒ)Ñ)à 3Ð&Ñ&¨3¨|Ô+<Ñ&ð !�Gð —w’w˜{Ñ+Ô+ð M°°KÔ0@×0FÒ0FÑ0HÔ0Hð MØ"L¨c°+Ô.>Ð"LÐ"LÐ"L˜à—w’w˜yÑ)Ô)ð V¨c°)¬n×.BÒ.BÑ.DÔ.Dð Vð  Õ#>¸sÀ9¼~Ñ#NÔ#NÐQUÑ#UÑU˜ð &)¨Ô%6ð tð t˜	Ø(ÐUµ
¸9ÅdÑ0KÔ0KÐUÈXð+ÝZdÐenÐoyÔezð  |Gô  fHõ  JMñ  [Nô  [Nð  )v­¬
°9¸ZÔ3HÈÔ3UÑ(VÔ(VÐ(Vð  T]ð  ^hô  Tið  juô  Tv˜I˜IøÝ#Ô3ð +ð +ð +õ $œOð  -LÐajÐkuÔavð  xCô  bDð  EIð  FIð  EIô  bJð  -Lð  -Lñ  Mô  Mð  MØ(*˜I˜I˜Ið	+øøøð %.¨jÔ$9¸&Ô$AØ)2ð*ð *˜ð  Ð#sµ4´:¸nÐ[`Ð3aÑ3aÔ3aÐ#sÐ#sÐ#sÑs˜˜ð !¨Ð/Ð/Ø"7¸'Ñ"A˜à×%Ò%Ø %Ø!(§¢Ñ!1Ô!1ð'ð 'ñ ô ð ð &(�NØ˜A™�AØ�c (™mœmÒ+Ñ+°¸´¸FÔ0CÀvÒ0MÑ0MØ#+¨A¤;˜à(;˜ð (0°	Ô':˜ð!Ø+×1Ò1Ñ3Ô3×>Ò>¸zÑJÔJð HÝ/3¬z¸,Ñ/GÔ/G øøÝ $Ô 4µnÐEð !ð !ð !Ø ˜Dð!øøøõ &)¨Ñ%8Ô%8˜
ð  *­C°°LÔ0AÑ,BÔ,BÒBÐBð   Ô-¨jÔ9¸*ÔEÀfÔMÐMà!*ð "ð
 &­¬Ø,4¯LªL¸ÈÑ,LÔ,LØ$-Ø'3ð5ð 5ð ).ð	*/ñ */ô */ñ /˜ð
 &Ð)=Ñ=˜Ø&×-Ò-¨mÑ<Ô<Ð<Ø˜Q™˜ð5 �c (™mœmÒ+Ð+°¸´¸FÔ0CÀvÒ0MÑ0Mð: &ð "Ø"×)Ò)Ø$*Ø%)§Y¢Y¨~Ñ%>Ô%>ð+ð +ñ ô ð ð  ™E˜øð
 !�Gð —w’w˜{Ñ+Ô+ð M°°KÔ0@×0FÒ0FÑ0HÔ0Hð MØ"L¨c°+Ô.>Ð"LÐ"LÐ"L˜ð #& i¤.Ð"6°B�KØÕ:¸;ÑGÔGÑG�Gð !¨Ð/Ð/Ø"7¸'Ñ"A˜à×%Ò%Ø %Ø!(§¢¡¤ð'ð 'ñ ô ð ð ð
 �V” Ò&Ð&Ø×!Ò!Ø#Ø  œ^ð#ð #ñ ô ð ð
 �‰FˆAði •#�h‘-”-ÒÑðl Ðs%   Ä.AE>Å><F=Æ<F=É#;J ÊJ8Ê7J8c                 ór   — | j         sdS |                      |||¦  «        }t          || j        |¦  «         dS )a  
        Save conversation trajectory to JSONL file.
        
        Args:
            messages (List[Dict]): Complete message history
            user_query (str): Original user query
            completed (bool): Whether the conversation completed successfully
        N)r‡  r¼  Ú_save_trajectory_to_filer‚  )rX   r
  rª  r«  r²  s        rZ   Ú_save_trajectoryzAIAgent._save_trajectoryD  sE   € ð Ô%ð 	ØˆFà×7Ò7¸À*ÈiÑXÔXˆ
Ý  ¨T¬Z¸ÑCÔCÐCÐCÐCr\   Úerrorc                 óè  — t          | ¦  «        }d|v sd|v rüt          j        d|t          j        ¦  «        }|r'|                     d¦  «                             ¦   «         nd}t          j        d|¦  «        }|r'|                     d¦  «                             ¦   «         nd}t          | dd¦  «        }g }|r|                     d	|› �¦  «         |                     |¦  «         |r|                     d
|› �¦  «         d                     |¦  «        S t          | dd¦  «        }t          |t          ¦  «        r‘t          |                     d¦  «        t          ¦  «        r)|                     di ¦  «                             d¦  «        n|                     d¦  «        }	|	r)t          | dd¦  «        }|rd	|› d�nd}
|
› |	dd…         › �S t          | dd¦  «        }|rd	|› d�nd}
|
› |dd…         › �S )zÿExtract a human-readable one-liner from an API error.

        Handles Cloudflare HTML error pages (502, 503, etc.) by pulling the
        <title> tag instead of dumping raw HTML.  Falls back to a truncated
        str(error) for everything else.
        z	<!DOCTYPEú<htmlz<title[^>]*>([^<]+)</title>r¢   z!HTML error page (title not found)z2Cloudflare Ray ID:\s*<strong[^>]*>([^<]+)</strong>NÚstatus_codezHTTP zRay u    â€” ÚbodyrÀ  r�  rT  r€   é,  éô  )rc   r;  rÁ   r	  rÂ  r„   ro   rÞ   r  rb   rÚ   rƒ   )rÀ  r  ró  ÚtitleÚrayÚray_idrÃ  rò   rÄ  r  Úprefixs              rZ   r­  zAIAgent._summarize_api_errorS  s   € õ �%‰jŒjˆð ˜#ÐÐ ¨C  Ý”	Ð8¸#½r¼}ÑMÔMˆAØ*+ÐT�A—G’G˜A‘J”J×$Ò$Ñ&Ô&Ð&Ð1TˆEå”)ÐQÐSVÑWÔWˆCØ-0Ð:�S—Y’Y˜q‘\”\×'Ò'Ñ)Ô)Ð)°dˆFÝ! %¨¸Ñ=Ô=ˆKØˆEØð 4Ø—’Ð2 [Ð2Ð2Ñ3Ô3Ð3Ø�LŠL˜ÑÔÐØð .Ø—’˜_ F˜_˜_Ñ-Ô-Ð-Ø—<’< Ñ&Ô&Ð&õ �u˜f dÑ+Ô+ˆÝ�d�DÑ!Ô!ð 	.Ý:DÀTÇXÂXÈgÑEVÔEVÕX\Ñ:]Ô:]Ðv�$—(’(˜7 BÑ'Ô'×+Ò+¨IÑ6Ô6Ð6Ðcg×ckÒckÐluÑcvÔcvˆCØð .Ý% e¨]¸DÑAÔA�Ø4?ÐGÐ0 Ð0Ð0Ð0Ð0ÀR�Ø Ð- # d s d¤)Ð-Ð-Ð-õ ˜e ]°DÑ9Ô9ˆØ,7Ð?Ð(˜Ð(Ð(Ð(Ð(¸RˆØÐ%˜#˜d˜s˜dœ)Ð%Ð%Ð%r\   r…   c                 ób   — |sd S t          |¦  «        dk    rdS |d d…         › d|dd …         › �S )Nrå  z***r½   ræ  rç  ©rd   )rX   r…   s     rZ   Ú_mask_api_key_for_logszAIAgent._mask_api_key_for_logs{  sG   € Øð 	Ø�4Ýˆs‰8Œ8�rŠ>ˆ>Ø�5Ø�b�q�b”'Ð(Ð(˜c " # #œhÐ(Ð(Ð(r\   Ú	error_msgc                 óö   — |sdS |                      ¦   «                              d¦  «        sd|v rdS d                     |                     ¦   «         ¦  «        }t	          |¦  «        dk    r|dd…         dz   }|S )	a  
        Clean up error messages for user display, removing HTML content and truncating.
        
        Args:
            error_msg: Raw error message from API or exception
            
        Returns:
            Clean, user-friendly error message
        zUnknown errorz<!DOCTYPE htmlrÂ  z:Service temporarily unavailable (HTML error page returned)r´  é–   Nræ  )r„   rŠ  r  Úsplitrd   )rX   rÎ  rþ  s      rZ   Ú_clean_error_messagezAIAgent._clean_error_message‚  sŒ   € ð ð 	#Ø"�?ð �?Š?ÑÔ×'Ò'Ð(8Ñ9Ô9ð 	P¸WÈ	Ð=QÐ=QØOÐOð —(’(˜9Ÿ?š?Ñ,Ô,Ñ-Ô-ˆõ ˆw‰<Œ<˜#ÒÐØ˜d˜s˜d”m eÑ+ˆGàˆr\   c                 ó´  — i }t          | dd¦  «        }d}t          |t          ¦  «        r?t          |                     d¦  «        t          ¦  «        r|                     d¦  «        n|}t          |t          ¦  «        �rU|                     d¦  «        p|                     d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   |                     d¦  «        p|                     d¦  «        }t          |t          ¦  «        r+|                     ¦   «         r|                     ¦   «         |d<   dD ]"}|                     |¦  «        }|d	vr||d
<    nŒ#|                     d¦  «        }|d	vrCd
|vr?	 t          j        ¦   «         t          |¦  «        z   |d
<   n# t          t          f$ r Y nw xY wt          | dd¦  «        }	t          |	dd¦  «        }
|
r�|
                     d¦  «        p|
                     d¦  «        }|rCd
|vr?	 t          j        ¦   «         t          |¦  «        z   |d
<   n# t          t          f$ r Y nw xY w|
                     d¦  «        }|r	d
|vr||d
<   d|vr0t	          | ¦  «                             ¦   «         }|r|dd…         |d<   d
|v�r|                     d¦  «        pd}t          |t          ¦  «        rët          j        d|t          j        ¦  «        }|rnt          |                     d¦  «        ¦  «        }|                     d¦  «                             ¦   «         dk    r|dz  n|}t          j        ¦   «         |z   |d
<   n[t          j        d|t          j        ¦  «        }|r9t          j        ¦   «         t          |                     d¦  «        ¦  «        z   |d
<   |S )z;Extract structured rate-limit details from provider errors.rÄ  NrÀ  Úcoder  r�  Úerror_description)Ú	resets_atÚreset_atrt  r×  Úretry_afterÚresponser=  úretry-afterúRetry-Afterzx-ratelimit-resetrÆ  r€   z/quotaResetDelay[:\s\"]+(\\d+(?:\\.\\d+)?)(ms|s)r¢   r  Úmsg     @�@z?retry\s+(?:after\s+)?(\d+(?:\.\d+)?)\s*(?:sec|secs|seconds|s\b))ro   rb   rÚ   rƒ   rc   r„   r­  r  r:  ra   r;  rÁ   r	  rÂ  rj  )rÀ  r[  rÄ  rþ   r  r�  r…   r†   rØ  rÙ  r=  Úratelimit_resetÚraw_messageÚdelay_matchÚsecondsÚ	sec_matchs                   rZ   Ú_extract_api_error_contextz"AIAgent._extract_api_error_contextœ  sù  € ð #%ˆå�u˜f dÑ+Ô+ˆØˆÝ�d�DÑ!Ô!ð 	YÝ+5°d·h²h¸wÑ6GÔ6GÍÑ+NÔ+NÐX�d—h’h˜wÑ'Ô'Ð'ÐTXˆGÝ�g�tÑ$Ô$ñ 	Ø—[’[ Ñ(Ô(Ð@¨G¯KªK¸Ñ,@Ô,@ˆFÝ˜&¥#Ñ&Ô&ð 3¨6¯<ª<©>¬>ð 3Ø$*§L¢L¡N¤N�˜Ñ!Ø—k’k )Ñ,Ô,ÐP°·²Ð<OÑ0PÔ0PˆGÝ˜'¥3Ñ'Ô'ð 5¨G¯MªM©O¬Oð 5Ø%,§]¢]¡_¤_�˜	Ñ"Ø0ð ð �ØŸš CÑ(Ô(�Ø 
Ð*Ð*Ø*/�G˜JÑ'Ø�Eð +ð "Ÿ+š+ mÑ4Ô4ˆKØ *Ð,Ð,°À7Ð1JÐ1JðÝ*.¬)©+¬+½¸kÑ8JÔ8JÑ*J�G˜JÑ'Ð'øÝ!¥:Ð.ð ð ð Ø�Dðøøøõ ˜5 *¨dÑ3Ô3ˆÝ˜( I¨tÑ4Ô4ˆØð 		6Ø!Ÿ+š+ mÑ4Ô4ÐR¸¿ºÀMÑ8RÔ8RˆKØð ˜z°Ð8Ð8ðÝ*.¬)©+¬+½¸kÑ8JÔ8JÑ*J�G˜JÑ'Ð'øÝ!¥:Ð.ð ð ð Ø�Dðøøøà%ŸkškÐ*=Ñ>Ô>ˆOØð 6 :°WÐ#<Ð#<Ø&5�˜
Ñ#à˜GÐ#Ð#Ý˜e™*œ*×*Ò*Ñ,Ô,ˆKØð 7Ø%0°°#°Ô%6�˜	Ñ"à˜WÐ$Ñ$Ø—k’k )Ñ,Ô,Ð2°ˆGÝ˜'¥3Ñ'Ô'ð VÝ œiÐ(ZÐ\cÕegÔerÑsÔs�Øð VÝ! +×"3Ò"3°AÑ"6Ô"6Ñ7Ô7�EØ0;×0AÒ0AÀ!Ñ0DÔ0D×0JÒ0JÑ0LÔ0LÐPTÒ0TÐ0T˜e f™n˜nÐZ_�GÝ*.¬)©+¬+¸Ñ*?�G˜JÑ'Ð'å "¤	ØZØÝœñ!ô !�Ið
 !ð VÝ.2¬i©k¬k½EÀ)Ç/Â/ÐRSÑBTÔBTÑ<UÔ<UÑ.U˜ 
Ñ+àˆs$   Æ&F> Æ>GÇGÈ*&I ÉI%É$I%rÙ  c                 óæ   — |€dS t          |dd¦  «        }|sdS ddlm} t          || j        | j        ¬¦  «        } ||¦  «        }|                     dd¦  «         |j        |d<   |j        |d<   |S )	zLToken buckets for ``post_api_request`` plugins (no raw ``response`` object).NÚusager   )Úasdict©r|  r}  Ú	raw_usageÚprompt_tokensÚtotal_tokens)	ro   Údataclassesrå  r@   r|  r}  Úpoprè  ré  )rX   rÙ  rç  rå  ÚcurH  s         rZ   Ú#_usage_summary_for_api_request_hookz+AIAgent._usage_summary_for_api_request_hookÝ  s”   € àÐØ�4Ý˜H g¨tÑ4Ô4ˆ	Øð 	Ø�4Ø&Ð&Ð&Ð&Ð&Ð&å˜Y°´ÈÌÐWÑWÔWˆØ�&˜‘*”*ˆØ�Š�K Ñ&Ô&Ð&Ø#%Ô#3ˆ�Ñ Ø"$¤/ˆ�ÑØˆr\   )rÀ  Ú
api_kwargsr  c          	      óž  — 	 t          j        |¦  «        }|                     dd¦  «         d„ |                     ¦   «         D ¦   «         }d}	 t	          | j        dd¦  «        }n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt          j
        ¦   «                              ¦   «         | j        |d| j                             d¦  «        › | j        dk    rd	nd
› �d|                      |¦  «        › �ddœ|dœdœ}|�Ãt#          |¦  «        j        t'          |¦  «        dœ}dD ]}	t	          ||	d¦  «        }
|
�|
||	<   Œt	          |dd¦  «        }|�||d<   t	          |dd¦  «        }|�R	 t	          |dd¦  «        |d<   |j        |d<   n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w||d<   t          j
        ¦   «                              d¦  «        }| j        d| j        › d|› d�z  }|                     t1          j        |ddt&          ¬¦  «        d ¬!¦  «         |                      | j        › d"|› �¦  «         t9          d#¦  «        r*t;          t1          j        |ddt&          ¬¦  «        ¦  «         |S # t          $ r)}| j        rt?          j         d$|› �¦  «         Y d}~dS d}~ww xY w)%a  
        Dump a debug-friendly HTTP request record for the active inference API.

        Captures the request body from api_kwargs (excluding transport-only keys
        like timeout). Intended for debugging provider-side 4xx failures where
        retries are not useful.
        rä  Nc                 ó   — i | ]
\  }}|®||“ŒS rg   rw   ró  s      rZ   rö  z3AIAgent._dump_api_request_debug.<locals>.<dictcomp>þ  s   € ÐCÐCÐC™T˜Q °Q°]�A�q°]°]°]r\   r{  z,Could not extract API key for debug dump: %sÚPOSTrÀ  rµ  z
/responsesz/chat/completionszBearer zapplication/json)ÚAuthorizationzContent-Type)ÚmethodrÄ  r=  rÄ  )Ú	timestampr“  r  r‹   )rÛ   r�  )rÃ  Ú
request_idrÔ  ÚparamrÛ   rÄ  rÙ  rÃ  Úresponse_statusÚresponse_textz,Could not extract error response details: %srÀ  z%Y%m%d_%H%M%S_%fÚrequest_dump_rE  r&  Fr  )r¥  ÚindentÚdefaultúutf-8©Úencodingu$   ðŸ§¾ Request debug dump written to: ÚHERMES_DUMP_REQUEST_STDOUTz*Failed to dump API request debug payload: )!r�  Údeepcopyrë  r  ro   rÆ  r�   r6  rÙ   r   rØ  Ú	isoformatr“  rˆ   r‰  r}  rÍ  rÛ   rr   rc   r÷   rÚ  rÞ  Ú
write_textrÕ   r8  r—  rŒ  rP   rÈ  rˆ  rØ   r7  )rX   rî  r  rÀ  rÄ  r{  rA  Údump_payloadÚ
error_infoÚ	attr_nameÚ
attr_valueÚ	body_attrÚresponse_objrô  Ú	dump_fileÚ
dump_errors                   rZ   Ú_dump_api_request_debugzAIAgent._dump_api_request_debugí  s†  € ðB	Ý”= Ñ,Ô,ˆDØ�HŠH�Y Ñ%Ô%Ð%ØCÐC T§Z¢Z¡\¤\ÐCÑCÔCˆDàˆGðPÝ! $¤+¨y¸$Ñ?Ô?��øÝð Pð Pð PÝ—’ÐKÈQÑOÔOÐOÐOÐOÐOÐOÐOøøøøðPøøøõ &œ\™^œ^×5Ò5Ñ7Ô7Ø"œoØ à$Ø"œm×2Ò2°3Ñ7Ô7ð  GÈÌÐZkÒIkÐIk¸¸ð  rEð  Gð  Gà)Y°4×3NÒ3NÈwÑ3WÔ3WÐ)YÐ)YØ(:ð ð  ð !ðð ð	,ð ,ˆLð Ð å  ™KœKÔ0Ý" 5™zœzð.ð .�
ð "Xð ;ð ;�IÝ!(¨°	¸4Ñ!@Ô!@�JØ!Ð-Ø0:˜
 9Ñ-øå# E¨6°4Ñ8Ô8�	ØÐ(Ø)2�J˜vÑ&å& u¨j¸$Ñ?Ô?�ØÐ+ðXÝ8?ÀÈmÐ]aÑ8bÔ8b˜
Ð#4Ñ5Ø6BÔ6G˜
 ?Ñ3Ð3øÝ$ð Xð Xð XÝŸšÐ%SÐUVÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøð )3�˜WÑ%å œ™œ×/Ò/Ð0BÑCÔCˆIØœÐ(Z¸¼Ð(ZÐ(ZÈ)Ð(ZÐ(ZÐ(ZÑZˆIØ× Ò Ý”
˜<°eÀAÍsÐSÑSÔSØ ð !ñ ô ð ð
 �LŠL˜DœOÐ\Ð\ÐQZÐ\Ð\Ñ]Ô]Ð]åÐ;Ñ<Ô<ð [Ý•d”j ¸EÈ!ÕUXÐYÑYÔYÑZÔZÐZàÐøÝð 	ð 	ð 	ØÔ#ð [Ý”Ð YÈZÐ YÐ YÑZÔZÐZØ�4�4�4�4�4øøøøð	øøøsn   ‚A
J ÁA$ Á#J Á$
BÁ.BÂ	J ÂBÂC'J Å;F ÆJ Æ
G	Æ$GÆ?J ÇG	Ç	CJ Ê
KÊ#KËKc                 ó¨   — | s| S t          | ¦  «        } t          j        dd| ¦  «        } t          j        dd| ¦  «        } |                      ¦   «         S )zCConvert REASONING_SCRATCHPAD to think tags and clean up whitespace.z\n+(<think>)z\n\1z(</think>)\n+z\1\n)rJ   r;  rû   r„   )r  s    rZ   Ú_clean_session_contentzAIAgent._clean_session_content?  sS   € ð ð 	ØˆNÝ-¨gÑ6Ô6ˆÝ”&˜¨'°7Ñ;Ô;ˆÝ”&Ð)¨7°GÑ<Ô<ˆØ�}Š}‰ŒÐr\   c                 ó<  — |p| j         }|sdS 	 g }|D ]r}|                     d¦  «        dk    rB|                     d¦  «        r-t          |¦  «        }|                      |d         ¦  «        |d<   |                     |¦  «         Œs| j                             ¦   «         r®	 t          j        | j         	                    d¬¦  «        ¦  «        }|                     dt          |                     dg ¦  «        ¦  «        ¦  «        }|t          |¦  «        k    r%t          j        d	|t          |¦  «        ¦  «         dS n# t          $ r Y nw xY w| j        | j        | j        | j        | j                             ¦   «         t)          j        ¦   «                              ¦   «         | j        pd
| j        pg t          |¦  «        |dœ
}t1          | j        |dt2          ¬¦  «         dS # t          $ r/}| j        rt          j        d|› �¦  «         Y d}~dS Y d}~dS d}~ww xY w)aù  
        Save the full raw session to a JSON file.

        Stores every message exactly as the agent sees it: user messages,
        assistant messages (with reasoning, finish_reason, tool_calls),
        tool responses (with tool_call_id, tool_name), and injected system
        messages (compression summaries, todo snapshots, etc.).

        REASONING_SCRATCHPAD tags are converted to <think> blocks for consistency.
        Overwritten after each turn so it always reflects the latest state.
        Nr  r”  r  rü  rý  Úmessage_countr
  zHSkipping session log overwrite: existing has %d messages, current has %dr€   )
r“  r‚  rˆ   rg  rÙ  Úlast_updatedÚsystem_promptrR  r  r
  r  )rú  rû  zFailed to save session log: )rá  rƒ   rÚ   r  rÞ   rà  ÚexistsrÕ   rÖ   Ú	read_textrd   rØ   rÙ   r�   r“  r‚  rˆ   rg  rÙ  r  r   rØ  rä  rR  rM   rc   rˆ  r7  )rX   r
  rþ  r  rÒ   Úexisting_countr‚  rA  s           rZ   rŽ  zAIAgent._save_session_logI  sƒ  € ð Ð5˜tÔ5ˆØð 	ØˆFð0	DàˆGØð $ð $�Ø—7’7˜6‘?”? kÒ1Ð1°c·g²g¸iÑ6HÔ6HÐ1Ý˜s™)œ)�CØ%)×%@Ò%@ÀÀYÄÑ%PÔ%P�C˜	‘NØ—’˜sÑ#Ô#Ð#Ð#ð Ô$×+Ò+Ñ-Ô-ð ð
Ý#œz¨$Ô*?×*IÒ*IÐSZÐ*IÑ*[Ô*[Ñ\Ô\�HØ%-§\¢\°/Å3ÀxÇ|Â|ÐT^Ð`bÑGcÔGcÑCdÔCdÑ%eÔ%e�NØ%­¨G©¬Ò4Ð4ÝœØfØ*­C°©L¬Lñô ð ð ˜ð 5øõ !ð ð ð Ø�Dðøøøð #œoØœØ œMØ œMØ!%Ô!3×!=Ò!=Ñ!?Ô!?Ý (¤¡¤× 8Ò 8Ñ :Ô :Ø!%Ô!;Ð!A¸rØœÐ) rÝ!$ W¡¤Ø#ðð ˆEõ ØÔ%ØØÝð	ñ ô ð ð ð øõ ð 	Dð 	Dð 	DØÔ#ð DÝ”Ð B¸qÐ BÐ BÑCÔCÐCÐCÐCÐCÐCÐCÐCðDð Dð Dð Dð Dð Døøøøð	Døøøs>   �BG" Â BD= Ä<G" Ä=
E
ÅG" Å	E
Å
BG" Ç"
HÇ,HÈHc                 óî  — d| _         || _        | j        �t          d| j        ¦  «         d| _        nd| _        t          | dd¦  «        }t          | dd¦  «        }|�Q|�O|5  t          |¦  «        }ddd¦  «         n# 1 swxY w Y   |D ]#}	 t          d|¦  «         Œ# t          $ r Y Œ w xY w| j        5  t          | j	        ¦  «        }ddd¦  «         n# 1 swxY w Y   |D ]J}	 | 
                    |¦  «         Œ# t          $ r%}t                               d|¦  «         Y d}~ŒCd}~ww xY w| j        s?t          d|r!t          |¦  «        dk    rd	|dd…         › d
�n	|rd	|› d�ndz   ¦  «         dS dS )a’  
        Request the agent to interrupt its current tool-calling loop.
        
        Call this from another thread (e.g., input handler, message receiver)
        to gracefully stop the agent and process a new message.
        
        Also signals long-running tool executions (e.g. terminal commands)
        to terminate early, so the agent can respond immediately.
        
        Args:
            message: Optional new message that triggered the interrupt.
                     If provided, the agent will include this in its response context.
        
        Example (CLI):
            # In a separate input thread:
            if user_typed_something:
                agent.interrupt(user_input)
        
        Example (Messaging):
            # When new message arrives for active session:
            if session_has_running_agent:
                running_agent.interrupt(new_message.text)
        TNFr   r¡  z0Failed to propagate interrupt to child agent: %su   
âš¡ Interrupt requestedé(   z: 'z...'ú'r€   )r—  r˜  r™  Ú_set_interruptrš  ro   r  r�   r¤  r£  Ú	interruptr6  rÙ   r‰  rÈ  rd   )	rX   r�  Ú_trackerÚ_tracker_lockÚ_worker_tidsÚ_wtidÚchildren_copyÚchildrA  s	            rZ   r  zAIAgent.interrupt‹  s»  € ð0 %)ˆÔ!Ø")ˆÔð Ô$Ð0Ý˜4 Ô!:Ñ;Ô;Ð;Ø49ˆDÔ1Ð1ð 59ˆDÔ1õ ˜4Ð!7¸Ñ>Ô>ˆÝ Ð&AÀ4ÑHÔHˆØÐ MÐ$=Øð .ð .Ý# H™~œ~�ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .à%ð ð �ðÝ" 4¨Ñ/Ô/Ð/Ð/øÝ ð ð ð Ø�Dðøøøð Ô'ð 	8ð 	8Ý  Ô!6Ñ7Ô7ˆMð	8ð 	8ð 	8ñ 	8ô 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8øøøð 	8ð 	8ð 	8ð 	8à"ð 	Tð 	TˆEðTØ—’ Ñ(Ô(Ð(Ð(øÝð Tð Tð TÝ—’ÐOÐQRÑSÔSÐSÐSÐSÐSÐSÐSøøøøðTøøøàŒð 	VÝÐ-ÈWð  2TÕY\Ð]dÑYeÔYeÐhjÒYjÐYjÐ1I°w¸sÀ¸s´|Ð1IÐ1IÐ1IÐ1Ið  ELð  qTð  qAÐv}ð  qAð  qAð  qAð  qAð  RTñ  Uñ  Vô  Vð  Vð  Vð  Vð	Vð 	VsN   Á"A>Á>BÂBÂBÂ
B,Â+B,Â6CÃCÃCÃ'C=Ã=
D,ÄD'Ä'D,c                 óÀ  — d| _         d| _        d| _        | j        �t	          d| j        ¦  «         t          | dd¦  «        }t          | dd¦  «        }|�Q|�O|5  t          |¦  «        }ddd¦  «         n# 1 swxY w Y   |D ]#}	 t	          d|¦  «         Œ# t          $ r Y Œ w xY wt          | dd¦  «        }|�$|5  d| _        ddd¦  «         dS # 1 swxY w Y   dS dS )zMClear any pending interrupt request and the per-thread tool interrupt signal.FNr   r¡  rž  )	r—  r˜  rš  r™  r  ro   r  r�   r�  )rX   r  r  r  r  Ú_steer_locks         rZ   Úclear_interruptzAIAgent.clear_interruptÏ  s¨  € à$)ˆÔ!Ø"&ˆÔØ05ˆÔ-ØÔ$Ð0Ý˜5 $Ô";Ñ<Ô<Ð<õ ˜4Ð!7¸Ñ>Ô>ˆÝ Ð&AÀ4ÑHÔHˆØÐ MÐ$=Øð .ð .Ý# H™~œ~�ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .à%ð ð �ðÝ" 5¨%Ñ0Ô0Ð0Ð0øÝ ð ð ð Ø�Dðøøøõ ˜dÐ$9¸4Ñ@Ô@ˆØÐ"Øð +ð +Ø&*�Ô#ð+ð +ð +ñ +ô +ð +ð +ð +ð +ð +ð +ð +øøøð +ð +ð +ð +ð +ð +ð #Ð"s6   ÁA6Á6A:Á=A:ÂBÂ
B$Â#B$Â<CÃCÃCr÷   c                 óB  — |r|                      ¦   «         sdS |                      ¦   «         }t          | dd¦  «        }|€$t          | dd¦  «        }|r|dz   |z   n|| _        dS |5  | j        r| j        dz   |z   | _        n|| _        ddd¦  «         n# 1 swxY w Y   dS )a±  
        Inject a user message into the next tool result without interrupting.

        Unlike interrupt(), this does NOT stop the current tool call. The
        text is stashed and the agent loop appends it to the LAST tool
        result's content once the current tool batch finishes. The model
        sees the steer as part of the tool output on its next iteration.

        Thread-safe: callable from gateway/CLI/TUI threads. Multiple calls
        before the drain point concatenate with newlines.

        Args:
            text: The user text to inject. Empty strings are ignored.

        Returns:
            True if the steer was accepted, False if the text was empty.
        Frž  Nr�  r¯  T)r„   ro   r�  )rX   r÷   rþ  r    rÒ   s        rZ   ÚsteerzAIAgent.steerð  s  € ð$ ð 	˜4Ÿ:š:™<œ<ð 	Ø�5Ø—*’*‘,”,ˆÝ˜Ð3°TÑ:Ô:ˆØˆ=õ ˜tÐ%5°tÑ<Ô<ˆHØAIÐ"V 8¨d¡?°WÑ#<Ð#<ÈwˆDÔØ�4Øð 	.ð 	.ØÔ"ð .Ø&*Ô&9¸DÑ&@À7Ñ&J�Ô#Ð#à&-�Ô#ð		.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ð
 ˆts   Á&"BÂBÂBc                 ó°   — t          | dd¦  «        }|€t          | dd¦  «        }d| _        |S |5  | j        }d| _        ddd¦  «         n# 1 swxY w Y   |S )zÆReturn the pending steer text (if any) and clear the slot.

        Safe to call from the agent execution thread after appending tool
        results. Returns None when no steer is pending.
        rž  Nr�  )ro   r�  )rX   r    r÷   s      rZ   Ú_drain_pending_steerzAIAgent._drain_pending_steer  s¬   € õ ˜Ð3°TÑ:Ô:ˆØˆ=Ý˜4Ð!1°4Ñ8Ô8ˆDØ"&ˆDÔØˆKØð 	'ð 	'ØÔ&ˆDØ"&ˆDÔð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð ˆs   °AÁAÁAÚnum_tool_msgsc                 ó"  — |dk    s|sdS |                       ¦   «         }|sdS d}t          t          |¦  «        dz
  t          t          |¦  «        |z
  dz
  d¦  «        d¦  «        D ]<}||         }t	          |t
          ¦  «        r|                     d¦  «        dk    r|} nŒ=|€st          | dd¦  «        }|�<|5  | j        r| j        dz   |z   | _        n|| _        ddd¦  «         n# 1 swxY w Y   n"t          | d	d¦  «        }|r|dz   |z   n|| _        dS d
|› �}	||                              dd¦  «        }
t	          |
t          ¦  «        si	 |
rt          |
¦  «        ng }|                     d|	                     ¦   «         dœ¦  «         |||         d<   n-# t          $ r |
› |	› �||         d<   Y nw xY w|
|	z   ||         d<   t                               dt          |¦  «        |dd…         t          |¦  «        dk    rdndz   ¦  «         dS )uy  Append any pending /steer text to the last tool result in this turn.

        Called at the end of a tool-call batch, before the next API call.
        The steer is appended to the last ``role:"tool"`` message's content
        with a clear marker so the model understands it came from the user
        and NOT from the tool itself. Role alternation is preserved â€”
        nothing new is inserted, we only modify existing content.

        Args:
            messages: The running messages list.
            num_tool_msgs: Number of tool results appended in this batch;
                used to locate the tail slice safely.
        r   Nr¢   r4  r  r  rž  r¯  r�  ú

User guidance: r  r€   r÷   ©rÛ   r÷   z9Delivered /steer to agent after tool batch (%d chars): %séx   ræ  )r&  r=  rd   r©   rb   rÚ   rƒ   ro   r�  rc   r  rÞ   Úlstripr�   r6  rµ  )rX   r
  r'  Ú
steer_textÚ
target_idxr¶  r  r    rÒ   r7  Úexisting_contentÚblockss               rZ   Ú$_apply_pending_steer_to_tool_resultsz,AIAgent._apply_pending_steer_to_tool_results$  sÊ  € ð ˜AÒÐ XÐØˆFØ×.Ò.Ñ0Ô0ˆ
Øð 	ØˆFð ˆ
Ý•s˜8‘}”} qÑ(­#­c°(©m¬m¸mÑ.KÈaÑ.OÐQSÑ*TÔ*TÐVXÑYÔYð 	ð 	ˆAØ˜1”+ˆCÝ˜#�tÑ$Ô$ð ¨¯ª°©¬¸FÒ)BÐ)BØ�
Ø�øØÐõ ˜DÐ"7¸Ñ>Ô>ˆEØÐ Øð 9ð 9ØÔ*ð 9Ø.2Ô.AÀDÑ.HÈ:Ñ.U˜Ô+Ð+à.8˜Ô+ð	9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9øõ # 4Ð)9¸4Ñ@Ô@�ØHPÐ&` x°$¡¸Ñ'CÐ'CÐV`�Ô#ØˆFØ3 zÐ3Ð3ˆØ# JÔ/×3Ò3°I¸rÑBÔBÐÝÐ*­CÑ0Ô0ð 	HðPØ3CÐK�Ð.Ñ/Ô/Ð/È�Ø—’ v°v·}²}±´ÐGÐGÑHÔHÐHØ28�˜Ô$ YÑ/Ð/øÝð Pð Pð Pà5EÐ2OÀvÐ2OÐ2O�˜Ô$ YÑ/Ð/Ð/ðPøøøð /?ÀÑ.GˆH�ZÔ  Ñ+Ý�ŠØGÝ�
‰OŒOØ�t˜�tÔ­¨Z©¬¸3Ò)>Ð)>  ÀBÑGñ	
ô 	
ð 	
ð 	
ð 	
s%   Â;"C)Ã)C-Ã0C-ÅAF ÆF5Æ4F5Údescc                 óD   — t          j         ¦   «         | _        || _        dS )zAUpdate the last-activity timestamp and description (thread-safe).N)r­  r®  r¯  )rX   r2  s     rZ   Ú_touch_activityzAIAgent._touch_activityc  s   € å!%¤¡¤ˆÔØ#'ˆÔ Ð Ð r\   Úhttp_responsec                 ó¢   — |€dS t          |dd¦  «        }|sdS 	 ddlm}  ||| j        ¬¦  «        }|�	|| _        dS dS # t
          $ r Y dS w xY w)zàParse x-ratelimit-* headers from an HTTP response and cache the state.

        Called after each streaming API call.  The httpx Response object is
        available on the OpenAI SDK Stream via ``stream.response``.
        Nr=  r   )Úparse_rate_limit_headersrÉ  )ro   Úagent.rate_limit_trackerr7  r|  r²  r�   )rX   r5  r=  r7  Ústates        rZ   Ú_capture_rate_limitszAIAgent._capture_rate_limitsh  s™   € ð Ð ØˆFÝ˜-¨°DÑ9Ô9ˆØð 	ØˆFð	ØIÐIÐIÐIÐIÐIØ,Ð,¨W¸t¼}ÐMÑMÔMˆEØÐ Ø).�Ô&Ð&Ð&ð !Ð øåð 	ð 	ð 	ØˆDˆDð	øøøs   ›!A  Á 
AÁAc                 ó   — | j         S )z1Return the last captured RateLimitState, or None.)r²  ri   s    rZ   Úget_rate_limit_statezAIAgent.get_rate_limit_state{  s   € àÔ%Ð%r\   c           	      óÄ   — t          j         ¦   «         | j        z
  }| j        | j        t          |d¦  «        | j        | j        | j        | j        j        | j        j	        dœS )zìReturn a snapshot of the agent's current activity for diagnostics.

        Called by the gateway timeout handler to report what the agent was doing
        when it was killed, and by the periodic "still working" notifications.
        r¢   )Úlast_activity_tsÚlast_activity_descÚseconds_since_activityÚcurrent_toolÚapi_call_countrƒ  Úbudget_usedÚ
budget_max)
r­  r®  r¯  Úroundr°  r±  rƒ  r®  r§   r›   )rX   Úelapseds     rZ   Úget_activity_summaryzAIAgent.get_activity_summary  sc   € õ ”)‘+”+ Ô 6Ñ6ˆà $Ô 6Ø"&Ô":Ý&+¨G°QÑ&7Ô&7Ø Ô.Ø"Ô2Ø"Ô1ØÔ0Ô5ØÔ/Ô9ð	
ð 	
ð 		
r\   c                 óh  — | j         rY	 | j                              |pg ¦  «         n# t          $ r Y nw xY w	 | j                              ¦   «          n# t          $ r Y nw xY wt	          | d¦  «        r?| j        r:	 | j                             | j        pd|pg ¦  «         dS # t          $ r Y dS w xY wdS dS )uC  Shut down the memory provider and context engine â€” call at actual session boundaries.

        This calls on_session_end() then shutdown_all() on the memory
        manager, and on_session_end() on the context engine.
        NOT called per-turn â€” only at CLI exit, /reset, gateway
        session expiry, etc.
        rk  r€   N)rö  Úon_session_endr�   Úshutdown_allr�  rk  r“  ©rX   r
  s     rZ   rx  z AIAgent.shutdown_memory_provider‘  s!  € ð Ôð 	ðØÔ$×3Ò3°H°NÀÑCÔCÐCÐCøÝð ð ð Ø�ðøøøðØÔ$×1Ò1Ñ3Ô3Ð3Ð3øÝð ð ð Ø�ðøøøõ �4Ð-Ñ.Ô.ð 	°4Ô3Jð 	ðØÔ'×6Ò6Ø”OÐ) rØ�N ñô ð ð ð øõ ð ð ð Ø��ðøøøð	ð 	ð 	ð 	s/   ‰& ¦
3²3·A Á
AÁAÁ9$B Â
B-Â,B-c                 ót   — | j         sdS 	 | j                              |pg ¦  «         dS # t          $ r Y dS w xY w)u  Trigger end-of-session extraction without tearing providers down.
        Called when session_id rotates (e.g. /new, context compression);
        providers keep their state and continue running under the old
        session_id â€” they just flush pending extraction now.N)rö  rI  r�   rK  s     rZ   Úcommit_memory_sessionzAIAgent.commit_memory_session¬  s\   € ð
 Ô#ð 	ØˆFð	ØÔ ×/Ò/°°¸BÑ?Ô?Ð?Ð?Ð?øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‹) ©
7¶7Úoriginal_user_messageÚfinal_responseÚinterruptedc                ó¶   — |rdS | j         r|r|sdS 	 | j                              ||¦  «         | j                              |¦  «         dS # t          $ r Y dS w xY w)us  Mirror a completed turn into external memory providers.

        Called at the end of ``run_conversation`` with the cleaned user
        message (``original_user_message``) and the finalised assistant
        response.  The external memory backend gets both ``sync_all`` (to
        persist the exchange) and ``queue_prefetch_all`` (to start
        warming context for the next turn) in one shot.

        Uses ``original_user_message`` rather than ``user_message``
        because the latter may carry injected skill content that bloats
        or breaks provider queries.

        Interrupted turns are skipped entirely (#15218).  A partial
        assistant output, an aborted tool chain, or a mid-stream reset
        is not durable conversational truth â€” mirroring it into an
        external memory backend pollutes future recall with state the
        user never saw completed.  The prefetch is gated on the same
        flag: the user's next message is almost certainly a retry of
        the same intent, and a prefetch keyed on the interrupted turn
        would fire against stale context.

        Normal completed turns still sync as before.  The whole body is
        wrapped in ``try/except Exception`` because external memory
        providers are strictly best-effort â€” a misconfigured or offline
        backend must not block the user from seeing their response.
        N)rö  Úsync_allÚqueue_prefetch_allr�   )rX   rN  rO  rP  s       rZ   Ú_sync_external_memory_for_turnz&AIAgent._sync_external_memory_for_turn¸  s�   € ðB ð 	ØˆFØÔ$ð 	¨ð 	Ð<Qð 	ØˆFð	ØÔ ×)Ò)Ð*?ÀÑPÔPÐPØÔ ×3Ò3Ð4IÑJÔJÐJÐJÐJøÝð 	ð 	ð 	ØˆDˆDð	øøøs   “5A
 Á

AÁAc                 óî  — 	 | j         5  t          | j        ¦  «        }| j                             ¦   «          ddd¦  «         n# 1 swxY w Y   |D ]M}	 |                     ¦   «          Œ# t
          $ r) 	 |                     ¦   «          n# t
          $ r Y nw xY wY ŒJw xY wn# t
          $ r Y nw xY w	 t          | dd¦  «        }|�!|                      |dd¬¦  «         d| _	        dS dS # t
          $ r Y dS w xY w)uô  Release LLM client resources WITHOUT tearing down session tool state.

        Used by the gateway when evicting this agent from _agent_cache for
        memory-management reasons (LRU cap or idle TTL) â€” the session may
        resume at any time with a freshly-built AIAgent that reuses the
        same task_id / session_id, so we must NOT kill:
          - process_registry entries for task_id (user's bg shells)
          - terminal sandbox for task_id (cwd, env, shell state)
          - browser daemon for task_id (open tabs, cookies)
          - memory provider (has its own lifecycle; keeps running)

        We DO close:
          - OpenAI/httpx client pool (big chunk of held memory + sockets;
            the rebuilt agent gets a fresh client anyway)
          - Active child subagents (per-turn artefacts; safe to drop)

        Safe to call multiple times.  Distinct from close() â€” which is the
        hard teardown for actual session boundaries (/new, /reset, session
        expiry).
        NrÆ  Úcache_evictTr  )
r¤  r  r£  r‘  Úrelease_clientsr�   ry  ro   Ú_close_openai_clientrÆ  )rX   Úchildrenr  rÆ  s       rZ   rW  zAIAgent.release_clientsã  s›  € ð,	ØÔ+ð .ð .Ý Ô 5Ñ6Ô6�ØÔ%×+Ò+Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð "ð ð �ðØ×)Ò)Ñ+Ô+Ð+Ð+øÝ ð ð ð ðØŸš™œ˜˜øÝ$ð ð ð Ø˜ðøøøøøð	øøøðøõ ð 	ð 	ð 	ØˆDð	øøøð	Ý˜T 8¨TÑ2Ô2ˆFØÐ!Ø×)Ò)¨&¸ÈtÐ)ÑTÔTÐTØ"�”��ð "Ð!øõ ð 	ð 	ð 	ØˆDˆDð	øøøs�   ‚B ‰.A·B ÁAÁB Á
AÁB ÁA(Á'B Á(
BÁ3BÂBÂ
BÂBÂBÂBÂB ÂBÂB Â
B,Â+B,Â02C& Ã&
C4Ã3C4c                 ó¨  — t          | dd¦  «        pd}	 ddlm} |                     |¬¦  «         n# t          $ r Y nw xY w	 t          |¦  «         n# t          $ r Y nw xY w	 t          |¦  «         n# t          $ r Y nw xY w	 | j        5  t          | j	        ¦  «        }| j	         
                    ¦   «          ddd¦  «         n# 1 swxY w Y   |D ]'}	 |                     ¦   «          Œ# t          $ r Y Œ$w xY wn# t          $ r Y nw xY w	 t          | dd¦  «        }|�!|                      |dd	¬
¦  «         d| _        dS dS # t          $ r Y dS w xY w)a   Release all resources held by this agent instance.

        Cleans up subprocess resources that would otherwise become orphans:
        - Background processes tracked in ProcessRegistry
        - Terminal sandbox environments
        - Browser daemon sessions
        - Active child agents (subagent delegation)
        - OpenAI/httpx client connections

        Safe to call multiple times (idempotent).  Each cleanup step is
        independently guarded so a failure in one does not prevent the rest.
        r“  Nr€   r   )Úprocess_registry©rR  rÆ  Úagent_closeTr  )ro   Útools.process_registryr[  Úkill_allr�   r   r   r¤  r  r£  r‘  ry  rX  rÆ  )rX   rR  r[  rY  r  rÆ  s         rZ   ry  zAIAgent.close  s9  € õ ˜$ ¨dÑ3Ô3Ð9°rˆð	Ø?Ð?Ð?Ð?Ð?Ð?Ø×%Ò%¨gÐ%Ñ6Ô6Ð6Ð6øÝð 	ð 	ð 	ØˆDð	øøøð	Ý�wÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøð	Ý˜GÑ$Ô$Ð$Ð$øÝð 	ð 	ð 	ØˆDð	øøøð
	ØÔ+ð .ð .Ý Ô 5Ñ6Ô6�ØÔ%×+Ò+Ñ-Ô-Ð-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð "ð ð �ðØ—K’K‘M”M�M�MøÝ ð ð ð Ø�Dðøøøðøõ
 ð 	ð 	ð 	ØˆDð	øøøð	Ý˜T 8¨TÑ2Ô2ˆFØÐ!Ø×)Ò)¨&¸ÈtÐ)ÑTÔTÐTØ"�”��ð "Ð!øõ ð 	ð 	ð 	ØˆDˆDð	øøøsœ   •2 ²
?¾?ÁA Á
A ÁA Á$A4 Á4
BÂ BÂC< Â.CÂ:C< ÃC
Ã
C< ÃC
ÃC< ÃC+Ã*C< Ã+
C8Ã5C< Ã7C8Ã8C< Ã<
D	ÄD	Ä2E Å
EÅEÚhistoryc                 ó  — d}t          |¦  «        D ]‘}|                     d¦  «        dk    rŒ|                     dd¦  «        }d|vrŒ7	 t          j        |¦  «        }d|v r%t	          |d         t
          ¦  «        r
|d         } nŒv# t          j        t          f$ r Y ŒŽw xY w|rP| j         	                    |d¬	¦  «         | j
        s-|                      | j        › d
t          |¦  «        › d�¦  «         t          d¦  «         dS )a  
        Recover todo state from conversation history.
        
        The gateway creates a fresh AIAgent per message, so the in-memory
        TodoStore is empty. We scan the history for the most recent todo
        tool response and replay it to reconstruct the state.
        Nr  r  r  r€   z"todos"ÚtodosF)Úmergeu   ðŸ“‹ Restored z todo item(s) from history)Úreversedrƒ   rÕ   rÖ   rb   r  r9  r:  rì  r_   r‰  r—  rŒ  rd   r  )rX   r`  Úlast_todo_responser  r  re   s         rZ   Ú_hydrate_todo_storezAIAgent._hydrate_todo_storeJ  s6  € ð "ÐÝ˜GÑ$Ô$ð 	ð 	ˆCØ�wŠw�v‰Œ &Ò(Ð(ØØ—g’g˜i¨Ñ,Ô,ˆGà Ð'Ð'ØðÝ”z 'Ñ*Ô*�Ø˜d�?�?¥z°$°w´-ÅÑ'FÔ'F�?Ø)-¨g¬Ð&Ø�EøøÝÔ(­)Ð4ð ð ð Ø�ðøøøð ð 	tàÔ×"Ò"Ð#5¸UÐ"ÑCÔCÐCØ”?ð tØ—’ ¤ÐrÐr½sÐCUÑ?VÔ?VÐrÐrÐrÑsÔsÐsÝ�uÑÔÐÐÐs   Á
;BÂB!Â B!c                 ó   — | j         S )z)Check if an interrupt has been requested.©r—  ri   s    rZ   Úis_interruptedzAIAgent.is_interruptedj  s   € ð Ô(Ð(r\   Úsystem_messagec                 ó¸
  ‡ ‡— d}‰ j         st          ¦   «         }|r|g}d}|st          g}g }d‰ j        v r|                     t
          ¦  «         d‰ j        v r|                     t          ¦  «         d‰ j        v r|                     t          ¦  «         |r(|                     d                     |¦  «        ¦  «         t          ‰ j        ¦  «        }|r|                     |¦  «         ‰ j        �ro‰ j
        }d}|du s+t          |t          ¦  «        r|                     ¦   «         dv rd}n¹|du s+t          |t          ¦  «        r|                     ¦   «         dv rd}n‡t          |t          ¦  «        r7‰ j        pd	                     ¦   «         Št!          ˆfd
„|D ¦   «         ¦  «        }n;‰ j        pd	                     ¦   «         Št!          ˆfd„t"          D ¦   «         ¦  «        }|ry|                     t$          ¦  «         ‰ j        pd	                     ¦   «         }	d|	v sd|	v r|                     t&          ¦  «         d|	v sd|	v r|                     t(          ¦  «         |�|                     |¦  «         ‰ j        rp‰ j        r1‰ j                             d¦  «        }
|
r|                     |
¦  «         ‰ j        r1‰ j                             d¦  «        }|r|                     |¦  «         ‰ j        rB	 ‰ j                             ¦   «         }|r|                     |¦  «         n# t6          $ r Y nw xY wt!          ˆ fd„dD ¦   «         ¦  «        }|r2d„ d„ ‰ j        D ¦   «         D ¦   «         }t9          ‰ j        |¬¦  «        }nd	}|r|                     |¦  «         ‰ j         s>t;          j        d¦  «        pd}t?          ||¬¦  «        }|r|                     |¦  «         ddl m!}  |¦   «         }d| "                    d¦  «        › �}‰ j#        r‰ j$        r|d‰ j$        › �z  }‰ j        r|d‰ j        › �z  }‰ j%        r|d‰ j%        › �z  }|                     |¦  «         ‰ j%        d k    rQd!‰ j        v r ‰ j         &                    d!¦  «        d"         n‰ j        }|                     d#|› d$‰ j        › d%�¦  «         tO          ¦   «         }|r|                     |¦  «         ‰ j(        pd	                     ¦   «          )                    ¦   «         }|tT          v r |                     tT          |         ¦  «         d&                     d'„ |D ¦   «         ¦  «        S )(a;  
        Assemble the full system prompt from all layers.
        
        Called once per session (cached on self._cached_system_prompt) and only
        rebuilt after context compression events. This ensures the system prompt
        is stable across all turns in a session, maximizing prefix cache hits.
        FTr2  r·   Úskill_manager´  )rM  ÚalwaysrO  Úon)ÚfalseÚneverÚnoÚoffr€   c              3   ón   •K  — | ]/}t          |t          ¦  «        ¯|                     ¦   «         ‰v V — Œ0d S rg   )rb   rc   rj  ©rÉ   Úpré  s     €rZ   rÎ   z/AIAgent._build_system_prompt.<locals>.<genexpr>³  sA   øè è € Ð_Ð_¸1ÍJÐWXÕZ]ÑL^ÔL^Ð_˜aŸgšg™iœi¨;Ð6Ð_Ð_Ð_Ð_Ð_Ð_r\   c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   rt  s     €rZ   rÎ   z/AIAgent._build_system_prompt.<locals>.<genexpr>·  s(   øè è € ÐTÐT°1˜a ;Ð.ÐTÐTÐTÐTÐTÐTr\   ÚgeminiÚgemmar±  ÚcodexNr_  c              3   ó*   •K  — | ]}|‰j         v V — Œd S rg   )rÖ  )rÉ   rp   rX   s     €rZ   rÎ   z/AIAgent._build_system_prompt.<locals>.<genexpr>ß  s+   øè è € ÐwÐwÀ˜t tÔ'<Ð<ÐwÐwÐwÐwÐwÐwr\   )r³   r±   rl  c                 ó   — h | ]}|¯|’ŒS rw   rw   )rÉ   Útoolsets     rZ   r  z/AIAgent._build_system_prompt.<locals>.<setcomp>á  s0   € ð ð ð àð ðØðð ð r\   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rg   )r   )rÉ   rä   s     rZ   rÎ   z/AIAgent._build_system_prompt.<locals>.<genexpr>ã  s<   è è € ð  ð  Ø8AÕ(¨Ñ3Ô3ð ð  ð  ð  ð  ð  r\   )Úavailable_toolsÚavailable_toolsetsrl  )rì   Ú	skip_soulr   )rØ  zConversation started: z%A, %B %d, %Y %I:%M %pz
Session ID: z
Model: z
Provider: rá  rÀ  r4  z#You are powered by the model named z. The exact model ID is zt. When asked what model you are, always answer based on this information, not on any model name returned by the API.rK  c              3   óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S rg   ©r„   ©rÉ   ru  s     rZ   rÎ   z/AIAgent._build_system_prompt.<locals>.<genexpr>  s7   è è € ÐHÐH¨¸a¿gºg¹i¼iÐH˜1Ÿ7š7™9œ9ÐHÐHÐHÐHÐHÐHr\   )+r«  r:   r$   rÖ  rÞ   r&   r'   r(   r  r)   r  rb   rc   rj  r  r‚  rÔ   r<   r;   r=   r>   rî  rï  Úformat_for_system_promptrð  rö  Úbuild_system_promptr�   r7   r�   r  r8   Úhermes_timerØ  rÚ  r²  r“  r|  rÑ  r9   rg  r„   r%   )rX   rj  Ú_soul_loadedÚ_soul_contentÚprompt_partsÚtool_guidanceÚnous_subscription_promptÚ_enforceÚ_injectÚ_model_lowerÚ	mem_blockÚ
user_blockÚ_ext_mem_blockÚhas_skills_toolsÚavail_toolsetsÚskills_promptÚ_context_cwdÚcontext_files_promptÚ_hermes_nowrØ  Útimestamp_lineÚ_model_shortÚ
_env_hintsÚplatform_keyré  s   `                       @rZ   Ú_build_system_promptzAIAgent._build_system_promptx  so  øø€ ð$ ˆØÔ&ð 	$Ý(™NœNˆMØð $Ø -˜�Ø#�àð 	4å2Ð3ˆLð ˆØ�tÔ,Ð,Ð,Ø× Ò ¥Ñ1Ô1Ð1Ø˜tÔ4Ð4Ð4Ø× Ò Õ!8Ñ9Ô9Ð9Ø˜TÔ2Ð2Ð2Ø× Ò ¥Ñ1Ô1Ð1Øð 	9Ø×Ò §¢¨Ñ 7Ô 7Ñ8Ô8Ð8å#AÀ$ÔBWÑ#XÔ#XÐ Ø#ð 	:Ø×ÒÐ 8Ñ9Ô9Ð9ð Ô ñ 	IØÔ1ˆHØˆGØ˜4ÐÐ¥J¨x½Ñ$=Ô$=ÐÀ(Ç.Â.ÑBRÔBRÐVuÐBuÐBuØ��Ø˜UÐ"Ð"¥z°(½CÑ'@Ô'@Ð"ÀXÇ^Â^ÑEUÔEUÐYxÐExÐExØ��Ý˜H¥dÑ+Ô+ð UØ#œzÐ/¨R×6Ò6Ñ8Ô8�ÝÐ_Ð_Ð_Ð_ÀÐ_Ñ_Ô_Ñ_Ô_��ð  $œzÐ/¨R×6Ò6Ñ8Ô8�ÝÐTÐTÐTÐTÕ8SÐTÑTÔTÑTÔT�Øð 
IØ×#Ò#Õ$AÑBÔBÐBØ $¤
Ð 0¨b×7Ò7Ñ9Ô9�ð ˜|Ð+Ð+¨w¸,Ð/FÐ/FØ ×'Ò'Õ(IÑJÔJÐJð ˜LÐ(Ð(¨G°|Ð,CÐ,CØ ×'Ò'Õ(GÑHÔHÐHð Ð%Ø×Ò Ñ/Ô/Ð/àÔð 		4ØÔ#ð 3Ø Ô.×GÒGÈÑQÔQ�	Øð 3Ø ×'Ò'¨	Ñ2Ô2Ð2àÔ)ð 4Ø!Ô/×HÒHÈÑPÔP�
Øð 4Ø ×'Ò'¨
Ñ3Ô3Ð3ð Ôð 	ðØ!%Ô!5×!IÒ!IÑ!KÔ!K�Ø!ð 8Ø ×'Ò'¨Ñ7Ô7Ð7øøÝð ð ð Ø�ðøøøõ ÐwÐwÐwÐwÐIvÐwÑwÔwÑwÔwÐØð 	ðð ð ð  ØEIÔEZð ñ  ô  ðñ ô ˆNõ 7Ø $Ô 5Ø#1ðñ ô ˆMˆMð
 ˆMØð 	/Ø×Ò Ñ.Ô.Ð.àÔ&ð 		:õ
 œ9 ^Ñ4Ô4Ð<¸ˆLÝ#=Ø ¨Lð$:ñ $:ô $:Ð à#ð :Ø×#Ò#Ð$8Ñ9Ô9Ð9à2Ð2Ð2Ð2Ð2Ð2Øˆk‰mŒmˆØZ°#·,²,Ð?WÑ2XÔ2XÐZÐZˆØÔð 	A D¤Oð 	AØÐ@¨t¬Ð@Ð@Ñ@ˆNØŒ:ð 	7ØÐ6¨$¬*Ð6Ð6Ñ6ˆNØŒ=ð 	=ØÐ<¨T¬]Ð<Ð<Ñ<ˆNØ×Ò˜NÑ+Ô+Ð+ð
 Œ=˜IÒ%Ð%Ø8;¸t¼zÐ8IÐ8I˜4œ:×+Ò+¨CÑ0Ô0°Ô4Ð4ÈtÌzˆLØ×Òð>°lð >ð >Ø)-¬ð>ð >ð >ñô ð õ -Ñ.Ô.ˆ
Øð 	,Ø×Ò 
Ñ+Ô+Ð+àœÐ+¨×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ˆØ�>Ð)Ð)Ø×Ò¥¨|Ô <Ñ=Ô=Ð=à�{Š{ÐHÐH¨lÐHÑHÔHÑHÔHÐHs   Ë80L) Ì)
L6Ì5L6c                 ó‚   — t          | t          ¦  «        r|                      dd¦  «        pdS t          | dd¦  «        pdS )z8Extract call ID from a tool_call entry (dict or object).r  r€   )rb   rÚ   rƒ   ro   )rÊ   s    rZ   Ú_get_tool_call_id_staticz AIAgent._get_tool_call_id_static#  sF   € õ �b�$ÑÔð 	*Ø—6’6˜$ Ñ#Ô#Ð) rÐ)Ý�r˜4 Ñ$Ô$Ð*¨Ð*r\   >   r  r_  ri  rÇ   r”  Ú	developerc                 óH  ‡
— g }| D ]V}|                      d¦  «        }|t          j        vrt                               d|¦  «         ŒA|                     |¦  «         ŒW|} t          ¦   «         }| D ]f}|                      d¦  «        dk    rK|                      d¦  «        pg D ]3}t                               |¦  «        }|r|                     |¦  «         Œ4Œgt          ¦   «         }| D ]G}|                      d¦  «        dk    r,|                      d¦  «        }|r|                     |¦  «         ŒH||z
  Š
‰
r6ˆ
fd„| D ¦   «         } t                               dt          ‰
¦  «        ¦  «         ||z
  }|r°g }	| D ]�}|	                     |¦  «         |                      d¦  «        dk    rQ|                      d¦  «        pg D ]9}t                               |¦  «        }||v r|	                     dd	|d
œ¦  «         Œ:Œ‚|	} t                               dt          |¦  «        ¦  «         | S )u	  Fix orphaned tool_call / tool_result pairs before every LLM call.

        Runs unconditionally â€” not gated on whether the context compressor
        is present â€” so orphans from session loading or manual message
        manipulation are always caught.
        r  z9Pre-call sanitizer: dropping message with invalid role %rr”  rà   r  rY  c                 ót   •— g | ]4}|                      d ¦  «        dk    r|                      d¦  «        ‰v °2|‘Œ5S ©r  r  rY  ©rƒ   )rÉ   ró  Úorphaned_resultss     €rZ   rË   z2AIAgent._sanitize_api_messages.<locals>.<listcomp>S  sO   ø€ ð ð ð ØØŸš˜f™œ¨Ò/Ð/°A·E²E¸.Ñ4IÔ4IÐM]Ð4]Ð4]ð Ø4]Ð4]Ð4]r\   z6Pre-call sanitizer: removed %d orphaned tool result(s)u2   [Result unavailable â€” see context summary above]©r  r  rY  z0Pre-call sanitizer: added %d stub tool result(s))
rƒ   rp  Ú_VALID_API_ROLESr6  rÙ   rÞ   rŸ  rž  r   rd   )r
  Úfilteredr  r  Úsurviving_call_idsrÊ   ÚcidÚresult_call_idsÚmissing_resultsÚpatchedr¤  s             @rZ   Ú_sanitize_api_messageszAIAgent._sanitize_api_messages,  sš  ø€ ð ˆØð 	!ð 	!ˆCØ—7’7˜6‘?”?ˆDØ�7Ô3Ð3Ð3Ý—’ØOØñô ð ð Ø�OŠO˜CÑ Ô Ð Ð Øˆå"%¡%¤%ÐØð 	4ð 	4ˆCØ�wŠw�v‰Œ +Ò-Ð-ØŸ'š' ,Ñ/Ô/Ð5°2ð 4ð 4�BÝ!×:Ò:¸2Ñ>Ô>�CØð 4Ø*×.Ò.¨sÑ3Ô3Ð3øøå"™uœuˆØð 	-ð 	-ˆCØ�wŠw�v‰Œ &Ò(Ð(Ø—g’g˜nÑ-Ô-�Øð -Ø#×'Ò'¨Ñ,Ô,Ð,øð +Ð-?Ñ?ÐØð 	ðð ð ð Ø#ðñ ô ˆHõ �LŠLØHÝÐ$Ñ%Ô%ñô ð ð -¨Ñ>ˆØð 	Ø,.ˆGØð 
ð 
�Ø—’˜sÑ#Ô#Ð#Ø—7’7˜6‘?”? kÒ1Ð1Ø!Ÿgšg lÑ3Ô3Ð9°rð ð ˜Ý%×>Ò>¸rÑBÔB˜Ø /Ð1Ð1Ø#ŸNšNØ(.Ø+_Ø03ð,ð ,ñ ô ð øøð
 ˆHÝ�LŠLØBÝ�OÑ$Ô$ñô ð ð ˆr\   rà   c                 óD  — ddl m}  |¦   «         }t          d„ | D ¦   «         ¦  «        }||k    r| S d}g }| D ]H}|j        j        dk    r!||k     r|                     |¦  «         |dz  }Œ3|                     |¦  «         ŒIt                               d||z
  |¦  «         |S )aj  Truncate excess delegate_task calls to max_concurrent_children.

        The delegate_tool caps the task list inside a single call, but the
        model can emit multiple separate delegate_task tool_calls in one
        turn.  This truncates the excess, preserving all non-delegate calls.

        Returns the original list if no truncation was needed.
        r   )Ú_get_max_concurrent_childrenc              3   ó:   K  — | ]}|j         j        d k    ¯dV — ŒdS )Údelegate_taskr¢   NrÆ   rÈ   s     rZ   rÎ   z3AIAgent._cap_delegate_task_calls.<locals>.<genexpr>~  s1   è è € Ð[Ð[ 2°r´{Ô7GÈ?Ò7ZÐ7Z˜QÐ7ZÐ7ZÐ7ZÐ7ZÐ[Ð[r\   r±  r¢   zUTruncated %d excess delegate_task call(s) to enforce max_concurrent_children=%d limit)Útools.delegate_toolr¯  r×  rÇ   rp   rÞ   r6  r7  )rà   r¯  Úmax_childrenÚdelegate_countÚkept_delegatesÚ	truncatedrÊ   s          rZ   Ú_cap_delegate_task_callsz AIAgent._cap_delegate_task_callsr  sé   € ð 	EÐDÐDÐDÐDÐDØ3Ð3Ñ5Ô5ˆÝÐ[Ð[¨Ð[Ñ[Ô[Ñ[Ô[ˆØ˜\Ò)Ð)ØÐØˆØˆ	Øð 	%ð 	%ˆBØŒ{Ô ?Ò2Ð2Ø! LÒ0Ð0Ø×$Ò$ RÑ(Ô(Ð(Ø" aÑ'�Nøà× Ò  Ñ$Ô$Ð$Ð$Ý�Šð/à˜\Ñ)¨<ñ	
ô 	
ð 	
ð
 Ðr\   c                 óL  — t          ¦   «         }g }| D ]n}|j        j        |j        j        f}||vr+|                     |¦  «         |                     |¦  «         ŒIt                               d|j        j        ¦  «         Œot          |¦  «        t          | ¦  «        k     r|n| S )zËRemove duplicate (tool_name, arguments) pairs within a single turn.

        Only the first occurrence of each unique pair is kept.
        Returns the original list if no duplicates were found.
        zRemoved duplicate tool call: %s)	rŸ  rÇ   rp   r×   r   rÞ   r6  r7  rd   )rà   ÚseenÚuniquerÊ   r…   s        rZ   Ú_deduplicate_tool_callszAIAgent._deduplicate_tool_calls‘  s¡   € õ ‘E”EˆØˆØð 	Tð 	TˆBØ”;Ô# R¤[Ô%:Ð;ˆCØ˜$ˆˆØ—’˜‘”�Ø—’˜bÑ!Ô!Ð!Ð!å—’Ð@À"Ä+ÔBRÑSÔSÐSÐSÝ˜V™œ¥s¨:¡¤Ò6Ð6ˆvˆv¸JÐFr\   rä   c                 ó–  ‡— ddl Šddlm} |sdS dt          dt          fd„}dt          dt          fˆfd„}dt          dt          dz  fd„}|                     ¦   «         }|| j        v r|S  ||¦  «        }|| j        v r|S ||| ||¦  «        h}t          d	¦  «        D ]x}	t          ¦   «         }
|D ]`} ||¦  «        }|rQ|
                     |¦  «         |
                      ||¦  «        ¦  «         |
                      ||¦  «        ¦  «         Œa||
z  }Œy|D ]}|r|| j        v r|c S Œ ||| j        d
d¬¦  «        }|r|d         S dS )a°  Attempt to repair a mismatched tool name before aborting.

        Models sometimes emit variants of a tool name that differ only
        in casing, separators, or class-like suffixes. Normalize
        aggressively before falling back to fuzzy match:

        1. Lowercase direct match.
        2. Lowercase + hyphens/spaces -> underscores.
        3. CamelCase -> snake_case (TodoTool -> todo_tool).
        4. Strip trailing ``_tool`` / ``-tool`` / ``tool`` suffix that
           Claude-style models sometimes tack on (TodoTool_tool ->
           TodoTool -> Todo -> todo). Applied twice so double-tacked
           suffixes like ``TodoTool_tool`` reduce all the way.
        5. Fuzzy match (difflib, cutoff=0.7).

        See #14784 for the original reports (TodoTool_tool, Patch_tool,
        BrowserClick_tool were all returning "Unknown tool" before).

        Returns the repaired name if found in valid_tool_names, else None.
        r   N)Úget_close_matchesÚsrx   c                 óz   — |                       ¦   «                              dd¦  «                             dd¦  «        S )NÚ-rE  r´  )rj  Úreplace)r¾  s    rZ   Ú_normz(AIAgent._repair_tool_call.<locals>._norm¾  s0   € Ø—7’7‘9”9×$Ò$ S¨#Ñ.Ô.×6Ò6°s¸CÑ@Ô@Ð@r\   c                 óL   •—  ‰j         dd| ¦  «                             ¦   «         S )Nz(?<!^)(?=[A-Z])rE  )rû   rj  )r¾  r;  s    €rZ   Ú_camel_snakez/AIAgent._repair_tool_call.<locals>._camel_snakeÁ  s&   ø€ Ø�2”6Ð,¨c°1Ñ5Ô5×;Ò;Ñ=Ô=Ð=r\   c                 ó¼   — |                       ¦   «         }dD ]D}|                     |¦  «        r-| d t          |¦  «         …                              d¦  «        c S ŒEd S )N)Ú_toolz-toolr  z_-)rj  r>  rd   r‰  )r¾  ÚlcÚsuffixs      rZ   Ú_strip_tool_suffixz5AIAgent._repair_tool_call.<locals>._strip_tool_suffixÄ  sg   € Ø—’‘”ˆBØ4ð :ð :�Ø—;’;˜vÑ&Ô&ð :Ø˜^¥ F¡¤˜|˜^Ô,×3Ò3°DÑ9Ô9Ð9Ð9Ð9ð:à�4r\   r  r¢   gffffffæ?)r"  Úcutoff)	r;  Údifflibr½  rc   rj  rÖ  r=  rŸ  r   )rX   rä   r½  rÂ  rÄ  rÉ  ÚloweredÚ
normalizedÚcandsrE  ÚextraÚcr  Úmatchesr;  s                 @rZ   Ú_repair_tool_callzAIAgent._repair_tool_call£  s  ø€ ð* 	ˆ	ˆ	ˆ	Ø-Ð-Ð-Ð-Ð-Ð-àð 	Ø�4ð	A•Sð 	A�Sð 	Að 	Að 	Að 	Að	>�Cð 	>¥Cð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð	¥#ð 	­#°©*ð 	ð 	ð 	ð 	ð —/’/Ñ#Ô#ˆØ�dÔ+Ð+Ð+ØˆNØ�U˜9Ñ%Ô%ˆ
Ø˜Ô.Ð.Ð.ØÐð % g¨z¸<¸<È	Ñ;RÔ;RÐSˆå�q‘”ð 	ð 	ˆAÝ!™eœeˆEØð 6ð 6�Ø-Ð-¨aÑ0Ô0�Øð 6Ø—I’I˜hÑ'Ô'Ð'Ø—I’I˜e˜e H™oœoÑ.Ô.Ð.Ø—I’I˜l˜l¨8Ñ4Ô4Ñ5Ô5Ð5øØ�U‰NˆEˆEàð 	ð 	ˆAØð �Q˜$Ô/Ð/Ð/Ø���øð $Ð# G¨TÔ-BÀaÐPSÐTÑTÔTˆØð 	Ø˜1”:Ðàˆtr\   c                 óX   — d| _         | j        r| j                             ¦   «          dS dS )z÷
        Invalidate the cached system prompt, forcing a rebuild on the next turn.
        
        Called after context compression events. Also reloads memory from disk
        so the rebuilt prompt captures any writes from this session.
        N)rä  rî  rõ  ri   s    rZ   Ú_invalidate_system_promptz!AIAgent._invalidate_system_promptë  s<   € ð &*ˆÔ"ØÔð 	0ØÔ×-Ò-Ñ/Ô/Ð/Ð/Ð/ð	0ð 	0r\   r   r  r×   Úindexc                 ó$   — t          | ||¦  «        S )u  Generate a deterministic call_id from tool call content.

        Used as a fallback when the API doesn't provide a call_id.
        Deterministic IDs prevent cache invalidation â€” random UUIDs would
        make every API call's prefix unique, breaking OpenAI's prompt cache.
        )Ú_codex_deterministic_call_id)r  r×   rÕ  s      rZ   rB   zAIAgent._deterministic_call_idö  s   € õ ,¨G°YÀÑFÔFÐFr\   Úraw_idc                 ó    — t          | ¦  «        S )z8Split a stored tool id into (call_id, response_item_id).)Ú_codex_split_responses_tool_id)rØ  s    rZ   rC   z AIAgent._split_responses_tool_id   s   € õ .¨fÑ5Ô5Ð5r\   Úcall_idÚresponse_item_idc                 ó"   — t          ||¦  «        S )zCBuild a valid Responses `function_call.id` (must start with `fc_`).)Ú(_codex_derive_responses_function_call_id)rX   rÛ  rÜ  s      rZ   rA   z*AIAgent._derive_responses_function_call_id  s   € õ 8¸ÐAQÑRÔRÐRr\   c                 óJ   — t          j        ¦   «         }|j        › d|j        › �S )Nr-  )rž   Úcurrent_threadrp   Úident)rX   Úthreads     rZ   Ú_thread_identityzAIAgent._thread_identity  s(   € ÝÔ)Ñ+Ô+ˆØ”+Ð.Ð. ¤Ð.Ð.Ð.r\   c                 ó¨   — t          | dd¦  «        }t          | dd¦  «        }t          | dd¦  «        }d|                      ¦   «         › d|› d|› d|› �S )	Nr|  ro  rˆ   r‚  zthread=ú
 provider=z
 base_url=z model=)ro   rã  )rX   r|  rˆ   r‚  s       rZ   Ú_client_log_contextzAIAgent._client_log_context  s}   € Ý˜4 ¨YÑ7Ô7ˆÝ˜4 ¨YÑ7Ô7ˆÝ˜˜g yÑ1Ô1ˆð1�d×+Ò+Ñ-Ô-ð 1ð 1¸ð 1ð 1Ø ð1ð 1Ø).ð1ð 1ð	
r\   c                 ó`   — t          | dd ¦  «        }|€t          j        ¦   «         }|| _        |S )Nrœ  )ro   rž   r›  rœ  )rX   Úlocks     rZ   Ú_openai_client_lockzAIAgent._openai_client_lock  s2   € Ý�t˜^¨TÑ2Ô2ˆØˆ<Ý”?Ñ$Ô$ˆDØ $ˆDÔØˆr\   rÆ  c                 ó  — ddl m} t          | |¦  «        rdS t          | dd¦  «        }|�-t	          |¦  «        r |¦   «         rdS nt          |¦  «        rdS t          | dd¦  «        }|�t          t          |dd¦  «        ¦  «        S dS )a„  Check if an OpenAI client is closed.

        Handles both property and method forms of is_closed:
        - httpx.Client.is_closed is a bool property
        - openai.OpenAI.is_closed is a method returning bool

        Prior bug: getattr(client, "is_closed", False) returned the bound method,
        which is always truthy, causing unnecessary client recreation on every call.
        r   ©ÚMockFÚ	is_closedNTÚ_client)Úunittest.mockrì  rb   ro   Úcallabler­   )rÆ  rì  Úis_closed_attrÚhttp_clients       rZ   Ú_is_openai_client_closedz AIAgent._is_openai_client_closed!  s¹   € ð 	'Ð&Ð&Ð&Ð&Ð&å�f˜dÑ#Ô#ð 	Ø�5å  ¨°dÑ;Ô;ˆØÐ%å˜Ñ'Ô'ð Ø!�>Ñ#Ô#ð  Ø˜4ð å�nÑ%Ô%ð Ø�tå˜f i°Ñ6Ô6ˆØÐ"Ý� ¨[¸%Ñ@Ô@ÑAÔAÐAØˆur\   c                 ó  — 	 dd l }dd l}|j        |j        dfg}t	          |d¦  «        rg|                     |j        |j        df¦  «         |                     |j        |j        df¦  «         |                     |j        |j	        df¦  «         n2t	          |d¦  «        r"|                     |j        |j
        df¦  «         t          | ¦  «        }|                     |                     |¬¦  «        |¬	¦  «        S # t          $ r Y d S w xY w)
Nr   r¢   ÚTCP_KEEPIDLEé   r1  rJ  ÚTCP_KEEPALIVE)Úsocket_options)Ú	transportrŽ   )ÚhttpxÚsocketÚ
SOL_SOCKETÚSO_KEEPALIVEr�  rÞ   ÚIPPROTO_TCPrõ  ÚTCP_KEEPINTVLÚTCP_KEEPCNTr÷  r�   ÚClientÚHTTPTransportr�   )rˆ   Ú_httpxÚ_socketÚ
_sock_optsÚ_proxys        rZ   Ú_build_keepalive_http_clientz$AIAgent._build_keepalive_http_client?  sF  € ð	Ø"Ð"Ð"Ð"Ø$Ð$Ð$Ð$à"Ô-¨wÔ/CÀQÐGÐHˆJÝ�w Ñ/Ô/ð TØ×!Ò! 7Ô#6¸Ô8LÈbÐ"QÑRÔRÐRØ×!Ò! 7Ô#6¸Ô8MÈrÐ"RÑSÔSÐSØ×!Ò! 7Ô#6¸Ô8KÈQÐ"OÑPÔPÐPÐPÝ˜ /Ñ2Ô2ð TØ×!Ò! 7Ô#6¸Ô8MÈrÐ"RÑSÔSÐSõ
 -¨XÑ6Ô6ˆFØ—=’=Ø ×.Ò.¸jÐ.ÑIÔIØð !ñ ô ð øõ ð 	ð 	ð 	Ø�4�4ð	øøøs   ‚C:C= Ã=
DÄ
Drr  r  c                ó  — ddl m}m} t          |¦  «        } |¦   «           ||                     d¦  «        ¦  «         | j        dk    s6t          |                     dd¦  «        ¦  «                             d¦  «        r?ddlm	}  |di |¤Ž}t                               d|||                      ¦   «         ¦  «         |S | j        d	k    s6t          |                     dd¦  «        ¦  «                             d
¦  «        r]ddlm} d„ |                     ¦   «         D ¦   «         }	 |di |	¤Ž}t                               d|||                      ¦   «         ¦  «         |S | j        dk    r¯ddlm}
m} t          |                     dd¦  «        pd¦  «        } ||¦  «        rwd„ |                     ¦   «         D ¦   «         }	d|	vr|                      |¦  «        }|�||	d<    |
di |	¤Ž}t                               d|||                      ¦   «         ¦  «         |S d|vr0|                      |                     dd¦  «        ¦  «        }|�||d<   t)          di |¤Ž}t                               d|||                      ¦   «         ¦  «         |S )Nr   )Ú_validate_base_urlÚ_validate_proxy_env_urlsrˆ   rÇ  r€   rÈ  )ÚCopilotACPClientz-Copilot ACP client created (%s, shared=%s) %szgoogle-gemini-clizcloudcode-pa://)ÚGeminiCloudCodeClientc                 ó"   — i | ]\  }}|d v ¯	||“ŒS )>   r{  rä  rˆ   Ú
project_idrú  rw   ró  s      rZ   rö  z1AIAgent._create_openai_client.<locals>.<dictcomp>t  s4   € ð ð ð Ù˜˜AØÐ[Ð[Ð[ð �1Ø[Ð[Ð[r\   z:Gemini Cloud Code Assist client created (%s, shared=%s) %srw  )ÚGeminiNativeClientÚis_native_gemini_base_urlc                 ó"   — i | ]\  }}|d v ¯	||“ŒS )>   r{  rä  rˆ   rò  rú  rw   ró  s      rZ   rö  z1AIAgent._create_openai_client.<locals>.<dictcomp>…  s4   € ð ð ð Ù!˜Q ØÐ`Ð`Ð`ð �qØ`Ð`Ð`r\   rò  z/Gemini native client created (%s, shared=%s) %sz(OpenAI client created (%s, shared=%s) %srw   )rÌ  r	  r
  rÚ   rƒ   r|  rc   rŠ  Úagent.copilot_acp_clientr  r6  rµ  ræ  Úagent.gemini_cloudcode_adapterr  r  Úagent.gemini_native_adapterr  r  r  r   )rX   rr  r  r  r	  r
  r  rÆ  r  Úsafe_kwargsr  r  rˆ   Úkeepalive_https                 rZ   rÑ  zAIAgent._create_openai_clientX  s:  € ØWÐWÐWÐWÐWÐWÐWÐWõ ˜]Ñ+Ô+ˆØ Ð Ñ"Ô"Ð"ØÐ˜=×,Ò,¨ZÑ8Ô8Ñ9Ô9Ð9ØŒ=˜MÒ)Ð)­S°×1BÒ1BÀ:ÈrÑ1RÔ1RÑ-SÔ-S×-^Ò-^Ð_nÑ-oÔ-oÐ)ØAÐAÐAÐAÐAÐAà%Ð%Ð6Ð6¨Ð6Ð6ˆFÝ�KŠKØ?ØØØ×(Ò(Ñ*Ô*ñ	ô ð ð ˆMØŒ=Ð/Ò/Ð/µ3°}×7HÒ7HÈÐUWÑ7XÔ7XÑ3YÔ3Y×3dÒ3dÐevÑ3wÔ3wÐ/ØLÐLÐLÐLÐLÐLðð Ø!.×!4Ò!4Ñ!6Ô!6ðñ ô ˆKð +Ð*Ð9Ð9¨[Ð9Ð9ˆFÝ�KŠKØLØØØ×(Ò(Ñ*Ô*ñ	ô ð ð ˆMØŒ=˜HÒ$Ð$ØaÐaÐaÐaÐaÐaÐaÐaå˜=×,Ò,¨Z¸Ñ<Ô<ÐBÀÑCÔCˆHØ(Ð(¨Ñ2Ô2ð ðð Ø%2×%8Ò%8Ñ%:Ô%:ðñ ô �ð !¨Ð3Ð3Ø%)×%FÒ%FÀxÑ%PÔ%P�NØ%Ð1Ø5C˜ MÑ2Ø+Ð+Ð:Ð:¨kÐ:Ð:�Ý—’ØEØØØ×,Ò,Ñ.Ô.ñ	ô ð ð �ð$  Ð-Ð-Ø!×>Ò>¸}×?PÒ?PÐQ[Ð]_Ñ?`Ô?`ÑaÔaˆNØÐ)Ø/=�˜mÑ,ÝÐ(Ð(˜-Ð(Ð(ˆÝ�ŠØ6ØØØ×$Ò$Ñ&Ô&ñ		
ô 	
ð 	
ð ˆr\   c                 óÐ  — ddl }d}	 t          | dd¦  «        }|€dS t          |dd¦  «        }|€dS t          |dd¦  «        }|€dS t          |dd¦  «        pt          |dd¦  «        pg }t          |¦  «        D ]¸}t          |dd¦  «        pt          |dd¦  «        }|€Œ't          |d	d¦  «        }	|	€$t          |d
d¦  «        }	|	�t          |	d	d¦  «        }	|	€Œa	 |	                     |j        ¦  «         n# t
          $ r Y nw xY w	 |	                     ¦   «          n# t
          $ r Y nw xY w|dz  }Œ¹n2# t          $ r%}
t           	                    d|
¦  «         Y d}
~
nd}
~
ww xY w|S )a  Force-close underlying TCP sockets to prevent CLOSE-WAIT accumulation.

        When a provider drops a connection mid-stream, httpx's ``client.close()``
        performs a graceful shutdown which leaves sockets in CLOSE-WAIT until the
        OS times them out (often minutes).  This method walks the httpx transport
        pool and issues ``socket.shutdown(SHUT_RDWR)`` + ``socket.close()`` to
        force an immediate TCP RST, freeing the file descriptors.

        Returns the number of sockets force-closed.
        r   Nrî  Ú
_transportÚ_poolÚ_connectionsÚ_network_streamÚ_streamÚ_sockr—   r¢   z'Force-close TCP sockets sweep error: %s)
rû  ro   r  ÚshutdownÚ	SHUT_RDWRr`   ry  r�   r6  rÙ   )rÆ  r  Úclosedrò  rù  ra  ÚconnectionsÚconnr—   Úsockru  s              rZ   Ú_force_close_tcp_socketsz AIAgent._force_close_tcp_sockets³  s  € ð 	!Ð Ð Ð àˆð)	IÝ! &¨)°TÑ:Ô:ˆKØÐ"Ø�qÝ ¨\¸4Ñ@Ô@ˆIØÐ Ø�qÝ˜9 g¨tÑ4Ô4ˆDØˆ|Ø�qõ ˜˜n¨dÑ3Ô3ð Ý˜4 ¨$Ñ/Ô/ðàð õ
 ˜[Ñ)Ô)ð ð �å˜DÐ"3°TÑ:Ô:ð 6Ý˜t Y°Ñ5Ô5ð ð �>ØÝ˜v w°Ñ5Ô5�Ø�<Ý" 6¨8°TÑ:Ô:�DØÐ'Ý& t¨W°dÑ;Ô;˜Ø�<ØðØ—M’M 'Ô"3Ñ4Ô4Ð4Ð4øÝð ð ð Ø�DðøøøðØ—J’J‘L”L�L�LøÝð ð ð Ø�Dðøøøà˜!‘��ð-øõ. ð 	Ið 	Ið 	IÝ�LŠLÐBÀCÑHÔHÐHÐHÐHÐHÐHÐHøøøøð	Iøøøàˆsp   ˆD4 �D4 ²D4 ÁBD4 ÃC7Ã6D4 Ã7
DÄD4 ÄDÄD4 ÄDÄD4 Ä
D*Ä'D4 Ä)D*Ä*	D4 Ä4
E#Ä>EÅE#c                óR  — |€d S |                       |¦  «        }	 |                     ¦   «          t                               d||||                      ¦   «         ¦  «         d S # t
          $ r;}t                               d|||                      ¦   «         |¦  «         Y d }~d S d }~ww xY w)Nz<OpenAI client closed (%s, shared=%s, tcp_force_closed=%d) %sz6OpenAI client close failed (%s, shared=%s) %s error=%s)r$  ry  r6  rµ  ræ  r�   rÙ   )rX   rÆ  r  r  Úforce_closedru  s         rZ   rX  zAIAgent._close_openai_clientî  sÞ   € Øˆ>ØˆFð ×4Ò4°VÑ<Ô<ˆð	Ø�LŠL‰NŒNˆNÝ�KŠKØNØØØØ×(Ò(Ñ*Ô*ñô ð ð ð øõ ð 	ð 	ð 	Ý�LŠLØHØØØ×(Ò(Ñ*Ô*Øñô ð ð ð ð ð ð ð øøøøð	øøøs   ›AA! Á!
B&Á+0B!Â!B&c                ó¦  — |                       ¦   «         5  t          | dd ¦  «        }	 |                      | j        |d¬¦  «        }nR# t          $ rE}t
                               d||                      ¦   «         |¦  «         Y d }~d d d ¦  «         dS d }~ww xY w|| _        d d d ¦  «         n# 1 swxY w Y   |  	                    |d|› �d¬¦  «         dS )NrÆ  Tr  z7Failed to rebuild shared OpenAI client (%s) %s error=%sFzreplace:)
ré  ro   rÑ  rÇ  r�   r6  r7  ræ  rÆ  rX  )rX   r  Ú
old_clientÚ
new_clientru  s        rZ   Ú_replace_primary_openai_clientz&AIAgent._replace_primary_openai_client  sU  € Ø×%Ò%Ñ'Ô'ð 	%ð 	%Ý   x°Ñ6Ô6ˆJð	Ø!×7Ò7¸Ô8KÐTZÐcgÐ7ÑhÔh�
�
øÝð ð ð Ý—’ØMØØ×,Ò,Ñ.Ô.Øñ	ô ð ð �u�u�uð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%øøøøðøøøð %ˆDŒKð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	×!Ò! *Ð5HÀÐ5HÐ5HÐQUÐ!ÑVÔVÐVØˆts:   •B+¨AÁB+Á
BÁ/BÁ?B+ÂBÂ
B+Â+B/Â2B/c                óÜ  — |                       ¦   «         5  t          | dd ¦  «        }|�#|                      |¦  «        s|cd d d ¦  «         S d d d ¦  «         n# 1 swxY w Y   t                               d||                      ¦   «         ¦  «         |                      d|› �¬¦  «        st          d¦  «        ‚|                       ¦   «         5  | j        cd d d ¦  «         S # 1 swxY w Y   d S )NrÆ  zCDetected closed shared OpenAI client; recreating before use (%s) %szrecreate_closed:©r  z'Failed to recreate closed OpenAI client)	ré  ro   ró  r6  r7  ræ  r*  rÐ  rÆ  )rX   r  rÆ  s      rZ   Ú_ensure_primary_openai_clientz%AIAgent._ensure_primary_openai_client  sš  € Ø×%Ò%Ñ'Ô'ð 	ð 	Ý˜T 8¨TÑ2Ô2ˆFØÐ!¨$×*GÒ*GÈÑ*OÔ*OÐ!Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	õ
 	�ŠØQØØ×$Ò$Ñ&Ô&ñ	
ô 	
ð 	
ð
 ×2Ò2Ð:UÈVÐ:UÐ:UÐ2ÑVÔVð 	JÝÐHÑIÔIÐIØ×%Ò%Ñ'Ô'ð 	ð 	Ø”;ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s#   •*AÁAÁAÃC!Ã!C%Ã(C%c                 ó,  — t          | dd¦  «        }|€dS 	 t          |dd¦  «        }|€dS t          |dd¦  «        }|€dS t          |dd¦  «        }|€dS t          |dd¦  «        pt          |dd¦  «        pg }d}t          |¦  «        D �]}t          |d	d¦  «        pt          |d
d¦  «        }|€Œ(t          |dd¦  «        }	|	€$t          |dd¦  «        }	|	�t          |	dd¦  «        }	|	€Œbddl}
	 |	                     d¦  «         |	                     d|
j        |
j        z  ¦  «        }|dk    r|dz  }n # t          $ r Y nt          $ r |dz  }Y nw xY w	 |	                     d¦  «         Œâ# t          $ r Y Œîw xY w# 	 |	                     d¦  «         w # t          $ r Y w w xY wxY w|dk    r3t           
                    d|¦  «         |                      d¬¦  «         dS n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wdS )aY  Detect and clean up dead TCP connections on the primary client.

        Inspects the httpx connection pool for sockets in unhealthy states
        (CLOSE-WAIT, errors).  If any are found, force-closes all sockets
        and rebuilds the primary client from scratch.

        Returns True if dead connections were found and cleaned up.
        rÆ  NFrî  r  r  r  r   r  r  r  r—   r¢   r\   Tu@   Found %d dead connection(s) in client pool â€” rebuilding clientÚdead_connection_cleanupr,  zDead connection check error: %s)ro   r  rû  ÚsetblockingÚrecvÚMSG_PEEKÚMSG_DONTWAITÚBlockingIOErrorr`   r6  r7  r*  r�   rÙ   )rX   rÆ  rò  rù  ra  r!  Ú
dead_countr"  r—   r#  r  re   ru  s                rZ   Ú_cleanup_dead_connectionsz!AIAgent._cleanup_dead_connections'  sé  € õ ˜˜x¨Ñ.Ô.ˆØˆ>Ø�5ð7	AÝ! &¨)°TÑ:Ô:ˆKØÐ"Ø�uÝ ¨\¸4Ñ@Ô@ˆIØÐ Ø�uÝ˜9 g¨tÑ4Ô4ˆDØˆ|Ø�uå˜˜n¨dÑ3Ô3ð Ý˜4 ¨$Ñ/Ô/ðàð ð
 ˆJÝ˜[Ñ)Ô)ð ñ �õ ˜DÐ"3°TÑ:Ô:ð 6Ý˜t Y°Ñ5Ô5ð ð �>ØÝ˜v w°Ñ5Ô5�Ø�<Ý" 6¨8°TÑ:Ô:�DØÐ'Ý& t¨W°dÑ;Ô;˜Ø�<Øà(Ð(Ð(Ð(ðØ×$Ò$ UÑ+Ô+Ð+ØŸ9š9 Q¨Ô(8¸7Ô;OÑ(OÑPÔP�DØ˜s’{�{Ø" a™˜
øøÝ&ð ð ð Ø�DÝð $ð $ð $Ø !‘O�J�J�Jð$øøøðØ×(Ò(¨Ñ.Ô.Ð.Ð.øÝ"ð ð ð Ø˜ðøøøøðØ×(Ò(¨Ñ.Ô.Ð.Ð.øÝ"ð ð ð Ø˜ðøøøøøøà˜AŠ~ˆ~Ý—’ØVØñô ð ð ×3Ò3Ð;TÐ3ÑUÔUÐUØ�tð øõ ð 	Að 	Að 	AÝ�LŠLÐ:¸CÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøàˆus®   —G" ¬G" ÁG" ÁBG" Ã2AD6Ä5E=Ä6
EÅ E=ÅEÅE=ÅEÅE=ÅE-Å,G" Å-
E:Å7G" Å9E:Å:G" Å=F%Å?FÆF%Æ
F"	ÆF%Æ!F"	Æ"F%Æ%:G" Ç"
HÇ,HÈHc                ó  — ddl m} |                      |¬¦  «        }t          ||¦  «        r|S |                      ¦   «         5  t          | j        ¦  «        }d d d ¦  «         n# 1 swxY w Y   |                      ||d¬¦  «        S )Nr   rë  r,  Fr  )rï  rì  r-  rb   ré  rÚ   rÇ  rÑ  )rX   r  rì  Úprimary_clientÚrequest_kwargss        rZ   Ú_create_request_openai_clientz%AIAgent._create_request_openai_clientm  sÕ   € Ø&Ð&Ð&Ð&Ð&Ð&à×;Ò;À6Ð;ÑJÔJˆÝ�n dÑ+Ô+ð 	"Ø!Ð!Ø×%Ò%Ñ'Ô'ð 	7ð 	7Ý! $Ô"5Ñ6Ô6ˆNð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7à×)Ò)¨.ÀÐPUÐ)ÑVÔVÐVs   ÁA$Á$A(Á+A(c                ó6   — |                       ||d¬¦  «         d S )NFr  )rX  )rX   rÆ  r  s      rZ   Ú_close_request_openai_clientz$AIAgent._close_request_openai_clientw  s#   € Ø×!Ò! &°ÀÐ!ÑFÔFÐFÐFÐFr\   Úon_first_deltac                 ó	  — ddl }|p|                      d¬¦  «        }d}d}d}g | _        t          |dz   ¦  «        D �]N}	| j        rt          d¦  «        ‚g }
	  |j        j        d(i |¤Ž5 }|D �]š}|                      d¦  «         | j        r �nzt          |d	d
¦  «        }d|v s|dk    rit          |dd
¦  «        }|r| j         
                    |¦  «         |r9|s7|s d}|r	  |¦   «          n# t          $ r Y nw xY w|                      |¦  «         Œ¦d|v rd}Œ­d|v r-d|v r)t          |dd
¦  «        }|r|                      |¦  «         ŒÞ|dk    r*t          |dd¦  «        }|�|
 
                    |¦  «         �Œ|dv rˆt          |dd¦  «        }|rt          |dd¦  «        nd}|rt          |dd¦  «        nd}t                               d|||t!          d„ | j        D ¦   «         ¦  «        |                      ¦   «         ¦  «         �Œœ|                     ¦   «         }t          |dd¦  «        }t'          |t(          ¦  «        rÈ|sÆ|
r=t)          |
¦  «        |_        t                               dt/          |
¦  «        ¦  «         n‡| j        r€|s~d
                     | j        ¦  «        }t3          dddt3          d|¬¦  «        g¬ ¦  «        g|_        t                               d!t/          | j        ¦  «        t/          |¦  «        ¦  «         |cddd¦  «         c S # 1 swxY w Y   �Œì# |j        |j        |j        t:          f$ r“}|	|k     r<t                               d"|	dz   |dz   |                      ¦   «         |¦  «         Y d}~�ŒKt                               d#|                      ¦   «         |¦  «         |                      ||¬$¦  «        cY d}~c S d}~wt>          $ r©}tA          |¦  «        }d%|v }|rA|	|k     r;t                               d&|	dz   |dz   |                      ¦   «         ¦  «         Y d}~�Œú|rKt                               d'|                      ¦   «         ¦  «         |                      ||¬$¦  «        cY d}~c S ‚ d}~ww xY wdS ))zJExecute one streaming Responses API request and return the final response.r   NÚcodex_stream_directr,  r¢   Fz+Agent interrupted before Codex stream retryúreceiving stream responserÛ   r€   zoutput_text.deltaúresponse.output_text.deltaÚdeltaTr  rE  úresponse.output_item.doneÚitem)úresponse.incompleteúresponse.failedrÙ  ÚstatusÚincomplete_detailszkCodex Responses stream received terminal event %s (status=%s, incomplete_details=%s, streamed_chars=%d). %sc              3   ó4   K  — | ]}t          |¦  «        V — Œd S rg   rÌ  rƒ  s     rZ   rÎ   z,AIAgent._run_codex_stream.<locals>.<genexpr>¸  s(   è è € Ð#TÐ#T¨q¥C¨¡F¤FÐ#TÐ#TÐ#TÐ#TÐ#TÐ#Tr\   Úoutputz;Codex stream: backfilled %d output items from stream eventsr�  r”  r«  Úoutput_textr*  ©rÛ   r  rG  r  z?Codex stream: synthesized output from %d text deltas (%d chars)zNCodex Responses stream transport failed (attempt %s/%s); retrying. %s error=%szYCodex Responses stream transport failed; falling back to create(stream=True). %s error=%s)rÆ  úresponse.completedzGResponses stream closed before completion (attempt %s/%s); retrying. %szYResponses stream did not emit response.completed; falling back to create(stream=True). %srw   )!rú  r-  Ú_codex_streamed_text_partsr=  r—  ÚInterruptedErrorÚ	responsesr—   r4  ro   rÞ   r�   Ú_fire_stream_deltaÚ_fire_reasoning_deltar6  r7  r×  ræ  Úget_final_responserb   r  rJ  rÙ   rd   r  r   ÚRemoteProtocolErrorÚReadTimeoutÚConnectErrorÚConnectionErrorÚ!_run_codex_create_stream_fallbackrÐ  rc   )rX   rî  rÆ  r=  r  Úactive_clientÚmax_stream_retriesÚhas_tool_callsÚfirst_delta_firedÚattemptÚcollected_output_itemsr—   ÚeventÚ
event_typeÚ
delta_textÚreasoning_textÚ	done_itemÚresp_objrG  rH  rO  Ú_outÚ	assembledru  Úerr_textÚmissing_completeds                             rZ   Ú_run_codex_streamzAIAgent._run_codex_streamz  sN  € àÐÐÐàÐb $×"DÒ"DÐLaÐ"DÑ"bÔ"bˆØÐØˆØ!Ðð 13ˆÔ'ÝÐ/°!Ñ3Ñ4Ô4ð o	ñ o	ˆGØÔ(ð VÝ&Ð'TÑUÔUÐUØ+-Ð"ðkØ3�]Ô,Ô3ÐAÐA°jÐAÐAð H*ÀVØ!'ð .ñ .˜Ø×,Ò,Ð-HÑIÔIÐIØÔ4ð "Ø!™EÝ%,¨U°F¸BÑ%?Ô%?˜
à.°*Ð<Ð<À
ÐNjÒ@jÐ@jÝ)0°¸ÀÑ)DÔ)D˜JØ)ð SØ $Ô ?× FÒ FÀzÑ RÔ RÐ RØ)ð D°.ð DØ'8ð !1Ø8<Ð$5Ø'5ð %1ð)1Ø,:¨NÑ,<Ô,<Ð,<Ð,<øÝ/8ð )1ð )1ð )1Ø,0¨Dð)1øøøà $× 7Ò 7¸
Ñ CÔ CÐ Cøà,°
Ð:Ð:Ø-1˜N˜Nà(¨JÐ6Ð6¸7ÀjÐ;PÐ;PÝ-4°U¸GÀRÑ-HÔ-H˜NØ-ð KØ $× :Ò :¸>Ñ JÔ JÐ Jøð
 (Ð+FÒFÐFÝ(/°°v¸tÑ(DÔ(D˜IØ(Ð4Ø 6× =Ò =¸iÑ HÔ HÐ Hùà'Ð+UÐUÐUÝ'.¨u°jÀ$Ñ'GÔ'G˜HØJRÐ%\¥W¨X°xÀÑ%FÔ%FÐ%FÐX\˜FØbjÐ1tµ¸ÐCWÐY]Ñ1^Ô1^Ð1^ÐptÐ.Ý"ŸNšNð!\à *¨FÐ4FÝ #Ð#TÐ#T°DÔ4SÐ#TÑ#TÔ#TÑ TÔ TØ $× 8Ò 8Ñ :Ô :ñô ð ùð &,×%>Ò%>Ñ%@Ô%@�Nõ # >°8¸TÑBÔB�DÝ! $­Ñ-Ô-ð °dð Ø1ð Ý48Ð9OÑ4PÔ4P˜NÔ1Ý"ŸLšLØ ]Ý #Ð$:Ñ ;Ô ;ñô ð ð ð "Ô<ð À^ð Ø(*¯ª°Ô0OÑ(PÔ(P˜IÝ5DØ%.Ø%0Ø'2Ý)8¸mÐR[Ð)\Ñ)\Ô)\Ð(]ð	6ñ 6ô 6ð 5˜NÔ1õ #ŸLšLØ aÝ # DÔ$CÑ DÔ DÅcÈ)ÁnÄnñô ð ð *ðQH*ð H*ð H*ð H*ñ H*ô H*ð H*ð H*ð H*ð H*ð H*ð H*ð H*ð H*øøøð H*ð H*ð H*ð H*ñ H*øðR Ô.°Ô0BÀFÔDWÕYhÐið `ð `ð `ØÐ/Ò/Ð/Ý—L’LØhØ !™Ø*¨QÑ.Ø×0Ò0Ñ2Ô2Øñô ð ð �H�H�H‘HÝ—’ØoØ×,Ò,Ñ.Ô.Øñô ð ð
 ×=Ò=¸jÐQ^Ð=Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_øøøøÝð ð ð Ý˜s™8œ8�Ø$8¸HÐ$DÐ!Ø$ð ¨Ð3EÒ)EÐ)EÝ—L’LØaØ !™Ø*¨QÑ.Ø×0Ò0Ñ2Ô2ñ	ô ð ð �H�H�H‘HØ$ð dÝ—L’LØsØ×0Ò0Ñ2Ô2ñô ð ð  ×AÒAÀ*ÐUbÐAÑcÔcÐcÐcÐcÐcÐcÐcÐcÐcØøøøøð#øøøð}o	ð o	s�   ÁL(Á*A7LÃ"
C-Ã,LÃ-
C:	Ã7LÃ9C:	Ã:HLÌL(ÌL	ÌL(Ì"L	Ì#L(Ì(R	Í<OÎAOÏR	ÏR	Ï ARÐ6ARÑ;R	ÒRÒR	c           
      ó*  — |p|                       d¬¦  «        }t          |¦  «        }d|d<   |                      ¦   «                              |d¬¦  «        } |j        j        di |¤Ž}t          |d¦  «        r|S t          |d¦  «        s|S d}g }g }	 |D �]l}	|                      d	¦  «         t          |	d
d¦  «        }
|
s*t          |	t          ¦  «        r|	 
                    d
¦  «        }
|
dk    rUt          |	dd¦  «        }|€*t          |	t          ¦  «        r|	 
                    d¦  «        }|�|                     |¦  «         nY|
dv rUt          |	dd¦  «        }|s+t          |	t          ¦  «        r|	 
                    dd¦  «        }|r|                     |¦  «         |
dvr�Œt          |	dd¦  «        }|€*t          |	t          ¦  «        r|	 
                    d¦  «        }|��t          |dd¦  «        }t          |t          ¦  «        r·|sµ|r=t          |¦  «        |_        t                               dt!          |¦  «        ¦  «         nv|rtd                     |¦  «        }t%          dddt%          d|¬¦  «        g¬¦  «        g|_        t                               dt!          |¦  «        t!          |¦  «        ¦  «         |c t          |dd¦  «        }t'          |¦  «        r	  |¦   «          S # t(          $ r Y S w xY wS �Œn	 t          |dd¦  «        }t'          |¦  «        r	  |¦   «          nR# t(          $ r Y nFw xY wnA# t          |dd¦  «        }t'          |¦  «        r	  |¦   «          w # t(          $ r Y w w xY ww xY w|�|S t+          d¦  «        ‚)zQFallback path for stream completion edge cases on Codex-style Responses backends.Úcodex_create_stream_fallbackr,  Tr—   ©Úallow_streamrJ  Ú__iter__Nr@  rÛ   rC  rD  )rA  rB  r€   >   rF  rM  rE  rÙ  z1Codex fallback stream: backfilled %d output itemsr�  r”  r«  rK  r*  rL  z<Codex fallback stream: synthesized from %d deltas (%d chars)ry  zHResponses create(stream=True) fallback did not emit a terminal response.rw   )r-  rÚ   r‹  Úpreflight_kwargsrP  Úcreater�  r4  ro   rb   rƒ   rÞ   r  rJ  r6  rÙ   rd   r  r   rð  r�   rÐ  )rX   rî  rÆ  rY  Úfallback_kwargsÚstream_or_responseÚterminal_responser^  Úcollected_text_deltasr_  r`  rc  rB  re  rf  Úclose_fns                   rZ   rX  z)AIAgent._run_codex_create_stream_fallback÷  sl  € àÐk $×"DÒ"DÐLjÐ"DÑ"kÔ"kˆÝ˜zÑ*Ô*ˆØ$(ˆ˜Ñ!Ø×-Ò-Ñ/Ô/×@Ò@ÀÐ_cÐ@ÑdÔdˆØ;˜]Ô4Ô;ÐNÐN¸oÐNÐNÐõ Ð% xÑ0Ô0ð 	&Ø%Ð%ÝÐ)¨:Ñ6Ô6ð 	&Ø%Ð%à ÐØ')ÐØ&(Ðð7	Ø+ð /-ñ /-�Ø×$Ò$Ð%@ÑAÔAÐAÝ$ U¨F°DÑ9Ô9�
Ø!ð 3¥j°½Ñ&=Ô&=ð 3Ø!&§¢¨6Ñ!2Ô!2�Jð Ð!<Ò<Ð<Ý '¨¨v°tÑ <Ô <�IØ Ð(­Z¸½tÑ-DÔ-DÐ(Ø$)§I¢I¨fÑ$5Ô$5˜	Ø Ð,Ø.×5Ò5°iÑ@Ô@Ð@øØÐ#BÐBÐBÝ# E¨7°BÑ7Ô7�EØ ð 7¥Z°µtÑ%<Ô%<ð 7Ø %§	¢	¨'°2Ñ 6Ô 6˜Øð <Ø-×4Ò4°UÑ;Ô;Ð;àÐ%eÐeÐeÙå$+¨E°:¸tÑ$DÔ$DÐ!Ø$Ð,µ¸EÅ4Ñ1HÔ1HÐ,Ø(-¯	ª	°*Ñ(=Ô(=Ð%Ø$Ñ0å"Ð#4°hÀÑEÔE�DÝ! $­Ñ-Ô-ð °dð Ø1ð Ý7;Ð<RÑ7SÔ7SÐ-Ô4Ý"ŸLšLØ SÝ #Ð$:Ñ ;Ô ;ñô ð ð ð 3ð 
Ø(*¯ªÐ0EÑ(FÔ(F˜IÝ8GØ%.°[Ø'2Ý)8¸mÐR[Ð)\Ñ)\Ô)\Ð(]ð9ñ 9ô 9ð 8Ð-Ô4õ
 #ŸLšLØ ^Ý #Ð$9Ñ :Ô :½CÀ	¹N¼Nñô ð ð -Ð,Ð,åÐ1°7¸DÑAÔAˆHÝ˜Ñ!Ô!ð ðØ�H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøðñ1 1ð5/-õb Ð1°7¸DÑAÔAˆHÝ˜Ñ!Ô!ð ðØ�H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøðøõ Ð1°7¸DÑAÔAˆHÝ˜Ñ!Ô!ð ðØ�H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøðøøøð Ð(Ø$Ð$ÝÐeÑfÔfÐfs[   ÂH1M Ë%
K0Ë0
K=Ë<K=ÌM Ì%
L0 Ì0
L=Ì<L=Í!M?Í#
M.Í-M?Í.
M;Í8M?Í:M;Í;M?Tc                óº  — | j         dk    s| j        dk    rdS 	 ddlm}  ||¬¦  «        }n3# t          $ r&}t
                               d|¦  «         Y d }~dS d }~ww xY w|                     d¦  «        }|                     d	¦  «        }t          |t          ¦  «        r| 
                    ¦   «         sdS t          |t          ¦  «        r| 
                    ¦   «         sdS | 
                    ¦   «         | _        | 
                    ¦   «                              d
¦  «        | _        | j        | j        d<   | j        | j        d	<   |                      d¬¦  «        sdS dS )Nrµ  r¹  Fr   )Ú!resolve_codex_runtime_credentials)Úforce_refreshz#Codex credential refresh failed: %sr{  rˆ   rÀ  Úcodex_credential_refreshr,  T)r}  r|  rÎ  rw  r�   r6  rÙ   rƒ   rb   rc   r„   r{  r‰  rˆ   rÇ  r*  )rX   r“  rw  Úcredsru  r{  rˆ   s          rZ   Ú%_try_refresh_codex_client_credentialsz-AIAgent._try_refresh_codex_client_credentialsE  sp  € ØŒ=Ð-Ò-Ð-°´À.Ò1PÐ1PØ�5ð	ØIÐIÐIÐIÐIÐIà5Ð5ÀEÐJÑJÔJˆEˆEøÝð 	ð 	ð 	Ý�LŠLÐ>ÀÑDÔDÐDØ�5�5�5�5�5øøøøð	øøøð —)’)˜IÑ&Ô&ˆØ—9’9˜ZÑ(Ô(ˆÝ˜'¥3Ñ'Ô'ð 	¨w¯}ª}©¬ð 	Ø�5Ý˜(¥CÑ(Ô(ð 	°·²Ñ0@Ô0@ð 	Ø�5à—}’}‘”ˆŒØ ŸšÑ(Ô(×/Ò/°Ñ4Ô4ˆŒØ)-¬ˆÔ˜IÑ&Ø*.¬-ˆÔ˜JÑ'à×2Ò2Ð:TÐ2ÑUÔUð 	Ø�5àˆts   š- ­
A·AÁAc                ó�  — | j         dk    s| j        dk    rdS 	 ddlm}  |t	          dt          t          j        dd¦  «        ¦  «        ¦  «        t          t          j        d	d
¦  «        ¦  «        |¬¦  «        }n3# t          $ r&}t                               d|¦  «         Y d }~dS d }~ww xY w|                     d¦  «        }|                     d¦  «        }t          |t          ¦  «        r|                     ¦   «         sdS t          |t          ¦  «        r|                     ¦   «         sdS |                     ¦   «         | _        |                     ¦   «                              d¦  «        | _        | j        | j        d<   | j        | j        d<   | j                             dd ¦  «         |                      d¬¦  «        sdS dS )Nr·  ÚnousFr   )Ú resolve_nous_runtime_credentialsr  ÚHERMES_NOUS_MIN_KEY_TTL_SECONDSÚ1800ÚHERMES_NOUS_TIMEOUT_SECONDSÚ15)Úmin_key_ttl_secondsÚtimeout_secondsÚ
force_mintz"Nous credential refresh failed: %sr{  rˆ   rÀ  rú  Únous_credential_refreshr,  T)r}  r|  rÎ  r~  r©   r¬   r�   r  r  r�   r6  rÙ   rƒ   rb   rc   r„   r{  r‰  rˆ   rÇ  rë  r*  )rX   r“  r~  rz  ru  r{  rˆ   s          rZ   Ú$_try_refresh_nous_client_credentialsz,AIAgent._try_refresh_nous_client_credentialsb  sÎ  € ØŒ=Ð.Ò.Ð.°$´-À6Ò2IÐ2IØ�5ð
	ØHÐHÐHÐHÐHÐHà4Ð4Ý$'¨­Cµ´	Ð:[Ð]cÑ0dÔ0dÑ,eÔ,eÑ$fÔ$fÝ %¥b¤iÐ0MÈtÑ&TÔ&TÑ UÔ UØ ðñ ô ˆEˆEøõ
 ð 	ð 	ð 	Ý�LŠLÐ=¸sÑCÔCÐCØ�5�5�5�5�5øøøøð	øøøð —)’)˜IÑ&Ô&ˆØ—9’9˜ZÑ(Ô(ˆÝ˜'¥3Ñ'Ô'ð 	¨w¯}ª}©¬ð 	Ø�5Ý˜(¥CÑ(Ô(ð 	°·²Ñ0@Ô0@ð 	Ø�5à—}’}‘”ˆŒØ ŸšÑ(Ô(×/Ò/°Ñ4Ô4ˆŒØ)-¬ˆÔ˜IÑ&Ø*.¬-ˆÔ˜JÑ'àÔ×ÒÐ 1°4Ñ8Ô8Ð8à×2Ò2Ð:SÐ2ÑTÔTð 	Ø�5àˆts   šA"A= Á=
B-ÂB(Â(B-c                 ó0  — | j         dk    rdS 	 ddlm}  |¦   «         \  }}n3# t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY wt          |t          ¦  «        r|                     ¦   «         sdS |                     ¦   «         }|| _	        | j	        | j
        d<   | j        | j
        d<   |                      t          | j        pd	¦  «        ¦  «         |                      d
¬¦  «        sdS t                               d|¦  «         dS )a]  Refresh Copilot credentials and rebuild the shared OpenAI client.

        Copilot tokens may remain the same string across refreshes (`gh auth token`
        returns a stable OAuth token in many setups). We still rebuild the client
        on 401 so retries recover from stale auth/client state without requiring
        a session restart.
        rö  Fr   )Úresolve_copilot_tokenz%Copilot credential refresh failed: %sNr{  rˆ   r€   Úcopilot_credential_refreshr,  z%Copilot credentials refreshed from %sT)r|  Úhermes_cli.copilot_authr‰  r�   r6  rÙ   rb   rc   r„   r{  rÇ  rˆ   Ú"_apply_client_headers_for_base_urlr*  rµ  )rX   r‰  Ú	new_tokenÚtoken_sourceru  s        rZ   Ú'_try_refresh_copilot_client_credentialsz/AIAgent._try_refresh_copilot_client_credentials…  s=  € ð Œ=˜IÒ%Ð%Ø�5ð	ØEÐEÐEÐEÐEÐEà&;Ð&;Ñ&=Ô&=Ñ#ˆI�|�|øÝð 	ð 	ð 	Ý�LŠLÐ@À#ÑFÔFÐFØ�5�5�5�5�5øøøøð	øøøõ ˜)¥SÑ)Ô)ð 	°·²Ñ1BÔ1Bð 	Ø�5à—O’OÑ%Ô%ˆ	à ˆŒØ)-¬ˆÔ˜IÑ&Ø*.¬-ˆÔ˜JÑ'Ø×/Ò/µ°D´MÐ4GÀRÑ0HÔ0HÑIÔIÐIà×2Ò2Ð:VÐ2ÑWÔWð 	Ø�5å�ŠÐ;¸\ÑJÔJÐJØˆts   �# £
A­AÁAc                 ó:  — | j         dk    st          | d¦  «        sdS | j        dk    rdS t          | dd¦  «        pd}d|v rdS 	 dd	lm}m}  |¦   «         }n3# t          $ r&}t           	                    d
|¦  «         Y d }~dS d }~ww xY wt          |t          ¦  «        r|                     ¦   «         sdS |                     ¦   «         }|| j        k    rdS 	 | j                             ¦   «          n# t          $ r Y nw xY w	  ||t          | dd ¦  «        t!          | j        | j        ¦  «        ¬¦  «        | _        n3# t          $ r&}t                               d|¦  «         Y d }~dS d }~ww xY w|| _        ddlm} | j        dk    r ||¦  «        nd| _        dS )Nr¸  rÄ  Fr¾  rÅ  r€   z	azure.comr   )rÝ  rÜ  z'Anthropic credential refresh failed: %srã  z?Failed to rebuild Anthropic client after credential refresh: %srá  T)r}  r�  r|  ro   rÁ  rÝ  rÜ  r�   r6  rÙ   rb   rc   r„   rÄ  r¿  ry  r   r‚  r7  râ  rÀ  )rX   Ú_baserÝ  rÜ  r�  ru  râ  s          rZ   Ú)_try_refresh_anthropic_client_credentialsz1AIAgent._try_refresh_anthropic_client_credentials¨  s+  € ØŒ=Ð0Ò0Ð0½ÀÐFZÑ8[Ô8[Ð0Ø�5ð Œ=˜KÒ'Ð'Ø�5õ ˜Ð3°RÑ8Ô8Ð>¸BˆØ˜%ÐÐØ�5ð	Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_à/Ð/Ñ1Ô1ˆIˆIøÝð 	ð 	ð 	Ý�LŠLÐBÀCÑHÔHÐHØ�5�5�5�5�5øøøøð	øøøõ ˜)¥SÑ)Ô)ð 	°·²Ñ1BÔ1Bð 	Ø�5Ø—O’OÑ%Ô%ˆ	Ø˜Ô/Ò/Ð/Ø�5ð	ØÔ"×(Ò(Ñ*Ô*Ð*Ð*øÝð 	ð 	ð 	ØˆDð	øøøð	Ø%;Ð%;ØÝ˜Ð3°TÑ:Ô:Ý4°T´]ÀDÄJÑOÔOð&ñ &ô &ˆDÔ"Ð"øõ
 ð 	ð 	ð 	Ý�NŠNÐ\Ð^aÑbÔbÐbØ�5�5�5�5�5øøøøð	øøøð #,ˆÔð
 	<Ð;Ð;Ð;Ð;Ð;ØAEÄÐR]ÒA]ÐA] ? ?°9Ñ#=Ô#=Ð#=ÐchˆÔ ØˆtsB   ÁA Á
BÁ"BÂBÃC2 Ã2
C?Ã>C?Ä:D> Ä>
E.ÅE)Å)E.c                 ó¨  — ddl m}m} t          |d¦  «        rt	          |¦  «        | j        d<   d S t          |d¦  «        rt	          |¦  «        | j        d<   d S t          |d¦  «        rt          ¦   «         | j        d<   d S t          |d¦  «        rddlm}  |¦   «         | j        d<   d S t          |d	¦  «        rd
di| j        d<   d S t          |d¦  «        rt          ¦   «         | j        d<   d S t          |d¦  «        r4ddl m
}  || j                             dd¦  «        ¦  «        | j        d<   d S | j                             dd ¦  «         d S )Nr   )Ú_AI_GATEWAY_HEADERSÚ_OR_HEADERSrù  rú  úai-gateway.vercel.shrû  rü  rý  rÿ  rZ  r   r  r»  r  r{  r€   )rÌ  r”  r•  rN   rÚ   rÇ  r]  rË  rþ  rn  r  rƒ   rë  )rX   rˆ   r”  r•  rþ  r  s         rZ   rŒ  z*AIAgent._apply_client_headers_for_base_urlÛ  s½  € ØKÐKÐKÐKÐKÐKÐKÐKå  ¨?Ñ;Ô;ð 	=Ý59¸+Ñ5FÔ5FˆDÔÐ 1Ñ2Ð2Ð2Ý" 8Ð-CÑDÔDð 	=Ý59Ð:MÑ5NÔ5NˆDÔÐ 1Ñ2Ð2Ð2Ý" 8Ð-AÑBÔBð 	=Ý5HÑ5JÔ5JˆDÔÐ 1Ñ2Ð2Ð2Ý" 8Ð-DÑEÔEð 	=ØAÐAÐAÐAÐAÐAà5LÐ5LÑ5NÔ5NˆDÔÐ 1Ñ2Ð2Ð2Ý" 8¨^Ñ<Ô<ð 
	=Ø6BÐDWÐ5XˆDÔÐ 1Ñ2Ð2Ð2Ý" 8Ð-=Ñ>Ô>ð 	=Ý5IÑ5KÔ5KˆDÔÐ 1Ñ2Ð2Ð2Ý" 8¨]Ñ;Ô;ð 	=ØHÐHÐHÐHÐHÐHØ5NÐ5NØÔ#×'Ò'¨	°2Ñ6Ô6ñ6ô 6ˆDÔÐ 1Ñ2Ð2Ð2ð Ô×#Ò#Ð$5°tÑ<Ô<Ð<Ð<Ð<r\   c                 óð  — t          |dd ¦  «        pt          |dd¦  «        }t          |dd ¦  «        pt          |dd ¦  «        p| j        }| j        dk    r™ddlm}m} 	 | j                             ¦   «          n# t          $ r Y nw xY w|| _	        || _
         |||t          | j        | j        ¦  «        ¬	¦  «        | _        | j        d
k    r ||¦  «        nd| _        || _        || _        d S || _        t!          |t"          ¦  «        r|                     d¦  «        n|| _        | j        | j        d<   | j        | j        d<   |                      | j        ¦  «         |                      d¬¦  «         d S )NÚruntime_api_keyÚaccess_tokenr€   Úruntime_base_urlrˆ   r¸  r   )rÜ  râ  rã  r¾  FrÀ  r{  Úcredential_rotationr,  )ro   rˆ   r}  rÁ  rÜ  râ  r¿  ry  r�   rÄ  rÅ  r   r|  r‚  rÀ  r{  rb   rc   r‰  rÇ  rŒ  r*  )rX   r‚  Úruntime_keyÚruntime_baserÜ  râ  s         rZ   Ú_swap_credentialzAIAgent._swap_credentialô  s¹  € Ý˜eÐ%6¸Ñ=Ô=ÐcÅÈÐP^Ð`bÑAcÔAcˆÝ˜uÐ&8¸$Ñ?Ô?ÐtÅ7È5ÐR\Ð^bÑCcÔCcÐtÐgkÔgtˆàŒ=Ð0Ò0Ð0ØWÐWÐWÐWÐWÐWÐWÐWðØÔ&×,Ò,Ñ.Ô.Ð.Ð.øÝð ð ð Ø�ðøøøð '2ˆDÔ#Ø'3ˆDÔ$Ø%;Ð%;Ø˜\Ý4°T´]ÀDÄJÑOÔOð&ñ &ô &ˆDÔ"ð HLÄ}ÐXcÒGcÐGc  °{Ñ'CÔ'CÐ'CÐinˆDÔ$Ø&ˆDŒLØ(ˆDŒMØˆFà"ˆŒÝ4>¸|ÍSÑ4QÔ4QÐc˜×+Ò+¨CÑ0Ô0Ð0ÐWcˆŒØ)-¬ˆÔ˜IÑ&Ø*.¬-ˆÔ˜JÑ'Ø×/Ò/°´Ñ>Ô>Ð>Ø×+Ò+Ð3HÐ+ÑIÔIÐIÐIÐIs   Á A: Á:
BÂB)Úclassified_reasonÚerror_contextrÃ  Úhas_retried_429rŸ  r   c          	      ó  — | j         }|€d|fS |}|€6|dk    rt          j        }n#|dk    rt          j        }n|dv rt          j        }|t          j        k    re|�|nd}|                     ||¬¦  «        }|�Bt                               d|t          |dd	¦  «        ¦  «         |  	                    |¦  «         d
S d|fS |t          j        k    rg|sdS |�|nd}|                     ||¬¦  «        }|�Bt                               d|t          |dd	¦  «        ¦  «         |  	                    |¦  «         d
S dS |t          j        k    r¼| 
                    ¦   «         }	|	�Et                               dt          |	dd	¦  «        › �¦  «         |  	                    |	¦  «         d|fS |�|nd}|                     ||¬¦  «        }|�Bt                               d|t          |dd	¦  «        ¦  «         |  	                    |¦  «         d
S d|fS )aÌ  Attempt credential recovery via pool rotation.

        Returns (recovered, has_retried_429).
        On rate limits: first occurrence retries same credential (sets flag True).
                        second consecutive failure rotates to next credential.
        On billing exhaustion: immediately rotates.
        On auth failures: attempts token refresh before rotating.

        `classified_reason` lets the recovery path honor the structured error
        classifier instead of relying only on raw HTTP codes. This matters for
        providers that surface billing/rate-limit/auth conditions under a
        different status code, such as Anthropic returning HTTP 400 for
        "out of extra usage".
        NFi’  é­  )é‘  i“  )rÃ  r   u4   Credential %s (billing) â€” rotated to pool entry %sr  r%  rß  )FTu7   Credential %s (rate limit) â€” rotated to pool entry %su1   Credential auth failure â€” refreshed pool entry Tr¤  u@   Credential %s (auth refresh failed) â€” rotated to pool entry %s)rˆ  r#   ÚbillingÚ
rate_limitÚauthÚmark_exhausted_and_rotater6  rµ  ro   rž  Útry_refresh_current)
rX   rÃ  r¡  rŸ  r   ra  Úeffective_reasonÚrotate_statusÚ
next_entryÚ	refresheds
             rZ   Ú_recover_with_credential_poolz%AIAgent._recover_with_credential_pool  sx  € ð, Ô$ˆØˆ<Ø˜/Ð)Ð)à,ÐØÐ#Ø˜cÒ!Ð!Ý#1Ô#9Ð Ð Ø Ò#Ð#Ý#1Ô#<Ð Ð Ø 
Ð*Ð*Ý#1Ô#6Ð à�~Ô5Ò5Ð5Ø+6Ð+B˜K˜KÈˆMØ×7Ò7ÀMÐanÐ7ÑoÔoˆJØÐ%Ý—’ØJØ!Ý˜J¨¨cÑ2Ô2ñô ð ð
 ×%Ò% jÑ1Ô1Ð1Ø"�{Ø˜/Ð)Ð)à�~Ô8Ò8Ð8Ø"ð #Ø"�{Ø+6Ð+B˜K˜KÈˆMØ×7Ò7ÀMÐanÐ7ÑoÔoˆJØÐ%Ý—’ØMØ!Ý˜J¨¨cÑ2Ô2ñô ð ð
 ×%Ò% jÑ1Ô1Ð1Ø"�{Ø�;à�~Ô2Ò2Ð2Ø×0Ò0Ñ2Ô2ˆIØÐ$Ý—’ÐoÕPWÐXaÐcgÐilÑPmÔPmÐoÐoÑpÔpÐpØ×%Ò% iÑ0Ô0Ð0Ø˜_Ð,Ð,ð ,7Ð+B˜K˜KÈˆMØ×7Ò7ÀMÐanÐ7ÑoÔoˆJØÐ%Ý—’ØVØ!Ý˜J¨¨cÑ2Ô2ñô ð ð
 ×%Ò% jÑ1Ô1Ð1Ø"�{à�oÐ%Ð%r\   c                 ón   — | j         dk    r|                      ¦   «           | j        j        j        di |¤ŽS )Nr¸  rw   )r}  r’  r¿  r
  rp  )rX   rî  s     rZ   Ú_anthropic_messages_createz"AIAgent._anthropic_messages_createf  sA   € ØŒ=Ð0Ò0Ð0Ø×:Ò:Ñ<Ô<Ð<Ø5ˆtÔ%Ô.Ô5ÐCÐC¸
ÐCÐCÐCr\   c                 ó  — t          | dd¦  «        dk    r+ddlm} t          | dd¦  «        pd} ||¦  «        | _        dS ddlm}  || j        t          | d	d¦  «        t          | j        | j        ¦  «        ¬
¦  «        | _        dS )uY  Rebuild the Anthropic client after an interrupt or stale call.

        Handles both direct Anthropic and Bedrock-hosted Anthropic models
        correctly â€” rebuilding with the Bedrock SDK when provider is bedrock,
        rather than always falling back to build_anthropic_client() which
        requires a direct Anthropic API key.
        r|  NrÂ  r   rÞ  rÃ  rà  ©rÜ  rÅ  rã  )	ro   rÁ  rß  r¿  rÜ  rÄ  r   r|  r‚  )rX   rß  ÚregionrÜ  s       rZ   Ú_rebuild_anthropic_clientz!AIAgent._rebuild_anthropic_clientk  s¶   € õ �4˜ TÑ*Ô*¨iÒ7Ð7ØNÐNÐNÐNÐNÐNÝ˜TÐ#4°kÑBÔBÐQÀkˆFØ%CÐ%CÀFÑ%KÔ%KˆDÔ"Ð"Ð"àFÐFÐFÐFÐFÐFØ%;Ð%;ØÔ'Ý˜Ð3°TÑ:Ô:Ý4°T´]ÀDÄJÑOÔOð&ñ &ô &ˆDÔ"Ð"Ð"r\   c           	      óö  ‡ ‡‡‡— dddœŠddiŠˆˆˆˆ fd„}‰                       ‰                     dg ¦  «        ¦  «        }t          j        ¦   «         }‰                      d¦  «         t	          j        |d¬¦  «        }|                     ¦   «          d	}|                     ¦   «         �r»|                     d
¬¦  «         |dz  }|dz  d	k    r<t          j        ¦   «         |z
  }‰                      dt          |¦  «        › d�¦  «         t          j        ¦   «         |z
  }||k    �ršt          d„ ‰                     dg ¦  «        D ¦   «         ¦  «        dz  }t                               d||‰                     dd¦  «        |d›¦  «         ‰                      dt          |¦  «        › d‰                     dd¦  «        › d�¦  «         	 ‰ j        dk    r.‰ j                             ¦   «          ‰                      ¦   «          n.‰                     d¦  «        }	|	�‰                      |	d¬¦  «         n# t&          $ r Y nw xY w‰                      dt          |¦  «        › d�¦  «         |                     d¬¦  «         ‰d         €;‰d          €3t)          d!t          |¦  «        › d"t          |¦  «        › d#�¦  «        ‰d<   n¤‰ j        rˆ	 ‰ j        dk    r.‰ j                             ¦   «          ‰                      ¦   «          n.‰                     d¦  «        }
|
�‰                      |
d$¬¦  «         n# t&          $ r Y nw xY wt-          d%¦  «        ‚|                     ¦   «         �°»‰d         �‰d         ‚‰d          S )&ae  
        Run the API call in a background thread so the main conversation loop
        can detect interrupts without waiting for the full HTTP round-trip.

        Each worker thread gets its own OpenAI client instance. Interrupts only
        close that worker-local client, so retries and other requests never
        inherit a closed transport.

        Includes a stale-call detector: if no response arrives within the
        configured timeout, the connection is killed and an error raised so
        the main retry loop can try again with backoff / credential rotation /
        provider fallback.
        N©rÙ  rÀ  rÆ  c            	      óš  •— 	 ‰j         dk    rJ‰                     d¬¦  «        ‰d<   ‰                     ‰
‰d         t          ‰dd ¦  «        ¬¦  «        ‰d<   nò‰j         dk    r‰                     ‰
¦  «        ‰d<   nÎ‰j         d	k    rŠd
dlm} m}m}m	} ‰
 
                    dd¦  «        }‰
 
                    dd ¦  «          | |¦  «        }	  |j        di ‰
¤Ž}n)# t          $ r} ||¦  «        r ||¦  «         ‚ d }~ww xY w ||¦  «        ‰d<   n9‰                     d¬¦  «        ‰d<    ‰d         j        j        j        di ‰
¤Ž‰d<   n# t          $ r}|‰d<   Y d }~nd }~ww xY w‰                     d¦  «        }	|	�‰                     |	d¬¦  «         d S d S # ‰                     d¦  «        }	|	�‰                     |	d¬¦  «         w w xY w)Nrµ  Úcodex_stream_requestr,  rÆ  Ú_codex_on_first_delta)rÆ  r=  rÙ  r¸  r¶  r   )Ú_get_bedrock_runtime_clientÚinvalidate_runtime_clientÚis_stale_connection_errorÚnormalize_converse_responseÚ__bedrock_region__rà  Ú__bedrock_converse__Úchat_completion_requestrÀ  Úrequest_completerw   )r}  r:  ri  ro   r°  Úagent.bedrock_adapterrº  r»  r¼  r½  rë  Úconverser�   ÚchatÚcompletionsrp  rƒ   r<  )rº  r»  r¼  r½  r³  rÆ  Úraw_responseÚ_bedrock_excrA  Úrequest_clientrî  Úrequest_client_holderÚresultrX   s             €€€€rZ   Ú_callz.AIAgent._interruptible_api_call.<locals>._call�  s¡  ø€ ð)aØ”=Ð$5Ò5Ð5Ø6:×6XÒ6XÐ`vÐ6XÑ6wÔ6wÐ)¨(Ñ3Ø)-×)?Ò)?Ø"Ø4°XÔ>Ý'.¨tÐ5LÈdÑ'SÔ'Sð *@ñ *ô *�F˜:Ñ&Ð&ð
 ”]Ð&:Ò:Ð:Ø)-×)HÒ)HÈÑ)TÔ)T�F˜:Ñ&Ð&Ø”]Ð&8Ò8Ð8ð
ð ð ð ð ð ð ð ð ð ð ð ð (Ÿ^š^Ð,@À+ÑNÔN�FØ—N’NÐ#9¸4Ñ@Ô@Ð@Ø8Ð8¸Ñ@Ô@�FðØ'6 v¤Ð'DÐ'D¸Ð'DÐ'D˜˜øÝ$ð ð ð ð 5Ð4°\ÑBÔBð >Ø5Ð5°fÑ=Ô=Ð=Øøøøøðøøøð *EÐ)DÀ\Ñ)RÔ)R�F˜:Ñ&Ð&à6:×6XÒ6XÐ`yÐ6XÑ6zÔ6zÐ)¨(Ñ3Ø)`Ð)>¸xÔ)HÔ)MÔ)YÔ)`Ð)nÐ)nÐcmÐ)nÐ)n�F˜:Ñ&øøÝð $ð $ð $Ø"#��w‘�����øøøøð$øøøð "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐM_Ð5Ñ`Ô`Ð`Ð`Ð`ð .Ð-øð "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐM_Ð5Ñ`Ô`Ð`Ð`ð .øøøsU   ƒCE ÃC ÃE Ã
C?Ã#C:Ã:C?Ã?AE Å
F Å
E$ÅEÅF ÅE$Å$F Æ1G
r
  z&waiting for non-streaming API responseTrÎ  r   ç333333Ó?rã  r¢   rz  z$waiting for non-streaming response (z
s elapsed)c              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S rg   rÒ  rÓ  s     rZ   rÎ   z2AIAgent._interruptible_api_call.<locals>.<genexpr>Ü  ó.   è è € ÐSÐS¨q�s¥3 q¡6¤6™{œ{ÐSÐSÐSÐSÐSÐSr\   rÔ  zjNon-streaming API call stale for %.0fs (threshold %.0fs). model=%s context=~%s tokens. Killing connection.r‚  ro  r,  õ%   âš ï¸� No response from provider for zs (non-streaming, model: z). Aborting call.r¸  Ústale_call_killr,  z&stale non-streaming call killed after r¾  ç       @rÀ  rÙ  z'Non-streaming API call timed out after zs with no response (threshold: ús)Úinterrupt_abortz!Agent interrupted during API call)rÛ  rƒ   r­  r4  rž   r“  r”  Úis_aliver  r¬   r×  r6  r7  r¤  r}  r¿  ry  r´  r<  r�   ÚTimeoutErrorr—  rO  )rX   rî  rË  Ú_stale_timeoutÚ_call_startrD  Ú_poll_countÚ_elapsedÚ_est_ctxÚrcrÈ  rÉ  rÊ  s   ``         @@rZ   Ú_interruptible_api_callzAIAgent._interruptible_api_call  s.  øøøø€ ð #¨TÐ2Ð2ˆØ!)¨4Ð 0Ðð*	að *	að *	að *	að *	að *	að *	að *	aðd ×?Ò?Ø�NŠN˜: rÑ*Ô*ñ
ô 
ˆõ ”i‘k”kˆØ×ÒÐEÑFÔFÐFåÔ E°$Ð7Ñ7Ô7ˆØ	�Š‰	Œ	ˆ	ØˆØ�jŠj‰lŒlñ @	LØ�FŠF˜3ˆFÑÔÐØ˜1ÑˆKð ˜SÑ  AÒ%Ð%Ýœ9™;œ;¨Ñ4�Ø×$Ò$ØT½3¸x¹=¼=ÐTÐTÐTñô ð õ ”y‘{”{ [Ñ0ˆHØ˜.Ò(Ñ(ÝÐSÐS°J·N²NÀ:ÈrÑ4RÔ4RÐSÑSÔSÑSÔSÐWXÑX�Ý—’ðGà˜nØ—N’N 7¨IÑ6Ô6¸8¸¸ñ	ô ð ð ×!Ò!ð&½CÀ¹M¼Mð &ð &Ø.8¯nªn¸WÀiÑ.PÔ.Pð&ð &ð &ñô ð ð
	Ø”}Ð(<Ò<Ð<ØÔ.×4Ò4Ñ6Ô6Ð6Ø×6Ò6Ñ8Ô8Ð8Ð8à2×6Ò6°xÑ@Ô@˜Ø˜>Ø ×=Ò=¸bÐIZÐ=Ñ[Ô[Ð[øøÝ ð ð ð Ø�Dðøøøà×$Ò$ØM½SÀ¹]¼]ÐMÐMÐMñô ð ð —’˜s�Ñ#Ô#Ð#Ø˜'”?Ð*¨v°jÔ/AÐ/IÝ&2ðPÅ#ÀhÁ-Ä-ð Pð PÝ8;¸NÑ8KÔ8KðPð Pð Pñ'ô '�F˜7‘Oð àÔ(ð Lð	Ø”}Ð(<Ò<Ð<ØÔ.×4Ò4Ñ6Ô6Ð6Ø×6Ò6Ñ8Ô8Ð8Ð8à)>×)BÒ)BÀ8Ñ)LÔ)L˜Ø)Ð5Ø ×=Ò=¸nÐUfÐ=ÑgÔgÐgøøÝ ð ð ð Ø�Dðøøøå&Ð'JÑKÔKÐKðA �jŠj‰lŒlñ @	LðB �'Œ?Ð&Ø˜”/Ð!Ø�jÔ!Ð!s&   ÇA'H/ È/
H<È;H<ËA'L/ Ì/
L<Ì;L<c                 ó   — d| _         dS )zDReset tracking for text delivered during the current model response.r€   N)r»  ri   s    rZ   Ú_reset_stream_delivery_trackingz'AIAgent._reset_stream_delivery_tracking  s   € à02ˆÔ-Ð-Ð-r\   c                 ón   — t          |t          ¦  «        r|rt          | dd¦  «        |z   | _        dS dS dS )zCAccumulate visible assistant text emitted through stream callbacks.r»  r€   N)rb   rc   ro   r»  )rX   r÷   s     rZ   Ú_record_streamed_assistant_textz'AIAgent._record_streamed_assistant_text  sR   € å�d�CÑ Ô ð 	 Tð 	å˜Ð@À"ÑEÔEÈÑLð Ô1Ð1Ð1ð	ð 	ð 	ð 	r\   c                 ó€   — t          | t          ¦  «        sdS t          j        dd| ¦  «                             ¦   «         S )Nr€   z\s+r´  )rb   rc   r;  rû   r„   rü   s    rZ   Ú_normalize_interim_visible_textz'AIAgent._normalize_interim_visible_text  s9   € å˜$¥Ñ$Ô$ð 	Ø�2ÝŒv�f˜c 4Ñ(Ô(×.Ò.Ñ0Ô0Ð0r\   c           	      óú   — |                       |                      |pd¦  «        ¦  «        }|sdS |                       |                      t          | dd¦  «        pd¦  «        ¦  «        }t          |¦  «        o||k    S )Nr€   Fr»  )râ  rý  ro   r­   )rX   r  Úvisible_contentÚstreameds       rZ   Ú_interim_content_was_streamedz%AIAgent._interim_content_was_streamed$  s�   € Ø×>Ò>Ø×$Ò$ W ]°Ñ3Ô3ñ
ô 
ˆð ð 	Ø�5Ø×7Ò7Ø×$Ò$¥W¨TÐ3UÐWYÑ%ZÔ%ZÐ%`Ð^`ÑaÔañ
ô 
ˆõ �H‰~Œ~Ð= (¨oÒ"=Ð=r\   Úassistant_msgc                 óŠ  — t          | dd¦  «        }|�t          |t          ¦  «        sdS |                     d¦  «        }|                      |pd¦  «                             ¦   «         }|r|dk    rdS |                      |¦  «        }	  |||¬¦  «         dS # t          $ r  t           	                    dd¬	¦  «         Y dS w xY w)
zESurface a real mid-turn assistant commentary message to the UI layer.rœ  Nr  r€   ú(empty))Úalready_streamedz interim_assistant_callback errorTr   )
ro   rb   rÚ   rƒ   rý  r„   ræ  r�   r6  rÙ   )rX   rç  Úcbr  Úvisiblerê  s         rZ   Ú_emit_interim_assistant_messagez'AIAgent._emit_interim_assistant_message/  sî   € å�TÐ7¸Ñ>Ô>ˆØˆ:�Z¨µtÑ<Ô<ˆ:ØˆFØ×#Ò# IÑ.Ô.ˆØ×*Ò*¨7¨=°bÑ9Ô9×?Ò?ÑAÔAˆØð 	˜' YÒ.Ð.ØˆFØ×=Ò=¸gÑFÔFÐð	LØˆBˆwÐ)9Ð:Ñ:Ô:Ð:Ð:Ð:øÝð 	Lð 	Lð 	LÝ�LŠLÐ;ÀdˆLÑKÔKÐKÐKÐKÐKð	Løøøs   Â	B Â&CÃCc                 ó  — t          | dd¦  «        r"|r |                     ¦   «         rd| _        d|z   }d„ | j        | j        fD ¦   «         }d}|D ] }	  ||¦  «         d}Œ# t
          $ r Y Œw xY w|r|                      |¦  «         dS dS )z;Fire all registered stream delta callbacks (display + TTS).rº  FrK  c                 ó   — g | ]}|®|‘ŒS rg   rw   )rÉ   rë  s     rZ   rË   z.AIAgent._fire_stream_delta.<locals>.<listcomp>G  s   € ÐhÐhÐh˜BÐY[ÐYg�RÐYgÐYgÐYgr\   TN)ro   r„   rº  r›  r¹  r�   rà  )rX   r÷   Ú	callbacksÚ	deliveredrë  s        rZ   rQ  zAIAgent._fire_stream_delta>  s×   € õ �4Ð.°Ñ6Ô6ð 	!¸4ð 	!ÀDÇJÂJÁLÄLð 	!Ø',ˆDÔ$Ø˜D‘=ˆDØhÐh 4Ô#=¸tÔ?TÐ"UÐhÑhÔhˆ	Øˆ	Øð 	ð 	ˆBðØ��4‘”�Ø �	�	øÝð ð ð Ø�ðøøøàð 	7Ø×0Ò0°Ñ6Ô6Ð6Ð6Ð6ð	7ð 	7s   ÁA!Á!
A.Á-A.c                 óV   — | j         }|�	  ||¦  «         dS # t          $ r Y dS w xY wdS )z&Fire reasoning callback if registered.N)r˜  r�   )rX   r÷   rë  s      rZ   rR  zAIAgent._fire_reasoning_deltaR  sN   € àÔ$ˆØˆ>ðØ��4‘”���øÝð ð ð Ø��ðøøøð ˆ>ó   ‹ ˜
&¥&c                 óV   — | j         }|�	  ||¦  «         dS # t          $ r Y dS w xY wdS )a‚  Notify display layer that the model is generating tool call arguments.

        Fires once per tool name when the streaming response begins producing
        tool_call / tool_use tokens.  Gives the TUI a chance to show a spinner
        or status line so the user isn't staring at a frozen screen while a
        large tool payload (e.g. a 45 KB write_file) is being generated.
        N)r�  r�   )rX   rä   rë  s      rZ   Ú_fire_tool_gen_startedzAIAgent._fire_tool_gen_started[  sP   € ð Ô#ˆØˆ>ðØ��9‘”���øÝð ð ð Ø��ðøøøð ˆ>ró  c                 ó:   — | j         dupt          | dd¦  «        duS )z4Return True if any streaming consumer is registered.Nr¹  )r›  ro   ri   s    rZ   r–  zAIAgent._has_stream_consumersj  s/   € ð Ô&¨dÐ2ð CÝ�tÐ/°Ñ6Ô6¸dÐBð	
r\   ©r=  c          	      ó  ‡ ‡‡‡‡‡‡‡‡‡‡‡— ‰ j         dk    r0‰‰ _        	 ‰                      ‰¦  «        d‰ _        S # d‰ _        w xY w‰ j         dk    r²dddœŠddiŠddiŠˆˆfd„Šˆˆˆˆˆ fd	„}t          j        |d
¬¦  «        }|                     ¦   «          |                     ¦   «         r@|                     d¬¦  «         ‰ j        rt          d¦  «        ‚|                     ¦   «         °@‰d         �‰d         ‚‰d         S ddg dœŠddiŠddiŠddiŠdt          j
        ¦   «         iŠˆˆfd„Šˆˆˆˆˆˆˆ fd„Šˆˆˆˆˆ fd„Šˆˆˆˆˆˆˆ fd„}t          t          j        dd¦  «        ¦  «        }|dk    rK‰ j        rDt          ‰ j        ¦  «        r0t          d¦  «        }t                                d‰ j        ¦  «         n`t%          d„ ‰                     dg ¦  «        D ¦   «         ¦  «        dz  }|dk    rt)          |d ¦  «        }n|d!k    rt)          |d"¦  «        }n|}t          j        |d
¬¦  «        }|                     ¦   «          t          j
        ¦   «         }	d#}
|                     ¦   «         �ru|                     d¬¦  «         t          j
        ¦   «         }||	z
  |
k    r3|}	t+          |‰d         z
  ¦  «        }‰                      d$|› d%�¦  «         t          j
        ¦   «         ‰d         z
  }||k    �rIt%          d&„ ‰                     dg ¦  «        D ¦   «         ¦  «        dz  }t                                d'||‰                     d(d)¦  «        |d*›¦  «         ‰                      d+t+          |¦  «        › d,‰                     d(d)¦  «        › d-|d*›d.�¦  «         	 ‰                     d¦  «        }|�‰                      |d/¬0¦  «         n# t4          $ r Y nw xY w	 ‰                      d1¬0¦  «         n# t4          $ r Y nw xY wt          j
        ¦   «         ‰d<   ‰                      d2t+          |¦  «        › d3�¦  «         ‰ j        rˆ	 ‰ j         d4k    r.‰ j                             ¦   «          ‰                      ¦   «          n.‰                     d¦  «        }|�‰                      |d5¬0¦  «         n# t4          $ r Y nw xY wt          d6¦  «        ‚|                     ¦   «         �°u‰d         ��…‰d         �rtt?          ‰ d7d8¦  «        pd8                      ¦   «         pd}tC          ‰                     d9¦  «        pg ¦  «        }|r°d:                     |dd;…         ¦  «        }tE          |¦  «        d;k    r|d<tE          |¦  «        d;z
  › d=�z  }d>|› d?�}|pd8|z   }	 ‰  #                    |¦  «         n# t4          $ r Y nw xY wt                                d@|tE          |pd8¦  «        ‰d         ¦  «         n1t                                dAtE          |pd8¦  «        ‰d         ¦  «         tI          dB|dd¬C¦  «        }tI          dDt?          ‰ d(d)¦  «        tI          dE|dF¬G¦  «        gd¬H¦  «        S ‰d         ‚‰d         S )Iu  Streaming variant of _interruptible_api_call for real-time token delivery.

        Handles all three api_modes:
        - chat_completions: stream=True on OpenAI-compatible endpoints
        - anthropic_messages: client.messages.stream() via Anthropic SDK
        - codex_responses: delegates to _run_codex_stream (already streaming)

        Fires stream_delta_callback and _stream_callback for each text token.
        Tool-call turns suppress the callback â€” only text-only final responses
        stream to the consumer.  Returns a SimpleNamespace that mimics the
        non-streaming response shape so the rest of the agent loop is unchanged.

        Falls back to _interruptible_api_call on provider errors indicating
        streaming is not supported.
        rµ  Nr¶  r¶  ÚdoneFrO  c                  óf   •— ‰ d         s%‰r%d‰ d<   	  ‰¦   «          d S # t           $ r Y d S w xY wd S d S ©Nrù  T©r�   ©r\  r=  s   €€rZ   Ú_fire_firstz>AIAgent._interruptible_streaming_api_call.<locals>._fire_first•  sq   ø€ Ø(¨Ô0ð °^ð Ø04Ð% fÑ-ðØ&˜Ñ(Ô(Ð(Ð(Ð(øÝ$ð ð ð Ø˜˜ðøøøð	ð ð ð ó   ’
 ž
,«,c                  óØ  •— 	 ddl m} m}m}m} ‰                     dd¦  «        }‰                     dd ¦  «          | |¦  «        }	  |j        di ‰¤Ž}n)# t          $ r} ||¦  «        r ||¦  «         ‚ d }~ww xY wˆˆˆfd„}ˆˆfd„}	ˆˆfd„}
 ||‰                     ¦   «         r|nd |	‰j	        s‰j
        r|
nd ˆfd	„¬
¦  «        ‰d<   d S # t          $ r}|‰d<   Y d }~d S d }~ww xY w)Nr   )rº  r»  r¼  Ústream_converse_with_callbacksr¾  rà  r¿  c                 óP   •—  ‰¦   «          ‰                      | ¦  «         d‰d<   d S )NTrO  )rQ  )r÷   rþ  Údeltas_were_sentrX   s    €€€rZ   Ú_on_textzRAIAgent._interruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_text±  s3   ø€ Ø#˜™œ˜Ø×/Ò/°Ñ5Ô5Ð5Ø26Ð(¨Ñ/Ð/Ð/r\   c                 óF   •—  ‰¦   «          ‰                      | ¦  «         d S rg   )rõ  )rp   rþ  rX   s    €€rZ   Ú_on_toolzRAIAgent._interruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_tool¶  s(   ø€ Ø#˜™œ˜Ø×3Ò3°DÑ9Ô9Ð9Ð9Ð9r\   c                 óF   •—  ‰¦   «          ‰                      | ¦  «         d S rg   )rR  )r÷   rþ  rX   s    €€rZ   Ú_on_reasoningzWAIAgent._interruptible_streaming_api_call.<locals>._bedrock_call.<locals>._on_reasoningº  s(   ø€ Ø#˜™œ˜Ø×2Ò2°4Ñ8Ô8Ð8Ð8Ð8r\   c                  ó   •— ‰ j         S rg   rh  ri   s   €rZ   rÍ  zRAIAgent._interruptible_streaming_api_call.<locals>._bedrock_call.<locals>.<lambda>Ã  s
   ø€ °4Ô3L€ r\   )Úon_text_deltaÚon_tool_startÚon_reasoning_deltaÚon_interrupt_checkrÙ  rÀ  rw   )rÂ  rº  r»  r¼  r  rë  Úconverse_streamr�   r–  r˜  r›  )rº  r»  r¼  r  r³  rÆ  rÆ  rÇ  r  r  r  rA  rþ  rî  r  rÊ  rX   s               €€€€€rZ   Ú_bedrock_callz@AIAgent._interruptible_streaming_api_call.<locals>._bedrock_call�  sä  ø€ ð((ðð ð ð ð ð ð ð ð ð ð ð ð (Ÿ^š^Ð,@À+ÑNÔN�FØ—N’NÐ#9¸4Ñ@Ô@Ð@Ø8Ð8¸Ñ@Ô@�FðØ'= vÔ'=Ð'KÐ'KÀ
Ð'KÐ'K˜˜øÝ$ð ð ð ð 5Ð4°\ÑBÔBð >Ø5Ð5°fÑ=Ô=Ð=Øøøøøðøøøð7ð 7ð 7ð 7ð 7ð 7ð 7ð
:ð :ð :ð :ð :ð :ð9ð 9ð 9ð 9ð 9ð 9ð *HÐ)GØ$Ø26×2LÒ2LÑ2NÔ2NÐ&X h hÐTXØ&.Ø<@Ô<SÐ+{ÐW[ÔWqÐ+{¨=¨=Ðw{Ø+LÐ+LÐ+LÐ+Lð*ñ *ô *�F˜:Ñ&Ð&Ð&øõ !ð (ð (ð (Ø&'�F˜7‘O�O�O�O�O�O�Oøøøøð(øøøs=   ƒAC ÁA ÁC Á
A;ÁA6Á6A;Á;AC Ã
C)ÃC$Ã$C)TrÎ  rÌ  rã  z)Agent interrupted during Bedrock API callrÀ  rÙ  )rÙ  rÀ  Úpartial_tool_namesrÆ  rD  c                  óf   •— ‰ d         s%‰r%d‰ d<   	  ‰¦   «          d S # t           $ r Y d S w xY wd S d S rû  rü  rý  s   €€rZ   Ú_fire_first_deltazDAIAgent._interruptible_streaming_api_call.<locals>._fire_first_deltaÛ  sq   ø€ Ø$ VÔ,ð °ð Ø,0Ð! &Ñ)ðØ"�NÑ$Ô$Ð$Ð$Ð$øÝ ð ð ð Ø�D�Dðøøøð	ð ð ð rÿ  c                  ó`  •— ddl } t          ‰,j        ‰,j        ¦  «        }|�|n!t	          t          j        dd¦  «        ¦  «        }|�|}nft	          t          j        dd¦  «        ¦  «        }|dk    r>‰,j        r7t          ‰,j        ¦  «        r#|}t           
                    d‰,j        |¦  «         i ‰'¥dd	di|                      d
||d
¬¦  «        dœ¥}‰,                     d¬¦  «        ‰*d<   t          j        ¦   «         ‰)d<   ‰,                     d¦  «          ‰*d         j        j        j        d3i |¤Ž}‰,                     t'          |dd¦  «        ¦  «         g }i }t)          ¦   «         }i }	i }
d}d}d}g }d}|D �]§}t          j        ¦   «         ‰)d<   ‰,                     d¦  «         ‰,j        r �nq|j        s=t/          |d¦  «        r|j        r|j        }t/          |d¦  «        r|j        r|j        }Œ||j        d         j        }t/          |d¦  «        r|j        r|j        }t'          |dd¦  «        pt'          |dd¦  «        }|r4|                     |¦  «          ‰&¦   «          ‰,                     |¦  «         |rš|j        r“|                     |j        ¦  «         |s* ‰&¦   «          ‰,                     |j        ¦  «         d‰(d<   nM‰,j        rF	 ‰,                     |j        ¦  «         ‰,                     |j        ¦  «         n# t@          $ r Y nw xY w|�rÂ|j!        �rº|j!        D �]±}|j"        �|j"        nd}|j#        pd}||
vr||
|<   |r)||	v r%||	|         k    rtI          |d¬¦  «        dz   }||
|<   |r||	|<   |
|         }||vr|j#        pdddddœdd œ||<   ||         }|j#        r
|j#        |d!<   |j%        rM|j%        j&        r|j%        j&        |d         d"<   |j%        j'        r |d         d#xx         |j%        j'        z  cc<   t'          |d$d¦  «        }|€,t/          |d%¦  «        r|j(        pi  )                    d$¦  «        }|�)t/          |d&¦  «        r| *                    ¦   «         }||d$<   |d         d"         }|rS||vrO| +                    |¦  «          ‰&¦   «          ‰, ,                    |¦  «         ‰+d'                              |¦  «         �Œ³|j        d         j-        r|j        d         j-        }t/          |d¦  «        r|j        r|j        }�Œ©d .                    |¦  «        pd}d}d(}|rög }t_          |¦  «        D ]ä}||         }|d         d#         }|d         d"         pd)} |rZ| 0                    ¦   «         rF	 tc          j2        |¦  «         n0# tb          j3        $ r ti          || ¦  «        }!|!d*k    r|!}nd}Y nw xY w|                     tk          |d!         |d+         | )                    d$¦  «        tk          |d         d"         |¬¦  «        ¬,¦  «        ¦  «         Œå|pd-}"|rd.}"d .                    |¦  «        pd}#tk          ||||#¬/¦  «        }$tk          d|$|"¬0¦  «        }%tk          d1tm          to          j8        ¦   «         ¦  «        z   ||%g|¬2¦  «        S )4z#Stream a chat completions response.r   NrÆ  rÇ  ÚHERMES_STREAM_READ_TIMEOUTç      ^@uD   Local provider detected (%s) â€” stream read timeout raised to %.0fsTÚinclude_usageç      >@)Úconnectr&  r_   ra  )r—   Ústream_optionsrä  Úchat_completion_stream_requestr,  rÆ  rD  z)waiting for provider response (streaming)rÙ  r”  r@  r‚  rä  rF  rE  rO  r€   r4  )rû  r¢   rÇ   r“  )r  rÛ   rÇ   Úextra_contentr  rp   r×   r  Úmodel_extraÚ
model_dumpr  Fr%  r(  rÛ   )r  rÛ   r  rÇ   r  Úlength©r  r  rà   rF  ©rÕ  r�  r  zstream-©r  r‚  Úchoicesrä  rw   )9rú  r   r|  r‚  r  r�   r  rˆ   r2   r6  rÙ   ÚTimeoutr:  r­  r4  rÄ  rÅ  rp  r:  ro   rŸ  r—  r"  r�  rä  rB  rÞ   rR  r  rQ  r›  rà  r�   rà   rÕ  r  r©   rÇ   rp   r×   r  rƒ   r  r   rõ  r  r  r×  r„   rÕ   rÖ   r9  rG  r   rc   rÛ  rÜ  )-r  Ú_provider_timeout_cfgÚ_base_timeoutÚ_stream_read_timeoutÚstream_kwargsr—   Úcontent_partsÚtool_calls_accÚtool_gen_notifiedÚ_last_id_at_idxÚ_active_slot_by_idxr  Ú
model_namer  rM  Ú	usage_objÚchunkrB  rb  Útc_deltaÚraw_idxÚdelta_idÚnew_slotr  r‚  rÏ  rp   Úfull_contentÚmock_tool_callsÚhas_truncated_tool_argsrÊ   r×   rä   ÚrepairedÚeffective_finish_reasonÚfull_reasoningÚmock_messageÚmock_choicer  rî  r  Úlast_chunk_timerÉ  rÊ  rX   s-                                         €€€€€€€rZ   Ú_call_chat_completionszIAIAgent._interruptible_streaming_api_call.<locals>._call_chat_completionsã  s˜  ø€ à"Ð"Ð"Ð"õ %AÀÄÐPTÔPZÑ$[Ô$[Ð!ð )Ð4ð &Ð%å�2œ9Ð%9¸6ÑBÔBÑCÔCð ð %Ð0Ø'<Ð$Ð$å',­R¬YÐ7SÐUZÑ-[Ô-[Ñ'\Ô'\Ð$ð
 (¨5Ò0Ð0°T´]Ð0ÕGXÐY]ÔYfÑGgÔGgÐ0Ø+8Ð(Ý—L’LØ^ØœÐ';ñô ð ð
Øð
àØ#2°DÐ"9Ø!Ÿ>š>Ø Ø-Ø'Øð	 *ñ ô ð	
ð 
ð 
ˆMð /3×.PÒ.PØ7ð /Qñ /ô /Ð! (Ñ+õ
 $(¤9¡;¤;ˆO˜CÑ Ø× Ò Ð!LÑMÔMÐMØLÐ*¨8Ô4Ô9ÔEÔLÐ]Ð]È}Ð]Ð]ˆFð
 ×%Ò%¥g¨f°jÀ$Ñ&GÔ&GÑHÔHÐHà"$ˆMØ#%ˆNÝ%(¡U¤UÐð
 %'ˆOØ(*ÐØ ˆMØˆJØˆDØ$&ˆOØˆIØð {,ñ {,�Ý'+¤y¡{¤{� Ñ$Ø×$Ò$Ð%@ÑAÔAÐAàÔ,ð Ø‘Eà”}ð Ý˜u gÑ.Ô.ð 1°5´;ð 1Ø%*¤[˜
å˜u gÑ.Ô.ð 0°5´;ð 0Ø$)¤K˜	Øàœ aÔ(Ô.�Ý˜5 'Ñ*Ô*ð -¨u¬{ð -Ø!&¤�Jõ ")¨Ð0CÀTÑ!JÔ!JÐ!oÍgÐV[Ð]hÐjnÑNoÔNo�Ø!ð ?Ø#×*Ò*¨>Ñ:Ô:Ð:Ø%Ð%Ñ'Ô'Ð'Ø×.Ò.¨~Ñ>Ô>Ð>ð ð %˜Uœ]ð %Ø!×(Ò(¨¬Ñ7Ô7Ð7Ø)ð %Ø)Ð)Ñ+Ô+Ð+Ø×/Ò/°´Ñ>Ô>Ð>Ø26Ð(¨Ñ/Ð/ð  Ô5ð %ð%Ø $× :Ò :¸5¼=Ñ IÔ IÐ IØ $× DÒ DÀUÄ]Ñ SÔ SÐ SÐ SøÝ#,ð %ð %ð %Ø $ ð%øøøð ñ ?F˜UÔ-ñ ?FØ$)Ô$4ð >Fñ >F˜Ø4<´NÐ4N (¤. .ÐTU˜Ø#+¤;Ð#4°"˜ð #Ð*=Ð=Ð=Ø;BÐ/°Ñ8à$ðDà '¨?Ð :Ð :Ø (¨O¸GÔ,DÒ DÐ Då'*¨>À2Ð'FÑ'FÔ'FÈÑ'J˜HØ;CÐ/°Ñ8Ø#ð @Ø7?˜O¨GÑ4Ø1°'Ô:˜à nÐ4Ð4à&.¤kÐ&7°RØ(2Ø57ÀbÐ,IÐ,IØ15ð	3ð 3˜N¨3Ñ/ð !/¨sÔ 3˜Ø#œ;ð 6Ø*2¬+˜E $™KØ#Ô,ð ^Ø'Ô0Ô5ð 	Sð =EÔ<MÔ<R  jÔ 1°&Ñ 9Ø'Ô0Ô:ð ^Ø % jÔ 1°+Ð >Ð >Ô >À(ÔBSÔB]Ñ ]Ð >Ð >Ñ >Ý '¨°/À4Ñ HÔ H˜Ø ˜=­W°X¸}Ñ-MÔ-M˜=Ø%-Ô%9Ð%?¸R×$DÒ$DÀ_Ñ$UÔ$U˜EØ Ð,Ý& u¨lÑ;Ô;ð ;Ø(-×(8Ò(8Ñ(:Ô(: Ø5:˜E /Ñ2à$ ZÔ0°Ô8˜Øð F CÐ/@Ð$@Ð$@Ø-×1Ò1°#Ñ6Ô6Ð6Ø-Ð-Ñ/Ô/Ð/Ø ×7Ò7¸Ñ=Ô=Ð=ð #Ð#7Ô8×?Ò?ÀÑEÔEÐEùà”= Ô#Ô1ð CØ$)¤M°!Ô$4Ô$B�Mõ ˜5 'Ñ*Ô*ð ,¨u¬{ð ,Ø %¤�Iùð Ÿ7š7 =Ñ1Ô1Ð9°TˆLØ"ˆOØ&+Ð#Øð  Ø"$�Ý! .Ñ1Ô1ð ð �CØ'¨Ô,�BØ " :¤¨{Ô ;�IØ " :¤¨vÔ 6Ð =¸#�IØ ð ? Y§_¢_Ñ%6Ô%6ð ?ð?Ý œJ yÑ1Ô1Ð1Ð1øÝ#Ô3ð ?ð ?ð ?õ (CÀ9ÈiÑ'XÔ'X˜HØ'¨4Ò/Ð/à,4 	 	ð ;?Ð 7øøð?øøøð $×*Ò*­?Ø˜dœ8Ø œZØ&(§f¢f¨_Ñ&=Ô&=Ý!0Ø!# J¤°Ô!7Ø&/ð"ñ "ô "ð	,ñ ,ô ,ñ ô ð ð ð '4Ð&=°vÐ#Ø&ð 3Ø*2Ð'àŸWšW _Ñ5Ô5Ð=¸ˆNÝ*ØØ$Ø*Ø"0ð	ñ ô ˆLõ *ØØ$Ø5ðñ ô ˆKõ
 #Ø�s¥4¤:¡<¤<Ñ0Ô0Ñ0Ø Ø$˜Øð	ñ ô ð s$   Ë4LÌ
LÌLÖV&Ö&*W×Wc                  ód  •— d} t          j         ¦   «         ‰d<    ‰j        j        j        di ‰¤Ž5 }|D �]O}t          j         ¦   «         ‰d<   ‰                     d¦  «         ‰j        r �nt          |dd¦  «        }|dk    r]t          |dd¦  «        }|rIt          |dd¦  «        dk    r4d	} t          |d
d¦  «        }|r ‰
¦   «          ‰                     |¦  «         Œ¬|dk    r�t          |dd¦  «        }|rŠt          |dd¦  «        }|dk    r;t          |dd¦  «        }|r&| s$ ‰
¦   «          ‰                     |¦  «         d	‰d<   �Œ|dk    r2t          |dd¦  «        }	|	r ‰
¦   «          ‰ 	                    |	¦  «         �ŒQ| 
                    ¦   «         cddd¦  «         S # 1 swxY w Y   dS )a8  Stream an Anthropic Messages API response.

            Fires delta callbacks for real-time token delivery, but returns
            the native Anthropic Message object from get_final_message() so
            the rest of the agent loop (validation, tool extraction, etc.)
            works unchanged.
            FrD  r@  rÛ   NÚcontent_block_startÚcontent_blockÚtool_useTrp   Úcontent_block_deltarB  Ú
text_deltar÷   r€   rO  Úthinking_deltarI  rw   )r­  r¿  r
  r—   r4  r—  ro   rõ  rQ  rR  Úget_final_message)Úhas_tool_user—   r_  r`  rP  rä   rB  Ú
delta_typer÷   Úthinking_textr  rî  r  r<  rX   s             €€€€€rZ   Ú_call_anthropiczBAIAgent._interruptible_streaming_api_call.<locals>._call_anthropicß  sc  ø€ ð !ˆLõ $(¤9¡;¤;ˆO˜CÑ à7�Ô'Ô0Ô7ÐEÐE¸*ÐEÐEð *2ÈØ#ð &Nñ &N�Eõ ,0¬9©;¬;�O CÑ(Ø×(Ò(Ð)DÑEÔEÐEàÔ0ð Ø™å!(¨°¸Ñ!=Ô!=�Jà!Ð%:Ò:Ð:Ý '¨¨ÀÑ EÔ E˜Ø ð G¥W¨U°F¸DÑ%AÔ%AÀZÒ%OÐ%OØ+/˜LÝ(/°°v¸tÑ(DÔ(D˜IØ(ð GØ 1Ð 1Ñ 3Ô 3Ð 3Ø $× ;Ò ;¸IÑ FÔ FÐ Føà#Ð'<Ò<Ð<Ý '¨¨w¸Ñ =Ô =˜Ø ð NÝ)0°¸ÀÑ)EÔ)E˜JØ)¨\Ò9Ð9Ý'.¨u°f¸bÑ'AÔ'A Ø#'ð !C°ð !CØ$5Ð$5Ñ$7Ô$7Ð$7Ø$(×$;Ò$;¸DÑ$AÔ$AÐ$AØ>BÐ$4°UÑ$;ùØ!+Ð/?Ò!?Ð!?Ý07¸¸zÈ2Ñ0NÔ0N Ø#0ð !NØ$5Ð$5Ñ$7Ô$7Ð$7Ø$(×$>Ò$>¸}Ñ$MÔ$MÐ$Mùð ×/Ò/Ñ1Ô1ðU*2ð *2ð *2ð *2ñ *2ô *2ð *2ð *2ð *2ð *2ð *2ð *2øøøð *2ð *2ð *2ð *2ð *2ð *2s   ±E'F%Æ%F)Æ,F)c                  óÄ  •‡‡— dd l } t          t          j        dd¦  «        ¦  «        }	 t	          |dz   ¦  «        D �]¼}‰j        rt          d¦  «        ‚	 ‰j        dk    r"‰                     ¦   «           ‰¦   «         ‰d<   n ‰¦   «         ‰d<    ‰ 	                    d¦  «        }|�‰ 
                    |d	¬
¦  «         d S d S # t          $ �r)}t          || j        | j        | j        f¦  «        }t          || j        | j        t$          f¦  «        }‰d         �rkt'          ‰ 	                    d¦  «        ¦  «        }d}|sg|seddlm}	 t          ||	¦  «        rOt-          |dd ¦  «        s>t/          |¦  «                             ¦   «         Šd}
t3          ˆfd„|
D ¦   «         ¦  «        }|p|p|}|o|o||k     }|sWt4                               d|¦  «         |‰d<   Y d }~ ‰ 	                    d¦  «        }|�‰ 
                    |d	¬
¦  «         d S d S t4                               d|dz   |dz   t;          |¦  «        j        |¦  «         	 ‰                     d¦  «         n# t          $ r Y nw xY w	 ‰                      ¦   «          n# t          $ r Y nw xY wg ‰d<   d‰d<   d‰d<   ‰ !                    dt;          |¦  «        j        › d|dz   › d|dz   › d�¦  «         ‰ "                    d|dz   › d|dz   › dt;          |¦  «        j        › �¦  «         ‰ 	                    d¦  «        }|�‰ 
                    |d¬
¦  «         d ‰d<   	 ‰ #                    d¬
¦  «         n# t          $ r Y nw xY w‰ !                    d¦  «         Y d }~�ŒJd}|sg|seddlm}	 t          ||	¦  «        rOt-          |dd ¦  «        s>t/          |¦  «                             ¦   «         Šd}t3          ˆfd „|D ¦   «         ¦  «        }|s|s|�r\||k     �rt4                               d!|dz   |dz   t;          |¦  «        j        |¦  «         ‰ !                    d"t;          |¦  «        j        › d|dz   › d|dz   › d�¦  «         ‰ "                    d|dz   › d|dz   › d#t;          |¦  «        j        › �¦  «         ‰ 	                    d¦  «        }|�‰ 
                    |d$¬
¦  «         d ‰d<   	 ‰ #                    d%¬
¦  «         n# t          $ r Y nw xY w‰ !                    d¦  «         Y d }~�ŒÜ‰ !                    d&|dz   › d'�¦  «         t4                               d(|dz   |¦  «         nbt/          |¦  «                             ¦   «         }d)|v od*|v }|rd+‰_$        ‰ %                    d,¦  «         t4                               d-|¦  «         |‰d<   Y d }~ ‰ 	                    d¦  «        }|�‰ 
                    |d	¬
¦  «         d S d S d }~ww xY w	 ‰ 	                    d¦  «        }|�‰ 
                    |d	¬
¦  «         d S d S # ‰ 	                    d¦  «        }|�‰ 
                    |d	¬
¦  «         w w xY w).Nr   ÚHERMES_STREAM_RETRIESr  r¢   z%Agent interrupted before stream retryr¸  rÙ  rÆ  Ústream_request_completer,  rO  r  F)ÚAPIErrorrÃ  )
úconnection lostúconnection resetúconnection closedzconnection terminatedúnetwork errorúnetwork connectionÚ
terminatedzpeer closedzbroken pipezupstream connect errorc              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   )rÉ   ÚphraseÚ_err_lower_previews     €rZ   rÎ   zKAIAgent._interruptible_streaming_api_call.<locals>._call.<locals>.<genexpr>W  sE   øè è € ð C&ð C&à,2ð )/Ð2DÐ(DðC&ð C&ð C&ð C&ð C&ð C&r\   z9Streaming failed after partial delivery, not retrying: %srÀ  z“Streaming attempt %s/%s died mid tool-call (%s: %s) after user-visible text; retrying silently to avoid losing the action. Preamble will re-stream.u9   

âš  Connection dropped mid tool-call; reconnectingâ€¦

rù  u)   âš ï¸� Connection dropped mid tool-call (u   ). Reconnectingâ€¦ (attempt rÀ  re  zstream retry z mid tool-call after Ústream_mid_tool_retry_cleanupÚ"stream_mid_tool_retry_pool_cleanupu    ðŸ”„ Reconnected â€” resumingâ€¦c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   )rÉ   rU  Ú_err_lower_sses     €rZ   rÎ   zKAIAgent._interruptible_streaming_api_call.<locals>._call.<locals>.<genexpr>Ä  s<   øè è € ð 7"ð 7"à(.ð %+¨nÐ$<ð7"ð 7"ð 7"ð 7"ð 7"ð 7"r\   zJStreaming attempt %s/%s failed (%s: %s), retrying with fresh connection...u'   âš ï¸� Connection to provider dropped (z after Ústream_retry_cleanupÚstream_retry_pool_cleanupu(   â�Œ Connection to provider failed after uM    attempts. The provider may be experiencing issues â€” try again in a moment.z5Streaming exhausted %s retries on transient error: %sr—   znot supportedTuš   
âš   Streaming is not supported for this model/provider. Switching to non-streaming.
   To avoid this delay, set display.streaming: false in config.yaml
z$Streaming failed before delivery: %s)&rú  r¬   r�   r  r=  r—  rO  r}  r’  rƒ   r<  r�   rb   rU  ÚConnectTimeoutÚPoolTimeoutrV  rT  rW  r­   ÚopenairM  ro   rc   rj  rÔ   r6  r7  rµ  rÛ   rr   rQ  rÞ  r¤  r4  r*  Ú_disable_streamingr‘  )r  Ú_max_stream_retriesÚ_stream_attemptrÈ  rA  Ú_is_timeoutÚ_is_conn_errÚ_partial_tool_in_flightÚ_is_sse_conn_err_previewÚ	_APIErrorÚ_SSE_PREVIEW_PHRASESÚ_is_transientÚ_can_silent_retryÚstaleÚ_is_sse_conn_errÚ_SSE_CONN_PHRASESÚ
_err_lowerÚ_is_stream_unsupportedrV  rZ  rI  r=  r  r\  rÉ  rÊ  rX   s                     @@€€€€€€€rZ   rË  z8AIAgent._interruptible_streaming_api_call.<locals>._call  s¶	  øøø€ Ø"Ð"Ð"Ð"å"%¥b¤iÐ0GÈÑ&KÔ&KÑ"LÔ"LÐðzhÝ',Ð-@À1Ñ-DÑ'EÔ'Eð uñ u�Oð Ô0ð XÝ.Ð/VÑWÔWÐWðlØœ=Ð,@Ò@Ð@Ø ×JÒJÑLÔLÐLØ1@°Ñ1BÔ1B˜F :Ñ.Ð.à1GÐ1GÑ1IÔ1I˜F :Ñ.ØðP "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐMfÐ5ÑgÔgÐgÐgÐgð .Ð-øõQ %ð eñ eð eÝ&0Ø Ô 2°FÔ4IÈ6ÔK]Ð^ñ'ô '˜õ (2Ø Ô 3°VÔ5OÕQ`Ðañ(ô (˜ð  ,¨EÔ2ñ g%Ý6:Ø &§
¢
Ð+?Ñ @Ô @ñ7ô 7Ð3ð 8=Ð4Ø#.ð &°|ð &Ø HÐ HÐ HÐ HÐ HÐ HÝ#-¨a°Ñ#;Ô#;ð !&ÅGÈAÈ}Ð^bÑDcÔDcð !&Ý9<¸Q¹¼¿º¹¼Ð$6ð<&Ð$8õ @Cð C&ð C&ð C&ð C&à6JðC&ñ C&ô C&ñ @&ô @&Ð$<ð
 !,Ð W¨|Ð WÐ?Wð *ð !8ð !JØ$1ð!Jà$3Ð6IÒ$Ið .ð
 $5ð 'õ !'§¢Ø$_Ðabñ!"ô !"ð !"ð 34  w¡Ø &    ðN "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐMfÐ5ÑgÔgÐgÐgÐgð .Ð-õE #ŸKšKð!;ð !0°!Ñ 3Ø 3°aÑ 7Ý $ Q¡¤Ô 0Ø !ñ	ô 	ð 	ð%Ø $× 7Ò 7ð%:ñ!"ô !"ð !"ð !"øõ $-ð %ð %ð %Ø $ ð%øøøð%Ø $× DÒ DÑ FÔ FÐ FÐ FøÝ#,ð %ð %ð %Ø $ ð%øøøð
 <>˜FÐ#7Ñ8Ø6;Ð,¨UÑ3Ø8=Ð-¨fÑ5Ø ×-Ò-ð!]Ý$(¨¡G¤GÔ$4ð!]ð !]à,;¸aÑ,?ð!]ð !]àBUÐXYÑBYð!]ð !]ð !]ñô ð ð
 !×0Ò0ð!J°À!Ñ0Cð !Jð !JÐFYÐ\]ÑF]ð !Jð !JÝ7;¸A±w´wÔ7Gð!Jð !Jñô ð ð %:×$=Ò$=¸hÑ$GÔ$G˜EØ$Ð0Ø $× AÒ AØ$)Ð2Qð !Bñ !"ô !"ð !"ð CGÐ 5°hÑ ?ð%Ø $× CÒ CØ+Oð !Dñ !"ô !"ð !"ð !"øõ $-ð %ð %ð %Ø $ ð%øøøà ×-Ò-Ð.PÑQÔQÐQØ$˜H˜H˜H™Hð ,1Ð(Ø*ð "°<ð "ØDÐDÐDÐDÐDÐDÝ)¨!¨YÑ7Ô7ð "ÅÈÈ=ÐZ^Ñ@_Ô@_ð "Ý14°Q±´·²±´ ð5"Ð 1õ 47ð 7"ð 7"ð 7"ð 7"à2Cð7"ñ 7"ô 7"ñ 4"ô 4"Ð 0ð
 'ð B¨,ð BÐ:Jñ Bð  /Ð1DÒDÑDÝ &§¢ð%Hà$3°aÑ$7Ø$7¸!Ñ$;Ý$(¨¡G¤GÔ$4Ø$%ñ!"ô !"ð !"ð !%× 1Ò 1ð%aÝ(,¨Q©¬Ô(8ð%að %aà0?À!Ñ0Cð%að %aàFYÐ\]ÑF]ð%að %að %añ!"ô !"ð !"ð
 !%× 4Ò 4ð%@°OÀaÑ4Gð %@ð %@ÐJ]Ð`aÑJað %@ð %@Ý-1°!©W¬WÔ-=ð%@ð %@ñ!"ô !"ð !"ð
 )>×(AÒ(AÀ(Ñ(KÔ(K Ø#(Ð#4Ø$(×$EÒ$EØ(-Ð6Lð %Fñ %&ô %&ð %&ð GKÐ$9¸(Ñ$Cð!)Ø$(×$GÒ$GØ/Jð %Hñ %&ô %&ð %&ð %&øõ (1ð !)ð !)ð !)Ø$( Dð!)øøøà $× 1Ò 1Ð2TÑ UÔ UÐ UØ (   ¡Ø ×-Ò-ð!9Ø#6¸Ñ#:ð!9ð !9ð !9ñô ð õ #ŸNšNØ WØ 3°aÑ 7Ø !ñô ð ð õ *-¨Q©¬¯ª©¬˜Jà (¨JÐ 6ð !BØ$3°zÐ$Að 3ð  6ð "Ø:> Ô 7Ø $× 0Ò 0ð%7ñ!"ô !"ð !"õ #ŸKšKØ FØ !ñô ð ð +,˜˜w™Ø˜˜˜˜à!6×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐMfÐ5ÑgÔgÐgÐgÐgð .Ð-øøøøðQeøøøð!uðn "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐMfÐ5ÑgÔgÐgÐgÐgð .Ð-øð "7×!:Ò!:¸8Ñ!DÔ!D�Ø!Ð-Ø×5Ò5°nÐMfÐ5ÑgÔgÐgÐgð .øøøsí   «+X. Á:CÂX. ÃW8ÃDW3ÇX. È6W3É	IÉW3É
I,É)W3É+I,É,W3É0JÊW3Ê
JÊW3ÊJÊB2W3ÍMÍW3Í
M)Í&W3Í(M)Í)W3ÎX. ÎEW3ÓS.Ó-W3Ó.
S;Ó8W3Ó:S;Ó;W3ÔX. ÔB#W3Ö<X. ×3W8×8X. Ø.1YÚHERMES_STREAM_STALE_TIMEOUTg     €f@rÐ  u>   Local provider detected (%s) â€” stale stream timeout disabledc              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S rg   rÒ  rÓ  s     rZ   rÎ   z<AIAgent._interruptible_streaming_api_call.<locals>.<genexpr>&  s.   è è € ÐRÐR¨a�c¥# a¡&¤&™kœkÐRÐRÐRÐRÐRÐRr\   r
  rÔ  rÕ  rÌ  rÖ  g      n@r  zwaiting for stream response (zs, no chunks yet)c              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S rg   rÒ  rÓ  s     rZ   rÎ   z<AIAgent._interruptible_streaming_api_call.<locals>.<genexpr>J  rÎ  r\   uq   Stream stale for %.0fs (threshold %.0fs) â€” no chunks received. model=%s context=~%s tokens. Killing connection.r‚  ro  r,  rÏ  z
s (model: z, context: ~z tokens). Reconnecting...Ústale_stream_killr,  Ústale_stream_pool_cleanupzstale stream detected after zs, reconnectingr¸  Ústream_interrupt_abortz+Agent interrupted during streaming API callr»  r€   r  r  rJ  z, +z moreu$   

âš  Stream stalled mid tool-call (zH); the action was not executed. Ask me to retry if you want to continue.z[Partial stream dropped tool call(s) %s after %s chars of text; surfaced warning to user: %szƒPartial stream delivered before error; returning stub response with %s chars of recovered content to prevent duplicate messages: %sr”  r  zpartial-stream-stubr   r  r   r!  )%r}  r¹  rÜ  rž   r“  r”  rÔ  r  r—  rO  r­  r  r�   r  rˆ   r2   r6  rÙ   r×  rƒ   r©   r¬   r4  r7  r¤  r<  r�   r*  r¿  ry  r´  ro   r„   r  rd   rQ  r   )rX   rî  r=  r  rD  rË  Ú_stream_stale_timeout_baseÚ_stream_stale_timeoutÚ_est_tokensÚ_last_heartbeatÚ_HEARTBEAT_INTERVALÚ_hb_nowÚ_waiting_secsÚ_stale_elapsedrÚ  rÛ  rÈ  Ú_partial_textÚ_partial_namesÚ	_name_strÚ_warnÚ	_stub_msgrI  r=  rþ  r  r  r\  r<  rÉ  rÊ  s   ```                   @@@@@@@@@rZ   Ú!_interruptible_streaming_api_callz)AIAgent._interruptible_streaming_api_callq  sÕ  øøøøøøøøøøøø€ ð$ Œ=Ð-Ò-Ð-ð
 *8ˆDÔ&ð2Ø×3Ò3°JÑ?Ô?à-1�Ô*Ð*ø¨T�Ô*Ð1Ð1Ð1Ð1ð Œ=Ð.Ò.Ð.Ø"&°Ð6Ð6ˆFØ!'¨ ÐØ % u˜~Ððð ð ð ð ð ð)(ð )(ð )(ð )(ð )(ð )(ð )(ð )(ð )(õV Ô ¨¸dÐCÑCÔCˆAØ�GŠG‰IŒIˆIØ—*’*‘,”,ð XØ—’˜s�Ñ#Ô#Ð#ØÔ,ð XÝ*Ð+VÑWÔWÐWð —*’*‘,”,ð Xð �gŒÐ*Ø˜W”oÐ%Ø˜*Ô%Ð%à"¨TÈÐLÐLˆØ!)¨4Ð 0ÐØ# U˜OÐØ! 5˜>Ðð ¥¤	¡¤Ð,ˆð	ð 	ð 	ð 	ð 	ð 	ðz	ð z	ð z	ð z	ð z	ð z	ð z	ð z	ð z	ð z	ð z	ðx7	2ð 7	2ð 7	2ð 7	2ð 7	2ð 7	2ð 7	2ð 7	2ð 7	2ðr	hð 	hð 	hð 	hð 	hð 	hð 	hð 	hð 	hð 	hð 	hõB &+­2¬9Ð5RÐTYÑ+ZÔ+ZÑ%[Ô%[Ð"ð &¨Ò.Ð.°4´=Ð.ÕEVÐW[ÔWdÑEeÔEeÐ.Ý$)¨%¡L¤LÐ!Ý�LŠLÐYÐ[_Ô[hÑiÔiÐiÐiõ ÐRÐR°:·>²>À*ÈbÑ3QÔ3QÐRÑRÔRÑRÔRÐVWÑWˆKØ˜WÒ$Ð$Ý(+Ð,FÈÑ(NÔ(NÐ%Ð%Ø˜vÒ%Ð%Ý(+Ð,FÈÑ(NÔ(NÐ%Ð%à(BÐ%åÔ E°$Ð7Ñ7Ô7ˆØ	�Š‰	Œ	ˆ	Ýœ)™+œ+ˆØ"ÐØ�jŠj‰lŒlñ C	VØ�FŠF˜3ˆFÑÔÐõ ”i‘k”kˆGØ˜Ñ(Ð,?Ò?Ð?Ø")�Ý # G¨o¸cÔ.BÑ$BÑ CÔ C�Ø×$Ò$ØT°MÐTÐTÐTñô ð õ "œY™[œ[¨?¸3Ô+?Ñ?ˆNØÐ 5Ò5Ñ5ÝÐSÐS°J·N²NÀ:ÈrÑ4RÔ4RÐSÑSÔSÑSÔSÐWXÑX�Ý—’ðGà"Ð$9Ø—N’N 7¨IÑ6Ô6¸8¸¸ñ	ô ð ð ×!Ò!ð'½CÀÑ<OÔ<Oð 'ð 'Ø)Ÿ~š~¨g°yÑAÔAð'ð 'à!)Ð7ð'ð 'ð 'ñô ð ðØ.×2Ò2°8Ñ<Ô<�BØ�~Ø×9Ò9¸"ÐEXÐ9ÑYÔYÐYøøÝ ð ð ð Ø�DðøøøðØ×7Ò7Ð?ZÐ7Ñ[Ô[Ð[Ð[øÝ ð ð ð Ø�Dðøøøõ (,¤y¡{¤{� Ñ$Ø×$Ò$ØWµ3°~Ñ3FÔ3FÐWÐWÐWñô ð ð Ô(ð Vð	Ø”}Ð(<Ò<Ð<ØÔ.×4Ò4Ñ6Ô6Ð6Ø×6Ò6Ñ8Ô8Ð8Ð8à)>×)BÒ)BÀ8Ñ)LÔ)L˜Ø)Ð5Ø ×=Ò=¸nÐUmÐ=ÑnÔnÐnøøÝ ð ð ð Ø�Dðøøøå&Ð'TÑUÔUÐUðG �jŠj‰lŒlñ C	VðH �'Œ?Ñ&Ø Ô&ñ >õ ˜DÐ"DÀbÑIÔIÐOÈRß’%‘'”'ð!"à!ð õ "& f§j¢jÐ1EÑ&FÔ&FÐ&LÈ"Ñ!MÔ!M�Ø!ð Ø $§	¢	¨.¸¸!¸Ô*<Ñ =Ô =�IÝ˜>Ñ*Ô*¨QÒ.Ð.Ø!Ð%I­3¨~Ñ+>Ô+>ÀÑ+BÐ%IÐ%IÐ%IÑI˜	ðDØ%ðDð Dð Dð ð
 &3Ð%8°b¸EÑ$A�MðØ×/Ò/°Ñ6Ô6Ð6Ð6øÝ$ð ð ð Ø˜ðøøøå—N’Nð@à&­¨MÐ,?¸RÑ(@Ô(@À&ÈÄ/ñô ð ð õ —N’Nð1õ ˜MÐ/¨RÑ0Ô0Ø˜wœñô ð õ ,Ø$¨mÈØ&*ðñ ô �	õ 'Ø,Ý! $¨°Ñ;Ô;Ý,Ø¨À&ðñ ô ð ð ðñ ô ð ð ˜”/Ð!Ø�jÔ!Ð!sR    < ¼	AÎ&.O Ï
O"Ï!O"Ï&O= Ï=
P
Ð	P
ÑA'R9 Ò9
SÓSÖ#V9 Ö9
W×WzFailoverReason | Nonec                 ó’  — |t           j        t           j        fv r¼t          t	          | dd¦  «        ¦  «        }t	          | dd¦  «        pd                     ¦   «                              ¦   «         }| j        pi                      d¦  «        pd                     ¦   «                              ¦   «         }|r|r!||k    rt          j
        ¦   «         dz   | _        | j        t          | j        ¦  «        k    rdS | j        | j                 }| xj        dz  c_        |                     d¦  «        pd                     ¦   «                              ¦   «         }|                     d¦  «        pd                     ¦   «         }|r|s|                      ¦   «         S 	 dd	lm} |                     d
¦  «        pd                     ¦   «         pd}	|                     d¦  «        pd                     ¦   «         pd}
|
sT|                     d¦  «        pd                     ¦   «         }|r)t%          j        |d¦  «                             ¦   «         pd}
|	r(t)          |	d¦  «        r|
st%          j        d¦  «        pd}
 |||d|	|
¬¦  «        \  }}|€)t+          j        d|¦  «         |                      ¦   «         S 	 ddlm}  |||¦  «        }n# t2          $ r Y nw xY wd}t5          |j        ¦  «        }|                      |¦  «        }|dk    rd}n´|dk    s:|                     d¦  «                             ¦   «                              d¦  «        rd}nq|rd}nl|                      |¦  «        rd}nT|                       ||¬¦  «        rd}n:|dk    s2tC          |¦  «         "                    d¦  «        rt)          |d¦  «        rd}| j#        }|| _#        || _$        || _        || _%        tM          | d ¦  «        r| j'         (                    ¦   «          d| _)        tU          ||¦  «        }|dk    r€dd!l+m,}m-}m.} |dk    r|j/        p |¦   «         pdn|j/        pd}|| _/        || _0        || _1         ||| j1        |¬"¦  «        | _2        |dk    r ||¦  «        nd| _3        d| _4        i | _5        n}|j/        | _/        || _4        t	          |d#d¦  «        }|st	          |d$d¦  «        }|j/        |d%œ|rd$tm          |¦  «        ini ¥| _5        |� || j5        d&<   |  7                    d'¬(¦  «         |  8                    ||||¬)¦  «        \  | _9        | _:        tM          | d*¦  «        r}| j;        rvdd+l<m=}  || j#        | j        | j/        | j$        t	          | d,d¦  «        ¬-¦  «        }| j;         >                    | j#        || j        t	          | dd¦  «        | j$        ¬.¦  «         |  ?                    d/|› d0|› �¦  «         t+          j@        d1|||¦  «         dS # t2          $ r4}t+          jA        d2||¦  «         |                      ¦   «         cY d}~S d}~ww xY w)3u  Switch to the next fallback model/provider in the chain.

        Called when the current model is failing after retries.  Swaps the
        OpenAI client, model slug, and provider in-place so the retry loop
        can continue with the new backend.  Advances through the chain on
        each call; returns False when exhausted.

        Uses the centralized provider router (resolve_provider_client) for
        auth resolution and client construction â€” no duplicated providerâ†’key
        mappings.
        rÔ  Fr|  r€   r  r¢   r‚  r   r  rˆ   Nr{  Úkey_envz
ollama.comÚOLLAMA_API_KEYT)r‚  r  Úexplicit_base_urlÚexplicit_api_keyz.Fallback to %s failed: provider not configured)rÆ  r·  r¹  rµ  r¾  rÀ  rÁ  r¸  rÉ  rÂ  rÃ  rÄ  r¶  rÊ  r~  rã  Ú_custom_headersrú  rø  rä  Úfallback_timeout_applyr,  r€  rk  r_  r  )rˆ   r{  r|  ra  rb  u5   ðŸ”„ Primary model failed â€” switching to fallback: z via u"   Fallback activated: %s â†’ %s (%s)z"Failed to activate fallback %s: %s)Br#   r¦  r¥  r­   ro   r„   rj  r!  rƒ   r­  Ú	monotonicÚ_rate_limited_untilrÓ  rd   rÒ  Ú_try_activate_fallbackrÌ  r  r�   r  rN   rØ   r7  rŒ  rÆ  r�   rc   rˆ   r�  r‰  r>  rŽ  r�  rO   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¨  rk  r  r`  r	  r¤  rµ  rÀ  )rX   r  Úfallback_already_activeÚcurrent_providerÚprimary_providerrB  Úfb_providerÚfb_modelr  Úfb_base_url_hintÚfb_api_key_hintÚ
fb_key_envÚ	fb_clientÚ_resolved_fb_modelrÆ  Úfb_api_modeÚfb_base_urlÚ_fb_is_azurerˆ  Ú_fb_timeoutrÜ  rÝ  râ  r/  Ú
fb_headersr`  Úfb_context_lengthrA  s                               rZ   r�  zAIAgent._try_activate_fallback»  sÔ  € ð •nÔ/µÔ1GÐHÐHÐHõ '+­7°4Ð9NÐPUÑ+VÔ+VÑ&WÔ&WÐ#Ý '¨¨j¸"Ñ =Ô =Ð CÀ×JÒJÑLÔL×RÒRÑTÔTÐØ!%Ô!6Ð!<¸"× AÒ AÀ*Ñ MÔ MÐ SÐQS×ZÒZÑ\Ô\×bÒbÑdÔdÐØ+ð AÐ1Að AÐFVÐZjÒFjÐFjÝ+/¬>Ñ+;Ô+;¸bÑ+@�Ô(ØÔ¥3 tÔ';Ñ#<Ô#<Ò<Ð<Ø�5àÔ! $Ô"6Ô7ˆØÐÔ Ñ!ÐÔØ—v’v˜jÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8×>Ò>Ñ@Ô@ˆØ—F’F˜7‘O”OÐ) r×0Ò0Ñ2Ô2ˆØð 	1 (ð 	1Ø×.Ò.Ñ0Ô0Ð0ð
]	1ØFÐFÐFÐFÐFÐFð !#§¢ zÑ 2Ô 2Ð 8°b×?Ò?ÑAÔAÐIÀTÐØ!Ÿvšv iÑ0Ô0Ð6°B×=Ò=Ñ?Ô?ÐGÀ4ˆOØ"ð PØ Ÿfšf YÑ/Ô/Ð5°2×<Ò<Ñ>Ô>�
Øð PÝ&(¤i°
¸BÑ&?Ô&?×&EÒ&EÑ&GÔ&GÐ&OÈ4�Oð  ð FÕ$9Ð:JÈLÑ$YÔ$Yð FÐbqð FÝ"$¤)Ð,<Ñ"=Ô"=Ð"EÀ�Ø,CÐ,CØ 8°tØ"2Ø!0ð-2ñ -2ô -2Ñ)ˆIÐ)ð Ð Ý”ØDØñ!ô !ð !ð ×2Ò2Ñ4Ô4Ð4ðØSÐSÐSÐSÐSÐSà7Ð7¸À+ÑNÔN��øÝð ð ð Ø�ðøøøð -ˆKÝ˜iÔ0Ñ1Ô1ˆKØ×4Ò4°[ÑAÔAˆLØ˜nÒ,Ð,Ø/��Ø Ò+Ð+¨{×/AÒ/AÀ#Ñ/FÔ/F×/LÒ/LÑ/NÔ/N×/WÒ/WÐXdÑ/eÔ/eÐ+Ø2��Øð 1ð 1��Ø×+Ò+¨KÑ8Ô8ð 1Ø/��Ø×<Ò<ØØ$ð =ñ ô ð 1ð 0��Ø 	Ò)Ð)Ý! +Ñ.Ô.×9Ò9Ð:LÑMÔMð *å)¨+°ÑGÔGð *ð 1�àœ
ˆIØ!ˆDŒJØ'ˆDŒMØ'ˆDŒMØ'ˆDŒMÝ�tÐ/Ñ0Ô0ð .ØÔ%×+Ò+Ñ-Ô-Ð-Ø'+ˆDÔ$õ
 7°{ÀHÑMÔMˆKàÐ2Ò2Ð2àtÐtÐtÐtÐtÐtÐtÐtÐtÐtØZeÐitÒZtÐZt Ô!2Ð!UÐ6MÐ6MÑ6OÔ6OÐ!UÐSUøð  |Eô  |Mð  |Sð  QS�Ø,�”Ø*7�Ô'Ø+6�Ô(Ø)?Ð)?Ø! 4Ô#;À[ð*ñ *ô *�Ô&ð NYÐ\gÒMgÐMg¨?¨?¸=Ñ+IÔ+IÐ+IÐmr�Ô(Ø"�”Ø&(�Ô#Ð#ð  )Ô0�”Ø'�”õ % YÐ0AÀ4ÑHÔH�
Ø!ð MÝ!(¨Ð4EÀtÑ!LÔ!L�Jà(Ô0Ø +ð'ð 'ð AKÐRÐ)­4°
Ñ+;Ô+;Ð<Ð<ÐPRð'�Ô#ð
 Ð*Ø5@�DÔ'¨	Ñ2ð ×7Ò7Ð?WÐ7ÑXÔXÐXð ×3Ò3Ø(Ø(Ø(Ø"ð	 4ñ ô ñ DˆDÔ$ dÔ&Cõ  �tÐ1Ñ2Ô2ð °tÔ7Nð ØIÐIÐIÐIÐIÐIØ$<Ð$<Ø”J¨¬Ø œL°4´=Ý*1°$Ð8PÐRVÑ*WÔ*Wð%ñ %ô %Ð!ð
 Ô'×4Ò4Øœ*Ø#4Ø!œ]Ý# D¨)°RÑ8Ô8Ø!œ]ð 5ñ ô ð ð ×Òð0Øð0ð 0Ø"-ð0ð 0ñô ð õ ŒLØ4Ø˜8 [ñô ð ð �4øÝð 	1ð 	1ð 	1ÝŒMÐ>ÀÈ!ÑLÔLÐLØ×.Ò.Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð	1øøøsD   ÆDX Ê0K ËX Ë
KËX ËKËL6X Ø
YØ)YØ;YÙYc                 óz  — | j         sdS t          | dd¦  «        t          j        ¦   «         k    rdS | j        }	 |d         | _        |d         | _        |d         | _        |d         | _        t          | d¦  «        r| j
                             ¦   «          |d	         | _        t          |d
         ¦  «        | _        |d         | _        |                     d| j        dk    o
| j        dk    ¦  «        | _        | j        dk    rlddlm} |d         | _        |d         | _         ||d         |d         t-          | j        | j        ¦  «        ¬¦  «        | _        |d         | _        d| _        n0|                      t          |d
         ¦  «        dd¬¦  «        | _        | j        }|                     |d         |d         |d         |d         |d         ¬¦  «         d| _         d| _        t=          j        d| j        | j        ¦  «         dS # t@          $ r }t=          j!        d|¦  «         Y d}~dS d}~ww xY w) aú  Restore the primary runtime at the start of a new turn.

        In long-lived CLI sessions a single AIAgent instance spans multiple
        turns.  Without restoration, one transient failure pins the session
        to the fallback provider for every subsequent turn.  Calling this at
        the top of ``run_conversation()`` makes fallback turn-scoped.

        The gateway caches agents across messages (``_agent_cache`` in
        ``gateway/run.py``), so this restoration IS needed there too.
        FrŒ  r   r‚  r|  rˆ   r}  rÊ  r{  rr  rs  rt  r¸  r¾  r²  r|  r}  rã  r~  NÚrestore_primaryTr  ru  ry  rv  rw  rx  rb  z.Primary runtime restored for new turn: %s (%s)z%Failed to restore primary runtime: %s)"rÔ  ro   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Ñ  rk  r	  rÓ  rØ   rµ  r�   r7  )rX   ÚrtrÜ  ÚccrA  s        rZ   Ú_restore_primary_runtimez AIAgent._restore_primary_runtime~  s‰  € ð Ô'ð 	Ø�5å�4Ð.°Ñ2Ô2µT´^Ñ5EÔ5EÒEÐEØ�5àÔ"ˆð9	à˜GœˆDŒJØ˜zœNˆDŒMØ˜zœNˆDŒMØ˜zœNˆDŒMÝ�tÐ/Ñ0Ô0ð .ØÔ%×+Ò+Ñ-Ô-Ð-Ø˜iœ=ˆDŒLÝ"& r¨/Ô':Ñ";Ô";ˆDÔØ')Ð*>Ô'?ˆDÔ$ð -/¯FªFØ)Ø”Ð!5Ò5ÐV¸$¼-È;Ò:Vñ-ô -ˆDÔ)ð Œ}Ð 4Ò4Ð4ØJÐJÐJÐJÐJÐJØ*,Ð-@Ô*A�Ô'Ø+-Ð.BÔ+C�Ô(Ø)?Ð)?ØÐ*Ô+¨RÐ0DÔ-EÝ8¸¼ÈÌ
ÑSÔSð*ñ *ô *�Ô&ð ,.Ð.BÔ+C�Ô(Ø"�”�à"×8Ò8Ý˜˜OÔ,Ñ-Ô-Ø,Øð 9ñ ô �”ð Ô(ˆBØ�OŠOØÐ+Ô,Ø!Ð"=Ô>ØÐ1Ô2ØÐ/Ô0ØÐ1Ô2ð ñ ô ð ð (-ˆDÔ$Ø#$ˆDÔ åŒLØ@Ø”
˜DœMñô ð ð �4øÝð 	ð 	ð 	ÝŒOÐCÀQÑGÔGÐGØ�5�5�5�5�5øøøøð	øøøs   ºGH È
H:ÈH5È5H:>   r^  rU  rV  r]  ÚAPITimeoutErrorÚAPIConnectionErrorrT  Ú	api_errorÚretry_countÚmax_retriesc          
      óÐ  — | j         rdS t          |¦  «        j        }|| j        vrdS |                      ¦   «         rdS | j        pd                     ¦   «                              ¦   «         }|dv rdS 	 t          | dd¦  «        �/	 |  	                    | j
        dd¬¦  «         n# t          $ r Y nw xY w| j        }t          |d	         ¦  «        | _        |d
         | _        |d         | _        |d         | _        |d         | _        t%          | d¦  «        r| j                             ¦   «          |d         | _        | j        dk    rlddlm} |d         | _        |d         | _         ||d         |d         t5          | j        | j        ¦  «        ¬¦  «        | _        |d         | _        d| _
        n0|                      t          |d	         ¦  «        dd¬¦  «        | _
        t=          d|z   d¦  «        }|                      | j         › d|› d| j        › d|› d�d¬¦  «         tC          j"        |¦  «         dS # t          $ r }	tG          j$        d|	¦  «         Y d}	~	dS d}	~	ww xY w)uŽ  Attempt one extra primary-provider recovery cycle for transient transport failures.

        After ``max_retries`` exhaust, rebuild the primary client (clearing
        stale connection pools) and give it one more attempt before falling
        back.  This is most useful for direct endpoints (custom, Z.AI,
        Anthropic, OpenAI, local models) where a TCP-level hiccup does not
        mean the provider is down.

        Skipped for proxy/aggregator providers (OpenRouter, Nous) which
        already manage connection pools and retries server-side â€” if our
        retries through them are exhausted, one more rebuilt client won't help.
        Fr€   )r}  znous-researchrÆ  NÚprimary_recoveryTr  rr  r‚  r|  rˆ   r}  rÊ  r{  r¸  r   r²  r|  r}  rã  r~  rJ  r½   u   ðŸ”� Transient z on u    â€” rebuilt client, waiting z"s before one last primary attempt.r’  z%Primary transport recovery failed: %s)%rÔ  rÛ   rr   Ú_TRANSIENT_TRANSPORT_ERRORSr’  r|  r„   rj  ro   rX  rÆ  r�   r!  rÚ   rÇ  r‚  rˆ   r}  r�  rÊ  r‘  r{  rÁ  rÜ  rÄ  rÅ  r   r¿  rÀ  rÑ  ró   r—  rŒ  r­  ÚsleeprØ   r7  )
rX   r¥  r¦  r§  Ú
error_typerê  r   rÜ  Ú	wait_timerA  s
             rZ   Ú_try_recover_primary_transportz&AIAgent._try_recover_primary_transportÓ  sÿ  € ð Ô#ð 	Ø�5õ ˜)‘_”_Ô-ˆ
Ø˜TÔ=Ð=Ð=Ø�5ð ×"Ò"Ñ$Ô$ð 	Ø�5Øœ-Ð-¨2×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ˆØÐ6Ð6Ð6Ø�5ð0	å�t˜X tÑ,Ô,Ð8ðØ×-Ò-ØœÐ,>Àtð .ñ ô ð ð øõ !ð ð ð Ø�Dðøøøð Ô&ˆBÝ"& r¨/Ô':Ñ";Ô";ˆDÔØ˜GœˆDŒJØ˜zœNˆDŒMØ˜zœNˆDŒMØ˜zœNˆDŒMÝ�tÐ/Ñ0Ô0ð .ØÔ%×+Ò+Ñ-Ô-Ð-Ø˜iœ=ˆDŒLàŒ}Ð 4Ò4Ð4ØJÐJÐJÐJÐJÐJØ*,Ð-@Ô*A�Ô'Ø+-Ð.BÔ+C�Ô(Ø)?Ð)?ØÐ*Ô+¨RÐ0DÔ-EÝ8¸¼ÈÌ
ÑSÔSð*ñ *ô *�Ô&ð ,.Ð.BÔ+C�Ô(Ø"�”�à"×8Ò8Ý˜˜OÔ,Ñ-Ô-Ø-Øð 9ñ ô �”õ ˜A ™O¨QÑ/Ô/ˆIØ�LŠLØ”?ð Yð Y°:ð Yð YÀ4Ä=ð Yð YØ+4ðYð Yð Yàð ñ ô ð õ
 ŒJ�yÑ!Ô!Ð!Ø�4øÝð 	ð 	ð 	ÝŒOÐCÀQÑGÔGÐGØ�5�5�5�5�5øøøøð	øøøs=   Á3H; ÂB# Â"H; Â#
B0Â-H; Â/B0Â0F	H; È;
I%ÉI É I%c                 óœ   — t          | t          ¦  «        sdS | D ]1}t          |t          ¦  «        r|                     d¦  «        dv r dS Œ2dS )NFrÛ   >   Ú	image_urlÚinput_imageT)rb   r  rÚ   rƒ   )r  r  s     rZ   Ú_content_has_image_partsz AIAgent._content_has_image_parts%  s^   € å˜'¥4Ñ(Ô(ð 	Ø�5Øð 	ð 	ˆDÝ˜$¥Ñ%Ô%ð ¨$¯(ª(°6Ñ*:Ô*:Ð>ZÐ*ZÐ*ZØ�t�tøØˆur\   r°  c                 óf  — t          | pd¦  «                             d¦  «        \  }}}d}|                     d¦  «        rZ|t          d¦  «        d …                              dd¦  «        d                              ¦   «         }|                     d¦  «        r|}d	d
ddddœ                     |d¦  «        }t          j        d|d¬¦  «        }|5  | 	                    t          j        |¦  «        ¦  «         d d d ¦  «         n# 1 swxY w Y   t          |j        ¦  «        }t          |¦  «        |fS )Nr€   r,  ú
image/jpegúdata:ú;r¢   r   zimage/z.pngz.gifz.webpz.jpg)z	image/pngz	image/gifz
image/webpr´  z	image/jpgÚanthropic_image_F)rÊ  rÈ  Údelete)rc   Ú	partitionrŠ  rd   rÑ  r„   rƒ   ÚtempfileÚNamedTemporaryFiler_   Úbase64Ú	b64decoder   rp   )	r°  ÚheaderrE  re   ÚmimeÚ	mime_partrÈ  Útmprè   s	            rZ   Ú _materialize_data_url_for_visionz(AIAgent._materialize_data_url_for_vision.  sq  € å˜i˜o¨2Ñ.Ô.×8Ò8¸Ñ=Ô=‰ˆ��4ØˆØ×Ò˜WÑ%Ô%ð 	!Ø�s 7™|œ|˜}˜}Ô-×3Ò3°C¸Ñ;Ô;¸AÔ>×DÒDÑFÔFˆIØ×#Ò# HÑ-Ô-ð !Ø �àØØ!Ø Øð
ð 
÷ Š#ˆd�FÑ
Ô
ð 	õ Ô)Ð1CÈFÐ[`ÐaÑaÔaˆØð 	.ð 	.Ø�IŠI•fÔ& tÑ,Ô,Ñ-Ô-Ð-ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.å�C”H‰~Œ~ˆÝ�4‰yŒy˜$ˆÐs   Ã(DÄDÄ
Dr  c                 óD  — t          j        t          |pd¦  «                             d¦  «        ¦  «                             ¦   «         }| j                             |¦  «        }|r|S dddœ                     |d¦  «        }d}t          |pd¦  «        }d }|                     d¦  «        r|                      |¦  «        \  }}d}		 d	d
l	m
}
 t          j         |
||¬¦  «        ¦  «        }t          |t          ¦  «        rt          j        |¦  «        ni }|                     d¦  «        pd                     ¦   «         }	n# t"          $ r}d|› �}	Y d }~nd }~ww xY w|r:|                     ¦   «         r&	 |                     ¦   «          nS# t(          $ r Y nGw xY wnB# |r:|                     ¦   «         r'	 |                     ¦   «          w # t(          $ r Y w w xY ww w xY w|	sd}	d|› d|	› d�}|r-t          |pd¦  «                             d¦  «        s	|d|› d�z  }|| j        |<   |S )Nr€   rü  r”  ztool result)r”  r  r_  zªDescribe everything visible in this image in thorough detail. Include any text, code, UI, data, objects, people, layout, colors, and any other notable visual information.rµ  r   )Úvision_analyze_tool)r°  Úuser_promptÚanalysiszImage analysis failed: zImage analysis failed.z[The z- attached an image. Here's what it contains:
r2  z@
[If you need a closer look, use vision_analyze with image_url: )ÚhashlibÚsha256rc   rL  Ú	hexdigestr¾  rƒ   rŠ  rÂ  Útools.vision_toolsrÄ  Úasyncior(  rb   rÕ   rÖ   r„   r�   r  Úunlinkr`   )rX   r°  r  Ú	cache_keyÚcachedÚ
role_labelÚanalysis_promptÚvision_sourceÚcleanup_pathr¡  rÄ  Úresult_jsonrÊ  rA  Únotes                  rZ   Ú&_describe_image_for_anthropic_fallbackz.AIAgent._describe_image_for_anthropic_fallbackC  sÏ  € Ý”N¥3 y °BÑ#7Ô#7×#>Ò#>¸wÑ#GÔ#GÑHÔH×RÒRÑTÔTˆ	ØÔ5×9Ò9¸)ÑDÔDˆØð 	ØˆMð %Ø!ð
ð 
÷ Š#ˆd�FÑ
Ô
ð 	ð
8ð 	õ ˜I˜O¨Ñ,Ô,ˆØ'+ˆØ×#Ò# GÑ,Ô,ð 	_Ø*.×*OÒ*OÐP]Ñ*^Ô*^Ñ'ˆM˜<àˆð	Ø>Ð>Ð>Ð>Ð>Ð>å!œ+Ø#Ð#¨mÈÐYÑYÔYñô ˆKõ 1;¸;ÍÑ0LÔ0LÐT•T”Z Ñ,Ô,Ð,ÐRTˆFØ!Ÿ:š: jÑ1Ô1Ð7°R×>Ò>Ñ@Ô@ˆKˆKøÝð 	8ð 	8ð 	8Ø7°AÐ7Ð7ˆKˆKˆKˆKˆKˆKøøøøð	8øøøð ð  × 3Ò 3Ñ 5Ô 5ð ðØ ×'Ò'Ñ)Ô)Ð)Ð)øÝð ð ð Ø�Dðøøøøøð ð  × 3Ò 3Ñ 5Ô 5ð ðØ ×'Ò'Ñ)Ô)Ð)Ð)øÝð ð ð Ø�Dðøøøðð øøøð ð 	3Ø2ˆKà_�zÐ_Ð_ÐQ\Ð_Ð_Ð_ˆØð 	¥ Y _°"Ñ!5Ô!5×!@Ò!@ÀÑ!IÔ!Ið 	ØØdÐTaÐdÐdÐdñˆDð ;?ˆÔ,¨YÑ7Øˆsg   ÃA9D? Ä>F Ä?
EÅ	EÅF ÅEÅF Å2F Æ
FÆFÆGÆ0GÇGÇ
GÇGÇGÇGc                 ó   — |                       |¦  «        s|S g }g }|D �]¹}t          |t          ¦  «        r<|                     ¦   «         r'|                     |                     ¦   «         ¦  «         ŒTt          |t
          ¦  «        sŒj|                     d¦  «        }|dv rOt          |                     dd¦  «        pd¦  «                             ¦   «         }|r|                     |¦  «         ŒÒ|dv r•|                     di ¦  «        }t          |t
          ¦  «        r|                     dd¦  «        nt          |pd¦  «        }	|	r*|                     |                      |	|¦  «        ¦  «         n|                     d¦  «         �Œkt          |                     dd¦  «        pd¦  «                             ¦   «         }|r|                     |¦  «         �Œ»d	                     d
„ |D ¦   «         ¦  «                             ¦   «         }
d                     d„ |D ¦   «         ¦  «                             ¦   «         }|
r	|r|
› d	|› �S |
r|
S |r|S dS )NrÛ   >   r÷   Ú
input_textr÷   r€   >   r°  r±  r°  rÄ  z:[An image was attached but no image source was available.]rK  c              3   ó   K  — | ]}|¯|V — Œ	d S rg   rw   )rÉ   rÔ  s     rZ   rÎ   z8AIAgent._preprocess_anthropic_content.<locals>.<genexpr>˜  s'   è è € ÐBÐB d¸TÐB˜TÐBÐBÐBÐBÐBÐBr\   r¯  c              3   ó   K  — | ]}|¯|V — Œ	d S rg   rw   )rÉ   r÷   s     rZ   rÎ   z8AIAgent._preprocess_anthropic_content.<locals>.<genexpr>™  s'   è è € Ð?Ð? D¸$Ð?˜4Ð?Ð?Ð?Ð?Ð?Ð?r\   zI[A multimodal message was converted to text for Anthropic compatibility.])	r²  rb   rc   r„   rÞ   rÚ   rƒ   rÕ  r  )rX   r  r  Ú
text_partsÚimage_notesr  Úptyper÷   Ú
image_datar°  rÊ  rÈ  s               rZ   Ú_preprocess_anthropic_contentz%AIAgent._preprocess_anthropic_contentv  sy  € Ø×,Ò,¨WÑ5Ô5ð 	ØˆNà "ˆ
Ø!#ˆØð 	(ñ 	(ˆDÝ˜$¥Ñ$Ô$ð Ø—:’:‘<”<ð 4Ø×%Ò% d§j¢j¡l¤lÑ3Ô3Ð3ØÝ˜d¥DÑ)Ô)ð Øà—H’H˜VÑ$Ô$ˆEØÐ.Ð.Ð.Ý˜4Ÿ8š8 F¨BÑ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>�Øð ,Ø×%Ò% dÑ+Ô+Ð+ØàÐ4Ð4Ð4Ø!ŸXšX k°2Ñ6Ô6�
Ý9CÀJÕPTÑ9UÔ9UÐp˜JŸNšN¨5°"Ñ5Ô5Ð5Õ[^Ð_iÐ_oÐmoÑ[pÔ[p�	Øð eØ×&Ò& t×'RÒ'RÐS\Ð^bÑ'cÔ'cÑdÔdÐdÐdà×&Ò&Ð'cÑdÔdÐdÙå�t—x’x ¨Ñ+Ô+Ð1¨rÑ2Ô2×8Ò8Ñ:Ô:ˆDØð (Ø×!Ò! $Ñ'Ô'Ð'ùà—’ÐBÐB¨kÐBÑBÔBÑBÔB×HÒHÑJÔJˆØ—’Ð?Ð?¨JÐ?Ñ?Ô?Ñ?Ô?×EÒEÑGÔGˆØð 	+�fð 	+ØÐ*Ð* &Ð*Ð*Ð*Øð 	ØˆMØð 	ØˆMØZÐZr\   c                 óª   — |p| j         }t          | dd¦  «        }|€	i }|| _        |                     |¦  «        }|€ddlm}  ||¦  «        }|||<   |S )zÀReturn the cached transport for the given (or current) api_mode.

        Lazy-initializes on first call per api_mode. Returns None if no
        transport is registered for the mode.
        rÊ  Nr   )Úget_transport)r}  ro   rÊ  rƒ   Úagent.transportsrà  )rX   r}  ÚmodeÚcacherD  rà  s         rZ   r‹  zAIAgent._get_transport¢  sw   € ð Ð(˜4œ=ˆÝ˜Ð0°$Ñ7Ô7ˆØˆ=ØˆEØ$)ˆDÔ!Ø�IŠI�d‰OŒOˆØˆ9Ø6Ð6Ð6Ð6Ð6Ð6Ø�˜dÑ#Ô#ˆAØˆE�$‰KØˆr\   Úapi_messagesc           
      ó>  ‡ — t          ˆ fd„|D ¦   «         ¦  «        s|S t          j        |¦  «        }|D ]g}t          |t          ¦  «        sŒ‰                      |                     d¦  «        t          |                     dd¦  «        pd¦  «        ¦  «        |d<   Œh|S )Nc              3   ó’   •K  — | ]A}t          |t          ¦  «        o'‰                     |                     d ¦  «        ¦  «        V — ŒBdS )r  N)rb   rÚ   r²  rƒ   )rÉ   r  rX   s     €rZ   rÎ   z>AIAgent._prepare_anthropic_messages_for_api.<locals>.<genexpr>µ  s`   øè è € ð 
ð 
àõ �s�DÑ!Ô!ÐW d×&CÒ&CÀCÇGÂGÈIÑDVÔDVÑ&WÔ&Wð
ð 
ð 
ð 
ð 
ð 
r\   r  r  r_  )rÔ   r�  r   rb   rÚ   rÞ  rƒ   rc   )rX   rä  Útransformedr  s   `   rZ   Ú#_prepare_anthropic_messages_for_apiz+AIAgent._prepare_anthropic_messages_for_api´  sÆ   ø€ Ýð 
ð 
ð 
ð 
à#ð
ñ 
ô 
ñ 
ô 
ð 	 ð  Ðå”m LÑ1Ô1ˆØð 	ð 	ˆCÝ˜c¥4Ñ(Ô(ð ØØ!×?Ò?Ø—’˜	Ñ"Ô"Ý�C—G’G˜F FÑ+Ô+Ð5¨vÑ6Ô6ñô ˆC�	‰NˆNð Ðr\   c                 óÎ   — t          | dd¦  «        pd                     ¦   «         dv rdS t          | dd¦  «        pd                     ¦   «         }d|v pd|v pd|v pd	|v pd
|v pd|v S )aÛ  True when using an anthropic-compatible endpoint that preserves dots in model names.
        Alibaba/DashScope keeps dots (e.g. qwen3.5-plus).
        MiniMax keeps dots (e.g. MiniMax-M2.7).
        OpenCode Go/Zen keeps dots for non-Claude models (e.g. minimax-m2.5-free).
        ZAI/Zhipu keeps dots (e.g. glm-4.7, glm-5.1).
        AWS Bedrock uses dotted inference-profile IDs
        (e.g. ``global.anthropic.claude-opus-4-7``,
        ``us.anthropic.claude-sonnet-4-5-20250929-v1:0``) and rejects
        the hyphenated form with
        ``HTTP 400 The provided model identifier is invalid``.
        Regression for #11976; mirrors the opencode-go fix for #5211
        (commit f77be22c), which extended this same allowlist.r|  r€   >   r  rá  rÂ  Úminimaxú
minimax-cnr}  r|  Trˆ   Ú	dashscopeÚaliyuncsrê  zopencode.ai/zen/zbigmodel.cnrÃ  )ro   rj  )rX   Úbases     rZ   Ú_anthropic_preserve_dotsz AIAgent._anthropic_preserve_dotsÅ  s°   € õ �D˜* bÑ)Ô)Ð/¨R×6Ò6Ñ8Ô8ð =
ð 
ð 
ð
 �4Ý˜˜j¨"Ñ-Ô-Ð3°×:Ò:Ñ<Ô<ˆà˜4Ðð *Ø˜TÐ!ð*à˜DÐ ð*ð " TÐ)ð*ð  Ð$ð	*ð " TÐ)ð		
r\   c                 ó,   — t          | j        d¦  «        S )z2Return True when the base URL targets Qwen Portal.r  rÝ  ri   s    rZ   Ú_is_qwen_portalzAIAgent._is_qwen_portalä  s   € å$ TÔ%9Ð;KÑLÔLÐLr\   c                 óÜ  — t          j        |¦  «        }|s|S |D ]Ç}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t
          ¦  «        r
d|dœg|d<   ŒLt          |t          ¦  «        rfg }|D ]Z}t          |t
          ¦  «        r|                     d|dœ¦  «         Œ0t          |t          ¦  «        r|                     |¦  «         Œ[|r||d<   ŒÈ|D ]†}t          |t          ¦  «        ro|                     d¦  «        dk    rV|                     d¦  «        }t          |t          ¦  «        r*|r(t          |d         t          ¦  «        rddi|d         d	<    nŒ‡|S )
Nr  r÷   r*  r  ri  r4  rÛ   Ú	ephemeralÚcache_control)r�  r   rb   rÚ   rƒ   rc   r  rÞ   )rX   rä  Úpreparedr  r  Únormalized_partsr  s          rZ   Ú_qwen_prepare_chat_messagesz#AIAgent._qwen_prepare_chat_messagesè  s§  € Ý”= Ñ.Ô.ˆØð 	ØˆOàð 	6ð 	6ˆCÝ˜c¥4Ñ(Ô(ð ØØ—g’g˜iÑ(Ô(ˆGÝ˜'¥3Ñ'Ô'ð 6Ø+1¸7Ð"CÐ"CÐ!D��I‘�Ý˜G¥TÑ*Ô*ð 
6ð $&Ð Ø#ð 6ð 6�DÝ! $­Ñ,Ô,ð 6Ø(×/Ò/¸ÈÐ0NÐ0NÑOÔOÐOÐOÝ# D­$Ñ/Ô/ð 6Ø(×/Ò/°Ñ5Ô5Ð5øØ#ð 6Ø%5�C˜	‘Nøð ð 	ð 	ˆCÝ˜#�tÑ$Ô$ð ¨¯ª°©¬¸HÒ)DÐ)DØŸ'š' )Ñ,Ô,�Ý˜g¥tÑ,Ô,ð I°ð I½ZÈÐPRÌÕUYÑ=ZÔ=Zð IØ4:¸KÐ3H�G˜B”K Ñ0Ø�øàˆr\   c                 ó¶  — |sdS |D ]Ç}t          |t          ¦  «        sŒ|                     d¦  «        }t          |t          ¦  «        r
d|dœg|d<   ŒLt          |t          ¦  «        rfg }|D ]Z}t          |t          ¦  «        r|                     d|dœ¦  «         Œ0t          |t          ¦  «        r|                     |¦  «         Œ[|r||d<   ŒÈ|D ]‡}t          |t          ¦  «        rp|                     d¦  «        dk    rW|                     d¦  «        }t          |t          ¦  «        r*|r(t          |d         t          ¦  «        rdd	i|d         d
<    dS ŒˆdS )u<   In-place variant â€” mutates an already-copied message list.Nr  r÷   r*  r  ri  r4  rÛ   ró  rô  )rb   rÚ   rƒ   rc   r  rÞ   )rX   r
  r  r  rö  r  s         rZ   Ú#_qwen_prepare_chat_messages_inplacez+AIAgent._qwen_prepare_chat_messages_inplace	  s›  € àð 	ØˆFàð 	6ð 	6ˆCÝ˜c¥4Ñ(Ô(ð ØØ—g’g˜iÑ(Ô(ˆGÝ˜'¥3Ñ'Ô'ð 
6Ø+1¸7Ð"CÐ"CÐ!D��I‘�Ý˜G¥TÑ*Ô*ð 6Ø#%Ð Ø#ð 6ð 6�DÝ! $­Ñ,Ô,ð 6Ø(×/Ò/¸ÈÐ0NÐ0NÑOÔOÐOÐOÝ# D­$Ñ/Ô/ð 6Ø(×/Ò/°Ñ5Ô5Ð5øØ#ð 6Ø%5�C˜	‘Nøàð 	ð 	ˆCÝ˜#�tÑ$Ô$ð ¨¯ª°©¬¸HÒ)DÐ)DØŸ'š' )Ñ,Ô,�Ý˜g¥tÑ,Ô,ð I°ð I½ZÈÐPRÌÕUYÑ=ZÔ=Zð IØ4:¸KÐ3H�G˜B”K Ñ0Ø��øð	ð 	r\   c                 óÞ	  — | j         dk    rÚ|                      ¦   «         }|                      |¦  «        }t          | dd¦  «        }|r|j        nd}t          | dd¦  «        }|�d| _        |                     | j        || j        |�|n| j	        | j
        | j        |                      ¦   «         |t          | dd¦  «        | j        pi                      d¦  «        dk    ¬¦
  «
        S | j         d	k    rd|                      ¦   «         }t          | d
d¦  «        pd}t          | dd¦  «        }|                     | j        || j        | j	        pd||¬¦  «        S | j         dk    rÑ|                      ¦   «         }	t          | j        d¦  «        pt          | j        d¦  «        }
| j        dk    p| j        dk    od| j        v }| j        dk    p
| j        dk    }|	                     | j        || j        | j
        t          | dd¦  «        | j	        | j        |
|||
r|                      ¦   «         nd¬¦  «        S |                      ¦   «         }	|                      ¦   «         }|                      ¦   «         }t          | j        d¦  «        pt          | j        d¦  «        }d| j        v }d| j        v }t          | j        d¦  «        p)t          | j        d¦  «        pt          | j        d¦  «        }	 ddlm}m}  || j        | j        ¦  «        }||u }|s|nd}n# t4          $ r d }d}Y nw xY wi }| j        r
| j        |d!<   | j        r
| j        |d"<   | j        r
| j        |d#<   | j        r
| j        |d$<   | j        rd%|d&<   | j         r
| j         |d'<   d}|s|rEd(| j        pd) !                    ¦   «         v r(	 dd*l"m#}  || j        ¦  «        }n# t4          $ r Y nw xY wd}|r*| j$        pd+tK          tM          j'        ¦   «         ¦  «        d,œ}t          | dd¦  «        }|�d| _        |	                     | j        || j        |  (                    ¦   «         | j	        || j)        | j
        | j        t          | dd¦  «        | j        pd) !                    ¦   «         ||||||| j        d-k    | j*        |pd|r| j+        nd|r| j,        nd||||  -                    ¦   «         |r|                      ¦   «         nd|¬.¦  «        S )/z9Build the keyword arguments dict for the active API mode.r¸  rk  NÚ_ephemeral_max_output_tokensrÅ  ÚspeedÚfast)
r‚  r
  rR  rŸ  r   Úis_oauthÚpreserve_dotsrT  rˆ   Ú	fast_moder¶  rÃ  rà  rÉ  é   )r‚  r
  rR  rŸ  r³  Úguardrail_configrµ  úmodels.github.airü  r¹  r»  r¼  rº  r½  r“  )r‚  r
  rR  r   r“  rŸ  r¢  Úis_github_responsesÚis_codex_backendÚis_xai_responsesÚgithub_reasoning_extraÚnousresearchzintegrate.api.nvidia.comrÿ  úmoonshot.aiúmoonshot.cnr   ©Ú_fixed_temperature_for_modelÚOMIT_TEMPERATUREFÚonlyrJ  ÚorderÚsortTÚrequire_parametersÚdata_collectionr  r€   )Ú_get_anthropic_max_outputr@  )Ú	sessionIdÚpromptIdr	  )r‚  r
  rR  rä  rŸ  Úephemeral_max_output_tokensÚmax_tokens_param_fnr   r¢  r“  ré  rì  Úis_nousÚis_qwen_portalÚis_github_modelsÚis_nvidia_nimÚis_kimiÚis_custom_providerrp  Úprovider_preferencesÚqwen_prepare_fnÚqwen_prepare_inplace_fnÚqwen_session_metadataÚfixed_temperatureÚomit_temperatureÚsupports_reasoningr  Úanthropic_max_output).r}  r‹  rè  ro   rT  rû  Úbuild_kwargsr‚  rR  rŸ  r   rÀ  rï  r¢  rƒ   rN   rˆ   r|  rv  ru  Ú#_github_models_reasoning_extra_bodyrñ  r’  rÌ  r  r  r�   r�  rŽ  r�  r�  r‘  r’  rj  rÁ  r  r“  rc   rÛ  rÜ  rÉ  rû  r  r÷  rù  Ú_supports_reasoning_extra_body)rX   rä  r  r¸  Úctx_lenÚephemeral_outÚ_btr³  rè  Ú_ctr  r  r  Ú_is_qwenÚ_is_orÚ_is_ghÚ_is_nousÚ
_is_nvidiaÚ_is_kimir  r  Ú_ftÚ
_omit_tempÚ_fixed_tempÚ_prefsÚ_ant_maxr  Ú
_qwen_metaÚ_ephemeral_outs                                rZ   Ú_build_api_kwargszAIAgent._build_api_kwargs%  s  € àŒ=Ð0Ò0Ð0Ø×,Ò,Ñ.Ô.ˆJØ!%×!IÒ!IÈ,Ñ!WÔ!WÐÝ˜dÐ$8¸$Ñ?Ô?ˆGØ07ÐA�gÔ,Ð,¸TˆGÝ# DÐ*HÈ$ÑOÔOˆMØÐ(Ø48�Ô1Ø×*Ò*Ø”jØ+Ø”jØ,9Ð,E˜=˜=È4Ì?Ø!%Ô!6ØÔ1Ø"×;Ò;Ñ=Ô=Ø&Ý  Ð'<¸dÑCÔCØÔ1Ð7°R×<Ò<¸WÑEÔEÈÒOð +ñ ô ð ð Œ=Ð.Ò.Ð.Ø×%Ò%Ñ'Ô'ˆCÝ˜TÐ#4°dÑ;Ô;ÐJ¸{ˆFÝ Ð&AÀ4ÑHÔHˆIØ×#Ò#Ø”jØ%Ø”jØœ?Ð2¨dØØ!*ð $ñ ô ð ð Œ=Ð-Ò-Ð-Ø×%Ò%Ñ'Ô'ˆCå% d¤mÐ5GÑHÔHð QÝ(¨¬Ð8OÑPÔPð  ð
 ” Ò/ð àÔ+¨}Ò<ð EØ,°Ô0DÐDð	 ð  $œ}°Ò5Ð^¸Ô9PÐT^Ò9^ÐØ×#Ò#Ø”jØ%Ø”jØ!%Ô!6Ý" 4¨°tÑ<Ô<Øœ?Ø"&Ô"8Ø$7Ø!1Ø!1ØUhÐ'r t×'OÒ'OÑ'QÔ'QÐ'QÐnrð $ñ ô ð ð ×!Ò!Ñ#Ô#ˆð ×'Ò'Ñ)Ô)ˆØ×(Ò(Ñ*Ô*ˆå! $Ô"6Ð8JÑKÔKð TÝ$ TÔ%9Ð;RÑSÔSð 	ð " TÔ%9Ð9ˆØ/°4Ô3GÐGˆ
å! $¤-°Ñ@Ô@ð CÝ$ T¤]°MÑBÔBðCå$ T¤]°MÑBÔBð 	ð	Ø]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ø.Ð.¨t¬z¸4¼=ÑIÔIˆCØÐ 0Ð0ˆJØ%/Ð9˜#˜#°TˆKˆKøÝð 	ð 	ð 	ØˆJØˆKˆKˆKð	øøøð
 "$ˆØÔ!ð 	4Ø!Ô3ˆF�6‰NØÔ!ð 	6Ø#Ô5ˆF�8ÑØÔð 	3Ø"Ô2ˆF�7‰OØÔð 	0Ø!Ô/ˆF�6‰NØÔ+ð 	0Ø+/ˆFÐ'Ñ(ØÔ(ð 	FØ(,Ô(EˆFÐ$Ñ%ð ˆØð 	�hð 	 H°´Ð1A¸r×0HÒ0HÑ0JÔ0JÐ$JÐ$JðØMÐMÐMÐMÐMÐMØ4Ð4°T´ZÑ@Ô@��øÝð ð ð Ø�ðøøøð ˆ
Øð 	à!œ_Ð8°Ý¥¤
¡¤Ñ-Ô-ðð ˆJõ ! Ð'EÀtÑLÔLˆØÐ%Ø04ˆDÔ-à×ÒØ”*Ø!Ø”*Ø×3Ò3Ñ5Ô5Ø”Ø(6Ø $Ô 6Ø!Ô2Ø"Ô4Ý˜t \°4Ñ8Ô8ØœÐ) r×0Ò0Ñ2Ô2Ø ØØ#Ø#Ø$ØØ#œ}°Ò8ØÔ/Ø!' ¨4Ø@HÐR˜DÔ<Ð<ÈdØPXÐ$b DÔ$LÐ$LÐ^bØ",Ø)Ø'Ø#×BÒBÑDÔDØQWÐ#a 4×#KÒ#KÑ#MÔ#MÐ#MÐ]aØ!)ð9  ñ 
ô 
ð 	
s$   Ë)(L ÌL#Ì"L#Î-O Ï
OÏOc                 óº  ‡— t          | j        d¦  «        rdS t          | j        d¦  «        rdS t          | j        d¦  «        st          | j        d¦  «        r5	 ddlm} t	           || j        ¦  «        ¦  «        S # t          $ r Y dS w xY wd	| j        vrdS d
| j        v rdS | j        pd                     ¦   «         Šd}t          ˆfd„|D ¦   «         ¦  «        S )a3  Return True when reasoning extra_body is safe to send for this route/model.

        OpenRouter forwards unknown extra_body fields to upstream providers.
        Some providers/routes reject `reasoning` with 400s, so gate it to
        known reasoning-capable model families and direct Nous Portal.
        znousresearch.comTr–  r  rü  r   ©Úgithub_model_reasoning_effortsFrË  zapi.mistral.air€   )z	deepseek/z
anthropic/zopenai/zx-ai/zgoogle/gemini-2z
qwen/qwen3c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S rg   )rŠ  )rÉ   rÊ  r‚  s     €rZ   rÎ   z9AIAgent._supports_reasoning_extra_body.<locals>.<genexpr>ì  s1   øè è € ÐSÐS°�5×#Ò# FÑ+Ô+ÐSÐSÐSÐSÐSÐSr\   )	rN   ru  rË  r=  r­   r‚  r�   rj  rÔ   )rX   r=  Úreasoning_model_prefixesr‚  s      @rZ   r(  z&AIAgent._supports_reasoning_extra_bodyÉ  s(  ø€ õ ! Ô!5Ð7IÑJÔJð 	Ø�4Ý  Ô!5Ð7MÑNÔNð 	Ø�4å! $Ô"6Ð8JÑKÔKð		å$ TÔ%9Ð;RÑSÔSð		ðØLÐLÐLÐLÐLÐLåÐ:Ð:¸4¼:ÑFÔFÑGÔGÐGøÝð ð ð Ø�u�uðøøøà˜tÔ3Ð3Ð3Ø�5Ø˜tÔ3Ð3Ð3Ø�5à”Ð!˜r×(Ò(Ñ*Ô*ˆð$
Ð õ ÐSÐSÐSÐSÐ:RÐSÑSÔSÑSÔSÐSs   Á"A> Á>
BÂBc                 óÚ  — 	 ddl m} n# t          $ r Y dS w xY w || j        ¦  «        }|sdS | j        r…t          | j        t          ¦  «        rk| j                             d¦  «        du rdS t          | j                             dd¦  «        ¦  «         	                    ¦   «          
                    ¦   «         }nd}|dk    rd	|v rd	}n ||vr|d
k    rd|v rd}nd|v rd}n|d         }d|iS )zDFormat reasoning payload for GitHub Models/OpenAI-compatible routes.r   r<  Nr*  FÚeffortÚmediumÚxhighÚhighÚminimalÚlow)rË  r=  r�   r‚  r   rb   rÚ   rƒ   rc   r„   rj  )rX   r=  Úsupported_effortsÚrequested_efforts       rZ   r'  z+AIAgent._github_models_reasoning_extra_bodyî  sZ  € ð	ØHÐHÐHÐHÐHÐHÐHøÝð 	ð 	ð 	Ø�4�4ð	øøøð ;Ð:¸4¼:ÑFÔFÐØ ð 	Ø�4àÔ ð 	(¥Z°Ô0EÅtÑ%LÔ%Lð 	(ØÔ$×(Ò(¨Ñ3Ô3°uÐ<Ð<Ø�tÝ"ØÔ%×)Ò)¨(°HÑ=Ô=ñ ô  çŠe‰gŒg—e’e‘g”gð Ðð  (Ðà˜wÒ&Ð&¨6Ð5FÐ+FÐ+FØ%ÐÐØÐ%6Ð6Ð6Ø 9Ò,Ð,°Ð:KÐ1KÐ1KØ#(Ð Ð ØÐ.Ð.Ð.Ø#+Ð Ð à#4°QÔ#7Ð àÐ*Ð+Ð+s   ‚	 ‰
–c                 óâ	  — |                       |¦  «        }t          |¦  «        }|sO|j        pd}t          j        d|t          j        ¬¦  «        }|r#d                     d„ |D ¦   «         ¦  «        }|pd}|r.| j        r't          j	        dt          |¦  «        › d|› �¦  «         |r<| j        r5| j        s.| j        s'	 |                      |¦  «         n# t          $ r Y nw xY w|j        pd}t          |¦  «        }	|rt          |¦  «        }t!          |	t"          ¦  «        r)|	r'|                      |	¦  «                             ¦   «         }	d	|	||d
œ}
t)          |d¦  «        rTt+          |dd¦  «        }|�t          |¦  «        |
d<   n.|
                     d¦  «        r|                      ¦   «         rd|
d<   t)          |d¦  «        r©|j        r¢|j        }g }|D ]�}t!          |t2          ¦  «        r|                     |¦  «         Œ-t)          |d¦  «        r|                     |j        ¦  «         ŒXt)          |d¦  «        r'|                     |                     ¦   «         ¦  «         Œ�|r||
d<   t+          |dd¦  «        }|r||
d<   t+          |dd¦  «        }|r||
d<   |j        �rHg }|j        D �]8}t+          |dd¦  «        }t+          |dd¦  «        }t!          |t"          ¦  «        r|                     ¦   «         s|                      |¦  «        \  }}|}t!          |t"          ¦  «        r|                     ¦   «         s�t!          |t"          ¦  «        r)|                     ¦   «         r|                     ¦   «         }n_t+          |dd¦  «        }|rt+          |dd¦  «        nd}|rt+          |dd¦  «        nd}|                      ||t          |¦  «        ¦  «        }|                     ¦   «         }t+          |dd¦  «        }t!          |t"          ¦  «        r|                     ¦   «         s|                      |¦  «        \  }}|}|                       |t!          |t"          ¦  «        r|nd¦  «        }||||j!        |j"        j#        |j"        j$        dœdœ}t+          |dd¦  «        }|�)t)          |d¦  «        r|                     ¦   «         }||d<   |                     |¦  «         �Œ:||
d<   |
S )zôBuild a normalized assistant message dict from an API response message.

        Handles reasoning extraction, reasoning_details, and optional tool_calls
        so both the tool-call path and the final-response path share one builder.
        r€   rJ  r  rK  c              3   óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S rg   r‚  )rÉ   Úbs     rZ   rÎ   z3AIAgent._build_assistant_message.<locals>.<genexpr>  s7   è è € Ð&TÐ&T°QÈ!Ï'Ê'É)Ì)Ð&T q§w¢w¡y¤yÐ&TÐ&TÐ&TÐ&TÐ&TÐ&Tr\   NzCaptured reasoning (ú	 chars): r”  )r  r  rE  r  rF  rà   rG  Ú__dict__r  r•  r–  r  rÛ  rÇ   rp   r×   r(  rÜ  r“  )r  rÛ  rÜ  rÛ   rÇ   r  )%rQ  r­   r  r;  rL  r  r  rˆ  rØ   rÙ   rd   r˜  r›  r¹  r�   rý   rb   rc   rý  r„   r�  ro   rƒ   Ú_needs_deepseek_tool_reasoningrG  rÚ   rÞ   rM  r  rà   rC   rB   rA   rÛ   rÇ   rp   r×   )rX   r  r  rb  Ú_from_structuredr  Úthink_blocksÚcombinedÚ_raw_contentÚ_san_contentr  Úraw_reasoning_contentÚraw_detailsÚ	preservedÚdÚcodex_itemsr–  rà   rã   rØ  rÛ  Úembedded_call_idrE  Ú_fnÚ_fn_nameÚ_fn_argsrÜ  Úembedded_response_item_idÚtc_dictrÏ  s                                 rZ   Ú_build_assistant_messagez AIAgent._build_assistant_message  sÒ  € ð ×0Ò0Ð1BÑCÔCˆÝ Ñ/Ô/Ðð
 ð 	2Ø'Ô/Ð5°2ˆGÝœ:Ð&=¸wÍbÌiÐXÑXÔXˆLØð 2Ø!Ÿ;š;Ð&TÐ&T¸,Ð&TÑ&TÔ&TÑTÔT�Ø!)Ð!1¨T�àð 	a˜dÔ2ð 	aÝŒMÐ_µ°^Ñ1DÔ1DÐ_Ð_È~Ð_Ð_Ñ`Ô`Ð`àð 	˜dÔ5ð 	ð Ô-ð °dÔ6Kð ðØ×+Ò+¨NÑ;Ô;Ð;Ð;øÝ ð ð ð Ø�Dðøøøð
 )Ô0Ð6°BˆÝ+¨LÑ9Ô9ˆØð 	BÝ1°.ÑAÔAˆNõ �l¥CÑ(Ô(ð 	J¨\ð 	JØ×3Ò3°LÑAÔA×GÒGÑIÔIˆLð  Ø#Ø'Ø*ð	
ð 
ˆõ Ð$Ð&9Ñ:Ô:ð 		.Ý$+Ð,=Ð?RÐTXÑ$YÔ$YÐ!Ø$Ð0Ý+?Ð@UÑ+VÔ+V�Ð'Ñ(Ð(Ø—’˜Ñ&Ô&ð .¨4×+NÒ+NÑ+PÔ+Pð .ð
 ,.�Ð'Ñ(åÐ$Ð&9Ñ:Ô:ð 	5Ð?PÔ?bð 	5ð
 ,Ô=ˆKØˆIØ ð 5ð 5�Ý˜a¥Ñ&Ô&ð 5Ø×$Ò$ QÑ'Ô'Ð'Ð'Ý˜Q 
Ñ+Ô+ð 5Ø×$Ò$ Q¤ZÑ0Ô0Ð0Ð0Ý˜Q Ñ-Ô-ð 5Ø×$Ò$ Q§\¢\¡^¤^Ñ4Ô4Ð4øØð 5Ø+4�Ð'Ñ(õ Ð/Ð1HÈ$ÑOÔOˆØð 	7Ø+6ˆCÐ'Ñ(õ
 &Ð&7Ð9NÐPTÑUÔUÐØð 	=Ø)<ˆCÐ%Ñ&àÔ'ñ /	+ØˆJØ.Ô9ð ,+ñ ,+�	Ý  ¨D°$Ñ7Ô7�Ý! )¨Y¸Ñ=Ô=�Ý! '­3Ñ/Ô/ð /°w·}²}±´ð /Ø*.×*GÒ*GÈÑ*OÔ*OÑ'Ð$ aØ.�GÝ! '­3Ñ/Ô/ð c°w·}²}±´ð cÝ! &­#Ñ.Ô.ð c°6·<²<±>´>ð cØ"(§,¢,¡.¤.˜˜å% i°¸TÑBÔB˜Ø?BÐ#J¥7¨3°¸Ñ#;Ô#;Ð#;È˜ØFIÐ#S¥7¨3°¸TÑ#BÔ#BÐ#BÈt˜Ø"&×"=Ò"=¸hÈÕRUÐV`ÑRaÔRaÑ"bÔ"b˜Ø!Ÿ-š-™/œ/�å#*¨9Ð6HÈ$Ñ#OÔ#OÐ Ý!Ð"2µCÑ8Ô8ð AÐ@P×@VÒ@VÑ@XÔ@Xð AØ37×3PÒ3PÐQWÑ3XÔ3XÑ0�AÐ0Ø'@Ð$à#'×#JÒ#JØÝ(2Ð3CÅSÑ(IÔ(IÐSÐ$Ð$Ètñ$ô $Ð ð "Ø&Ø(8Ø%œNà )Ô 2Ô 7Ø%.Ô%7Ô%Að!ð !ð	ð 	�õ   	¨?¸DÑAÔA�ØÐ$Ý˜u lÑ3Ô3ð 3Ø %× 0Ò 0Ñ 2Ô 2˜Ø/4�G˜OÑ,Ø×!Ò! 'Ñ*Ô*Ð*Ñ*Ø *ˆC�Ñàˆ
s   Â>C Ã
C!Ã C!c                 ó’   — | j         dv p>t          | j        d¦  «        p)t          | j        d¦  «        pt          | j        d¦  «        S )a  Return True when the current provider is Kimi / Moonshot thinking mode.

        Kimi ``/coding`` and Moonshot thinking mode both require
        ``reasoning_content`` on every assistant tool-call message; omitting
        it causes the next replay to fail with HTTP 400.
        >   úkimi-codingúkimi-coding-cnrÿ  r	  r
  )r|  rN   rˆ   ri   s    rZ   Ú_needs_kimi_tool_reasoningz"AIAgent._needs_kimi_tool_reasoning«  sU   € ð ŒMÐ>Ð>ð CÝ$ T¤]°NÑCÔCðCå$ T¤]°MÑBÔBðCõ % T¤]°MÑBÔBð		
r\   c                 ó¬   — | j         pd                     ¦   «         }| j        pd                     ¦   «         }|dk    pd|v pt          | j        d¦  «        S )a  Return True when the current provider is DeepSeek thinking mode.

        DeepSeek V4 thinking mode requires ``reasoning_content`` on every
        assistant tool-call turn; omitting it causes HTTP 400 when the
        message is replayed in a subsequent API request (#15250).
        r€   Údeepseekzapi.deepseek.com)r|  rj  r‚  rN   rˆ   )rX   r|  r‚  s      rZ   rN  z&AIAgent._needs_deepseek_tool_reasoning¹  se   € ð ”MÐ' R×.Ò.Ñ0Ô0ˆØ”Ð!˜r×(Ò(Ñ*Ô*ˆà˜
Ò"ð HØ˜UÐ"ðHå$ T¤]Ð4FÑGÔGð	
r\   Ú
source_msgÚapi_msgc                 ó  — |                      d¦  «        dk    rdS |                      d¦  «        }t          |t          ¦  «        r||d<   dS |                      d¦  «        }t          |t          ¦  «        r	|r||d<   dS |                      d¦  «        o'|                      ¦   «         p|                      ¦   «         }|rd|d<   dS |                      ¦   «         s|                      ¦   «         rd|d<   dS |                     dd¦  «         dS )zACopy provider-facing reasoning fields onto an API replay message.r  r”  NrF  rE  rà   r€   )rƒ   rb   rc   rc  rN  rë  )rX   rf  rg  rÒ   Únormalized_reasoningÚneeds_empty_reasonings         rZ   Ú_copy_reasoning_content_for_apiz'AIAgent._copy_reasoning_content_for_apiÈ  sD  € à�>Š>˜&Ñ!Ô! [Ò0Ð0ØˆFð
 —>’>Ð"5Ñ6Ô6ˆÝ�h¥Ñ$Ô$ð 	Ø+3ˆGÐ'Ñ(ØˆFð  *Ÿ~š~¨kÑ:Ô:ÐÝÐ*­CÑ0Ô0ð 	Ð5Ið 	Ø+?ˆGÐ'Ñ(ØˆFð �NŠN˜<Ñ(Ô(ð à×/Ò/Ñ1Ô1ð 9Ø×6Ò6Ñ8Ô8ð	 	ð !ð 	Ø+-ˆGÐ'Ñ(ØˆFð ×+Ò+Ñ-Ô-ð	à×2Ò2Ñ4Ô4ð	ð ,.ˆGÐ'Ñ(ØˆFð 	�ŠÐ'¨Ñ.Ô.Ð.Ð.Ð.r\   c                 óŠ   ‡— |                       d¦  «        }t          |t          ¦  «        s| S ddhŠˆfd„|D ¦   «         | d<   | S )u×  Strip Codex Responses API fields from tool_calls for strict providers.

        Providers like Mistral, Fireworks, and other strict OpenAI-compatible APIs
        validate the Chat Completions schema and reject unknown fields (call_id,
        response_item_id) with 400 or 422 errors. These fields are preserved in
        the internal message history â€” this method only modifies the outgoing
        API copy.

        Creates new tool_call dicts rather than mutating in-place, so the
        original messages list retains call_id/response_item_id for Codex
        Responses API compatibility (e.g. if the session falls back to a
        Codex provider later).

        Fields stripped: call_id, response_item_id
        rà   rÛ  rÜ  c                 ó~   •— g | ]9}t          |t          ¦  «        r ˆfd „|                     ¦   «         D ¦   «         n|‘Œ:S )c                 ó$   •— i | ]\  }}|‰v¯	||“ŒS rw   rw   )rÉ   rô  rõ  Ú_STRIP_KEYSs      €rZ   rö  zJAIAgent._sanitize_tool_calls_for_strict_api.<locals>.<listcomp>.<dictcomp>  s)   ø€ ÐAÐAÐA‘d�a˜¨A°[Ð,@Ð,@ˆQ�Ð,@Ð,@Ð,@r\   )rb   rÚ   r  )rÉ   rÊ   ro  s     €rZ   rË   z?AIAgent._sanitize_tool_calls_for_strict_api.<locals>.<listcomp>  s_   ø€ ð !
ð !
ð !
ð õ ˜"�dÑ#Ô#ð,ÐAÐAÐAÐA˜bŸhšh™jœjÐAÑAÔAÐAØ)+ð!
ð !
ð !
r\   )rƒ   rb   r  )rg  rà   ro  s     @rZ   Ú#_sanitize_tool_calls_for_strict_apiz+AIAgent._sanitize_tool_calls_for_strict_apiý  sn   ø€ ð" —[’[ Ñ.Ô.ˆ
Ý˜*¥dÑ+Ô+ð 	ØˆNØ Ð"4Ð5ˆð!
ð !
ð !
ð !
ð !ð!
ñ !
ô !
ˆ�Ñð
 ˆr\   ©r6  r“  c          
      ó¾  ‡— |pt          j        t          ¦  «        }t          | t          ¦  «        sdS d}t
          j        Šdt          ddfˆfd„}d}|t          | ¦  «        k     �rv| |         }t          |t          ¦  «        r| 	                    d¦  «        dk    r|dz  }ŒP| 	                    d	¦  «        }t          |t          ¦  «        r|s|dz  }Œ‚|dz   }	|D �]æ}
t          |
t          ¦  «        sŒ|
 	                    d
¦  «        }t          |t          ¦  «        sŒD| 	                    d¦  «        }|�|dk    rd|d<   Œgt          |t          ¦  «        r|                     ¦   «         sd|d<   Œ–t          |t          ¦  «        sŒ¬	 t          j        |¦  «         ŒÂ# t          j        $ �r |
 	                    d¦  «        }| 	                    dd¦  «        }|dd…         }|                     d|pd||pd||¦  «         d|d<   d}|dz   }|t          | ¦  «        k     rk| |         }t          |t          ¦  «        r| 	                    d¦  «        dk    rn4| 	                    d¦  «        |k    r|}n|dz  }|t          | ¦  «        k     °k|€ |                      |	d|‰dœ¦  «         |	dz  }	n ||¦  «         |dz  }Y �Œäw xY w|dz  }|t          | ¦  «        k     �°v|S )z<Repair corrupted assistant tool-call argument JSON in-place.r   r·  rx   Nc                 ó>  •— |                       d¦  «        }t          |t          ¦  «        r)|s‰| d<   n|                     ‰¦  «        s
‰› d|› �| d<   d S |€‰| d<   d S 	 t	          j        |¦  «        }n# t          $ r t          |¦  «        }Y nw xY w‰› d|› �| d<   d S )Nr  r¯  )rƒ   rb   rc   rŠ  rÕ   r8  r:  )r·  rÒ   Úexisting_textr7  s      €rZ   Ú_prepend_markerz>AIAgent._sanitize_tool_call_arguments.<locals>._prepend_marker(  sã   ø€ Ø—|’| IÑ.Ô.ˆHÝ˜(¥CÑ(Ô(ð Øð BØ*0�H˜YÑ'Ð'Ø!×,Ò,¨VÑ4Ô4ð BØ-3Ð*AÐ*A°xÐ*AÐ*A�H˜YÑ'Ø�ØÐØ&,�˜Ñ#Ø�ð.Ý $¤
¨8Ñ 4Ô 4��øÝð .ð .ð .Ý # H¡¤���ð.øøøà%+Ð">Ð">¨}Ð">Ð">ˆH�YÑÐÐs   ÁA4 Á4BÂBr  r”  r¢   rà   rÇ   r×   r€   r(  r  rp   r%  r5  z~Corrupted tool_call arguments repaired before request (session=%s, message_index=%s, tool_call_id=%s, function=%s, preview=%r)rÀ  r  rY  ©r  rY  r  )rØ   r¶  rr   rb   r  rp  Ú&_TOOL_CALL_ARGUMENTS_CORRUPTION_MARKERrÚ   rd   rƒ   rc   r„   rÕ   rÖ   r9  r7  Úinsert)r
  r6  r“  Úlogr7  ru  Úmessage_indexr  rà   Ú	insert_atrã   rÇ   r×   rY  Úfunction_nameÚpreviewÚexisting_tool_msgÚ
scan_indexÚ	candidater7  s                      @rZ   Ú_sanitize_tool_call_argumentsz%AIAgent._sanitize_tool_call_arguments  s  ø€ ð Ð3�Ô)­(Ñ3Ô3ˆÝ˜(¥DÑ)Ô)ð 	Ø�1àˆÝÔ?ˆð	?¥dð 	?¨tð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð" ˆØ�c (™mœmÒ+Ñ+Ø˜=Ô)ˆCÝ˜c¥4Ñ(Ô(ð ¨C¯GªG°F©O¬O¸{Ò,JÐ,JØ Ñ"�ØàŸš Ñ.Ô.ˆJÝ˜j­$Ñ/Ô/ð °zð Ø Ñ"�Øà%¨Ñ)ˆIØ'ð :"ñ :"�	Ý! )­TÑ2Ô2ð ØØ$Ÿ=š=¨Ñ4Ô4�Ý! (­DÑ1Ô1ð Øà$ŸLšL¨Ñ5Ô5�	ØÐ$¨	°Rª¨Ø,0�H˜[Ñ)ØÝ˜i­Ñ-Ô-ð °i·o²oÑ6GÔ6Gð Ø,0�H˜[Ñ)ØÝ! )­SÑ1Ô1ð Øð)"Ý”J˜yÑ)Ô)Ð)Ð)øÝÔ+ð '"ñ '"ð '"Ø#,§=¢=°Ñ#6Ô#6�LØ$,§L¢L°¸Ñ$=Ô$=�MØ'¨¨¨œn�GØ—K’Kðcà"Ð) cØ%Ø$Ð+¨Ø%Øñô ð ð -1�H˜[Ñ)à(,Ð%Ø!.°Ñ!2�JØ$¥s¨8¡}¤}Ò4Ð4Ø$,¨ZÔ$8˜	Ý)¨)µTÑ:Ô:ð "¸i¿mºmÈFÑ>SÔ>SÐW]Ò>]Ð>]Ø!Ø$Ÿ=š=¨Ñ8Ô8¸LÒHÐHØ09Ð-Ø!Ø" a™˜
ð %¥s¨8¡}¤}Ò4Ð4ð )Ð0Ø ŸšØ%à(.Ø0<Ø+1ðð ñô ð ð " Q™˜	˜	à'˜Ð(9Ñ:Ô:Ð:à ‘M�H�H‘HðO'"øøøðR ˜QÑˆMðQ �c (™mœmÒ+Ñ+ðT ˆs   Æ	FÆDKË Kc                 ó   — | j         dk    S )a­  Determine if tool_calls need sanitization for strict APIs.

        Codex Responses API uses fields like call_id and response_item_id
        that are not part of the standard Chat Completions schema. These
        fields must be stripped when calling any other API to avoid
        validation errors (400 Bad Request).

        Returns:
            bool: True if sanitization is needed (non-Codex API), False otherwise.
        rµ  )r}  ri   s    rZ   Ú_should_sanitize_tool_callsz#AIAgent._should_sanitize_tool_calls†  s   € ð Œ}Ð 1Ò1Ð1r\   rû  )Úapprox_tokensrR  Úfocus_topicr„  r…  c                ó:  — t          |¦  «        }t                               d| j        pd||r|d›nd| j        |¦  «         | j        r,	 | j                             |¦  «         n# t          $ r Y nw xY w	 | j         	                    |||¬¦  «        }n,# t          $ r | j         	                    ||¬¦  «        }Y nw xY wt          | j        dd¦  «        }|r5t          | d	d¦  «        |k    r || _        |                      d
|› d�¦  «         | j                             ¦   «         }	|	r|                     d|	dœ¦  «         |                      ¦   «          |                      |¦  «        }
|
| _        | j        �rà	 | j                             | j        ¦  «        }|                      |¦  «         | j                             | j        d¦  «         | j        }t1          j        ¦   «                              d¦  «        › dt7          j        ¦   «         j        dd…         › �| _        | j        d| j        › d�z  | _        | j                              | j        | j!        ptD          j#         $                    dd¦  «        | j        |¬¦  «         |ru	 | j         %                    |¦  «        }| j         &                    | j        |¦  «         n9# tN          t          f$ r%}t           (                    d|¦  «         Y d}~nd}~ww xY w| j         )                    | j        |
¦  «         d| _*        n2# t          $ r%}t           +                    d|¦  «         Y d}~nd}~ww xY w| j        j,        }|dk    r"|  -                    | j.        › d|› d�d¬¦  «         t_          |
¦  «        ta          |¦  «        z   }|| j        _1        d| j        _2        	 ddl3m4}  ||¦  «         n# t          $ r Y nw xY wt                               d | j        pd|t          |¦  «        |d›¦  «         ||
fS )!u‹  Compress conversation context and split the session in SQLite.

        Args:
            focus_topic: Optional focus string for guided compression â€” the
                summariser will prioritise preserving information related to
                this topic.  Inspired by Claude Code's ``/compact <focus>``.

        Returns:
            (compressed_messages, new_system_prompt) tuple
        zPcontext compression started: session=%s messages=%d tokens=~%s model=%s focus=%rr  r,  ro  )Úcurrent_tokensr…  )r‡  Ú_last_summary_errorNÚ!_last_compression_summary_warningu    âš  Compression summary failed: z%. Inserted a fallback context marker.r_  ©r  r  rK  r   rE  r!  r%  r&  r,  r-  )r“  r.  r‚  r­  z,Could not propagate title on compression: %sr   uK   Session DB compression split failed â€” new session will NOT be indexed: %sr  u   âš ï¸�  Session compressed u>    times â€” accuracy may degrade. Consider /new to start fresh.Tr’  )Úreset_file_dedupz?context compression done: session=%s messages=%d->%d tokens=~%s)5rd   r6  rµ  r“  r‚  rö  Úon_pre_compressr�   rk  Úcompressr:  ro   r‰  r¨  rì  Úformat_for_injectionrÞ   rÔ  rœ  rä  rç  rü  rM  Úend_sessionr   rØ  rÚ  rÛ  rÜ  rÝ  rÞ  rà  rê  rg  r�   r‚   rƒ   Úget_next_title_in_lineageÚset_session_titlera   rÙ   Úupdate_system_promptré  r7  Úcompression_countr—  rŒ  r+   r,   Úlast_prompt_tokensÚlast_completion_tokensÚtools.file_toolsr‹  )rX   r
  rj  r„  rR  r…  Ú_pre_msg_countÚ
compressedÚsummary_errorÚtodo_snapshotÚnew_system_promptÚ	old_titleÚold_session_idÚ	new_titlerA  rv  Ú_compressed_estr‹  s                     rZ   Ú_compress_contextzAIAgent._compress_context“  s  € õ ˜X™œˆÝ�ŠØ^ØŒOÐ%˜v ~Ø$1Ð@ˆ}Ð Ð Ð °yÀ$Ä*Øñ		
ô 	
ð 	
ð Ôð 	ðØÔ$×4Ò4°XÑ>Ô>Ð>Ð>øÝð ð ð Ø�ðøøøð	bØÔ0×9Ò9¸(ÐS`ÐnyÐ9ÑzÔzˆJˆJøÝð 	bð 	bð 	bð Ô0×9Ò9¸(ÐS`Ð9ÑaÔaˆJˆJˆJð	bøøøõ
   Ô 7Ð9NÐPTÑUÔUˆØð 	Ý�tÐ@À$ÑGÔGÈ=ÒXÐXØ9F�Ô6Ø×"Ò"ð:°}ð :ð :ð :ñô ð ð
 Ô(×=Ò=Ñ?Ô?ˆØð 	JØ×Ò v¸-ÐHÐHÑIÔIÐIà×&Ò&Ñ(Ô(Ð(Ø ×5Ò5°nÑEÔEÐØ%6ˆÔ"àÔñ 	qðqà Ô,×>Ò>¸t¼ÑOÔO�	à×*Ò*¨8Ñ4Ô4Ð4ØÔ ×,Ò,¨T¬_¸mÑLÔLÐLØ!%¤�Ý%-¤\¡^¤^×%<Ò%<¸_Ñ%MÔ%MÐ"fÐ"fÕPTÔPZÑP\ÔP\ÔP`ÐacÐbcÐacÔPdÐ"fÐ"f�”à(,¬Ð8YÀ4Ä?Ð8YÐ8YÐ8YÑ(Y�Ô%ØÔ ×/Ò/Ø#œØœ=ÐZ­B¬J¯NªNÐ;RÐTYÑ,ZÔ,ZØœ*Ø&4ð	 0ñ ô ð ð ð XðXØ$(Ô$4×$NÒ$NÈyÑ$YÔ$Y˜	ØÔ(×:Ò:¸4¼?ÈIÑVÔVÐVÐVøÝ&­	Ð2ð Xð Xð XÝŸšÐ%SÐUVÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøàÔ ×5Ò5°d´oÐGXÑYÔYÐYà,-�Ô)Ð)øÝð qð qð qÝ—’ÐlÐnoÑpÔpÐpÐpÐpÐpÐpÐpøøøøðqøøøð Ô%Ô7ˆØ�!Š8ˆ8Ø�LŠLØ”?ð Gð G¸sð Gð Gð Gàð ñ ô ð õ "Ð"3Ñ4Ô4Ý,¨ZÑ8Ô8ñ9ð 	ð 6EˆÔÔ2Ø9:ˆÔÔ6ð
	Ø9Ð9Ð9Ð9Ð9Ð9ØÐ˜WÑ%Ô%Ð%Ð%øÝð 	ð 	ð 	ØˆDð	øøøõ 	�ŠØMØŒOÐ%˜v ~µs¸:±´ØÐ"Ð"ñ	
ô 	
ð 	
ð
 Ð,Ð,Ð,sy   Á	A$ Á$
A1Á0A1Á5B Â&B<Â;B<Å8DL% Ê	:K ËL% ËK:ËK5Ë0L% Ë5K:Ë:*L% Ì%
MÌ/MÍMÏO Ï
O"Ï!O"Úeffective_task_idrB  c                 óÒ   — |j         }d| _        	 t          |¦  «        s|                      ||||¦  «        d| _        S |                      ||||¦  «        d| _        S # d| _        w xY w)a=  Execute tool calls from the assistant message and append results to messages.

        Dispatches to concurrent execution only for batches that look
        independent: read-only tools may always share the parallel path, while
        file reads/writes may do so only when their target paths do not overlap.
        TF)rà   r–  ræ   Ú_execute_tool_calls_sequentialÚ_execute_tool_calls_concurrent)rX   r  r
  r¡  rB  rà   s         rZ   Ú_execute_tool_callszAIAgent._execute_tool_calls   s•   € ð 'Ô1ˆ
ð !%ˆÔð
	*Ý1°*Ñ=Ô=ð Ø×:Ò:Ø% xÐ1BÀNñô ð %*ˆDÔ!Ð!ð	 ×6Ò6Ø! 8Ð->Àñô ð %*ˆDÔ!Ð!ø EˆDÔ!Ð)Ð)Ð)Ð)s   �&A ¾A Á	A&rå   c                 óf  — ddl m}  ||                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d	¦  «        |                     d
¦  «        | ¬¦	  «	        S )zÁSingle call site for delegate_task dispatch.

        New DELEGATE_TASK_SCHEMA fields only need to be added here to reach all
        invocation paths (concurrent, sequential, inline).
        r   )r±  Úgoalr[  ÚtoolsetsÚtasksrƒ  r~  r  r  )	r§  r[  r¨  r©  rƒ  r~  r  r  Úparent_agent)r²  r±  rƒ   )rX   rå   Ú_delegate_tasks      rZ   Ú_dispatch_delegate_taskzAIAgent._dispatch_delegate_task   s¼   € ð 	HÐGÐGÐGÐGÐGØˆ~Ø×"Ò" 6Ñ*Ô*Ø!×%Ò% iÑ0Ô0Ø"×&Ò& zÑ2Ô2Ø×#Ò# GÑ,Ô,Ø(×,Ò,Ð-=Ñ>Ô>Ø%×)Ò)¨-Ñ8Ô8Ø"×&Ò& zÑ2Ô2Ø×"Ò" 6Ñ*Ô*Øð

ñ 

ô 

ð 
	
r\   r|  c           
      ó¸  — d}	 ddl m}  ||||pd¬¦  «        }n# t          $ r Y nw xY w|�t          j        d|id¬¦  «        S |d	k    r@dd
lm}  ||                     d¦  «        |                     dd¦  «        | j        ¬¦  «        S |dk    ry| j	        st          j        dddœ¦  «        S ddl
m}	  |	|                     dd¦  «        |                     d¦  «        |                     dd¦  «        | j	        | j        ¬¦  «        S |dk    r÷|                     dd¦  «        }
ddlm}  ||                     d¦  «        |
|                     d¦  «        |                     d¦  «        | j        ¬¦  «        }| j        r„|                     d¦  «        dv rm	 | j                             |                     dd¦  «        |
|                     dd¦  «        |                      ||¬¦  «        ¬ ¦  «         n# t          $ r Y nw xY w|S | j        r5| j                             |¦  «        r| j                             ||¦  «        S |d!k    r@dd"lm}  ||                     d#d¦  «        |                     d$¦  «        | j        ¬%¦  «        S |d&k    r|                      |¦  «        S t3          ||||| j        pd| j        rt7          | j        ¦  «        ndd'¬(¦  «        S ))a@  Invoke a single tool and return the result string. No display logic.

        Handles both agent-level tools (todo, memory, etc.) and registry-dispatched
        tools. Used by the concurrent execution path; the sequential path retains
        its own inline invocation for backward-compatible display handling.
        Nr   ©Úget_pre_tool_call_block_messager€   r\  rÀ  Fr¤  Útodo©Ú	todo_toolrb  rc  ©rb  rc  Ústorer·   úSession database not available.©rZ  rÀ  ©r·   rð  Úrole_filterÚlimitrJ  ©rð  r¸  r¹  ÚdbÚcurrent_session_idr2  rÏ  ©Úmemory_toolÚactionr  Úold_text©r¿  rÏ  r  rÀ  r´  ©r   rÁ  ©rR  rY  ©rˆ  r¯   ©Úclarify_toolÚquestionr"  ©rÇ  r"  Úcallbackr±  T©rY  r“  Úenabled_toolsÚskip_pre_tool_call_hook)r  r¯  r�   rÕ   r8  rë  r²  rƒ   rì  rç  Útools.session_search_toolr·   r“  rô  r¾  rî  rö  Úon_memory_writer‰  Úhas_toolÚhandle_tool_callÚtools.clarify_toolrÆ  r™  r¬  r   rÖ  r  )rX   r|  rå   r¡  rY  r
  Úblock_messager¯  Ú
_todo_toolÚ_session_searchrÏ  Ú_memory_toolrÊ  Ú_clarify_tools                 rZ   Ú_invoke_toolzAIAgent._invoke_tool/   sÕ  € ð (,ˆð	ØJÐJÐJÐJÐJÐJØ;Ð;Ø˜}Ð6GÐ6MÈ2ðñ ô ˆMˆMøõ ð 	ð 	ð 	ØˆDð	øøøàÐ$Ý”:˜w¨Ð6ÀUÐKÑKÔKÐKà˜FÒ"Ð"Ø?Ð?Ð?Ð?Ð?Ð?Ø�:Ø#×'Ò'¨Ñ0Ô0Ø#×'Ò'¨°Ñ7Ô7ØÔ&ðñ ô ð ð
 Ð.Ò.Ð.ØÔ#ð bÝ”z¨eÐ>_Ð"`Ð"`ÑaÔaÐaØSÐSÐSÐSÐSÐSØ"�?Ø#×'Ò'¨°Ñ4Ô4Ø)×-Ò-¨mÑ<Ô<Ø#×'Ò'¨°Ñ3Ô3ØÔ#Ø#'¤?ðñ ô ð ð ˜hÒ&Ð&Ø"×&Ò& x°Ñ:Ô:ˆFØEÐEÐEÐEÐEÐEØ!�\Ø$×(Ò(¨Ñ2Ô2ØØ%×)Ò)¨)Ñ4Ô4Ø&×*Ò*¨:Ñ6Ô6ØÔ(ðñ ô ˆFð Ô#ð ¨×(9Ò(9¸(Ñ(CÔ(CÐGYÐ(YÐ(YðØÔ(×8Ò8Ø%×)Ò)¨(°BÑ7Ô7ØØ%×)Ò)¨)°RÑ8Ô8Ø!%×!BÒ!BØ$5Ø)5ð "Cñ "ô "ð	 9ñ ô ð ð øõ !ð ð ð Ø�DðøøøàˆMØÔ!ð 	 dÔ&:×&CÒ&CÀMÑ&RÔ&Rð 	ØÔ'×8Ò8¸ÈÑVÔVÐVØ˜iÒ'Ð'ØHÐHÐHÐHÐHÐHØ �=Ø&×*Ò*¨:°rÑ:Ô:Ø%×)Ò)¨)Ñ4Ô4ØÔ.ðñ ô ð ð
 ˜oÒ-Ð-Ø×/Ò/°Ñ>Ô>Ð>å'Ø˜}Ð.?Ø)Øœ?Ð0¨bØ=AÔ=RÐ\�d 4Ô#8Ñ9Ô9Ð9ÐX\Ø(,ðñ ô ð s   „ ›
(§(ÆAG5 Ç5
HÈHú     rh  rú  c                 ó®  — ddl }ddl}|                     d¦  «        j        }t	          d|t          |¦  «        z
  ¦  «        }g }|                     d¦  «        D ]\}t          |¦  «        |k    r|                     |¦  «         Œ+|                     ||dd¬¦  «        }	| 	                    |	p|g¦  «         Œ]d|z    
                    |¦  «        }
|› | › |
› �S )	aF  Word-wrap verbose tool output to fit the terminal width.

        Splits *text* on existing newlines and wraps each line individually,
        preserving intentional line breaks (e.g. pretty-printed JSON).
        Returns a ready-to-print string with *label* on the first line and
        continuation lines indented.
        r   N)r+  é   r  r¯  TF)ÚwidthÚbreak_long_wordsÚbreak_on_hyphens)ÚshutilÚtextwrapÚget_terminal_sizeÚcolumnsr©   rd   rÑ  rÞ   ÚwrapÚextendr  )rh  r÷   rú  Ú_shutilÚ_twÚcolsÚ
wrap_widthÚ	out_linesÚraw_lineÚwrappedrÄ  s              rZ   Ú_wrap_verbosezAIAgent._wrap_verbose‚   s  € ð 	!Ð Ð Ð ØÐÐÐØ×(Ò(¨Ñ3Ô3Ô;ˆÝ˜˜T¥C¨¡K¤KÑ/Ñ0Ô0ˆ
Ø!ˆ	ØŸ
š
 4Ñ(Ô(ð 	8ð 	8ˆHÝ�8‰}Œ} 
Ò*Ð*Ø× Ò  Ñ*Ô*Ð*Ð*àŸ(š( 8°:Ø48Ø49ð #ñ ;ô ;�ð × Ò  Ð!6¨X¨JÑ7Ô7Ð7Ð7Ø�v‘×#Ò# IÑ.Ô.ˆØÐ'˜%Ð' Ð'Ð'Ð'r\   c                 óP  ‡ ‡‡‡/‡0‡1— |j         }t          |¦  «        }‰ j        rMt          ‰ j        › d|› d�¦  «         |D ].}‰                     dd|j        j        › d�|j        dœ¦  «         Œ/dS g Š0|D �]¬}|j        j        }	|	dk    rd	‰ _	        n|	d
k    rd	‰ _
        	 t          j        |j        j        ¦  «        }
n# t          j        $ r i }
Y nw xY wt          |
t           ¦  «        si }
|	dv rn‰ j        j        rb	 |
                     dd¦  «        }|r8‰ j                             |¦  «        }‰ j                             |d|	› �¦  «         n# t,          $ r Y nw xY w|	dk    r¤‰ j        j        r˜	 |
                     dd¦  «        }t/          |¦  «        ra|
                     d¦  «        p%t1          j        dt1          j        ¦   «         ¦  «        }‰ j                             |d|dd…         › �¦  «         n# t,          $ r Y nw xY w‰0                     ||	|
f¦  «         �Œ®d                     d„ ‰0D ¦   «         ¦  «        }‰ j        �s#t          d|› d|› �¦  «         t;          ‰0d¦  «        D ]ý\  }\  }}}t          j        |d¬¦  «        }‰ j        rqt          d|› d|› dtA          | !                    ¦   «         ¦  «        › d�¦  «         t          ‰  "                    d t          j        |d!d¬"¦  «        ¦  «        ¦  «         Œ—t          |¦  «        ‰ j#        k    r|d‰ j#        …         d#z   n|}t          d|› d|› dtA          | !                    ¦   «         ¦  «        › d$|› �¦  «         Œþ‰0D ]e\  }}}‰ j$        rX	 tK          ||¦  «        }‰  $                    d%|||¦  «         Œ7# t,          $ r!}tM          j'        d&|› �¦  «         Y d}~Œ]d}~ww xY wŒf‰0D ]Y\  }}}‰ j(        rL	 ‰  (                    |j        ||¦  «         Œ+# t,          $ r!}tM          j'        d'|› �¦  «         Y d}~ŒQd}~ww xY wŒZdg|z  Š1|‰ _)        ‰  *                    d(|› d)|› �¦  «         ˆˆˆ1ˆ fd*„}d}‰  +                    ¦   «         rj‰  ,                    ¦   «         rVt[          j.        t_          j0        ¦   «         ¦  «        }t_          |› d+|› d,�d-‰ j1        ¬.¦  «        }| 2                    ¦   «          	 tg          |th          ¦  «        }tj          j6         7                    |¬/¦  «        5 }g Š/t;          ‰0¦  «        D ]7\  }\  }}}| 8                    |||||¦  «        }‰/                     |¦  «         Œ8ts          j9        ¦   «         }d}	 tj          j6         :                    ‰/d1¬2¦  «        \  }} | snÿ‰ j        rn|s1d0}‰  ;                    ‰ j        › d3t          | ¦  «        › d4�d0¬5¦  «         | D ]}| <                    ¦   «          Œtj          j6         :                    | d6¬2¦  «         nŠt{          ts          j9        ¦   «         |z
  ¦  «        }!|!d	k    r_|!d7z  d8k     rVˆ/ˆ0fd9„| D ¦   «         }"‰  *                    d:|!› d;t          | ¦  «        › d<d                     |"dd=…         ¦  «        › d�¦  «         �Œ&ddd¦  «         n# 1 swxY w Y   |rRt}          d>„ ‰1D ¦   «         ¦  «        }#t}          d?„ ‰1D ¦   «         ¦  «        }$| ?                    d@|#› dA|› dB|$dC›dD�¦  «         nZ# |rSt}          d>„ ‰1D ¦   «         ¦  «        }#t}          d?„ ‰1D ¦   «         ¦  «        }$| ?                    d@|#› dA|› dB|$dC›dD�¦  «         w w xY wt;          ‰0¦  «        D �]Ö\  }\  }}}‰1|         }%|%€‰ j        rd|› d�}&ndE|› dF�}&dG}'nâ|%\  }	}
}&}'}(|(r<t          |&¦  «        dHk    r
|&ddH…         n|&})t€           A                    dI|	|'|)¦  «         ‰ j$        rK	 ‰  $                    dJ|	dd|'|(¬K¦  «         n.# t,          $ r!}tM          j'        d&|› �¦  «         Y d}~nd}~ww xY w‰ j        rCtM          j'        dL|	› dM|'dN›dO�¦  «         tM          j'        dPt          |&¦  «        › dQ|&› �¦  «         ‰  +                    ¦   «         r,t…          |||'|&¬R¦  «        }*‰  C                    dS|*› �¦  «         n”‰ j        s�‰ j        r>t          dT|dz   › dM|'dN›dO�¦  «         t          ‰  "                    dU|&¦  «        ¦  «         nHt          |&¦  «        ‰ j#        k    r|&d‰ j#        …         d#z   n|&}+t          dT|dz   › dM|'dN›dV|+› �¦  «         d‰ _)        ‰  *                    dW|› dX|'dC›dY�¦  «         ‰ jD        rM	 ‰  D                    |j        |||&¦  «         n.# t,          $ r!}tM          j'        dZ|› �¦  «         Y d}~nd}~ww xY wt‹          |&||j        t�          ‰¦  «        ¬[¦  «        }&‰ jG         H                    ||¦  «        },|,r|&|,z  }&d|&|j        dœ}-‰                     |-¦  «         ‰  I                    ‰d¦  «         �ŒØt          ‰0¦  «        }|d	k    r)‰| d…         }.t•          |.t�          ‰¦  «        ¬\¦  «         |d	k    r‰  I                    ‰|¦  «         dS dS )]zÕExecute multiple tool calls concurrently using a thread pool.

        Results are collected in the original tool-call order and appended to
        messages so the API sees them in the expected sequence.
        õ   âš¡ Interrupt: skipping ú tool call(s)r  õ   [Tool execution cancelled â€” ú# was skipped due to user interrupt]r¥  Nr2  r   rl  ©r¼   r»   rè   r€   úbefore Úterminalr€  Úworkdirrl  úbefore terminal: r  r  c              3   ó"   K  — | ]
\  }}}|V — Œd S rg   rw   )rÉ   rE  rp   s      rZ   rÎ   z9AIAgent._execute_tool_calls_concurrent.<locals>.<genexpr>Ú   s(   è è € Ð"GÐ"G©J¨A¨t°Q 4Ð"GÐ"GÐ"GÐ"GÐ"GÐ"Gr\   u     âš¡ Concurrent: u    tool calls â€” r¢   Fr¤  õ     ðŸ“ž Tool rT  ú(re  úArgs: r  ©rú  r¥  ræ  ú) - útool.startedúTool progress callback error: úTool start callback error: z
executing z tools concurrently: c                 óî  •— t          j        ¦   «         j        }‰j        5  ‰j                             |¦  «         ddd¦  «         n# 1 swxY w Y   ‰j        r"	 t          d|¦  «         n# t          $ r Y nw xY w	 ddl	m
}  |‰j        ¦  «         n# t          $ r Y nw xY wt          j        ¦   «         }	 ‰                     ||‰|j        ‰¬¦  «        }n=# t          $ r0}d|› d|› �}t                               d||d¬	¦  «         Y d}~nd}~ww xY wt          j        ¦   «         |z
  }	t#          ||¦  «        \  }
}|
r&t                               d
||	|dd…         ¦  «         n*t                               d||	t'          |¦  «        ¦  «         ||||	|
f‰| <   ‰j        5  ‰j                             |¦  «         ddd¦  «         n# 1 swxY w Y   	 t          d|¦  «         dS # t          $ r Y dS w xY w)z%Worker function executed in a thread.NTr   ©Úset_activity_callback©r
  úError executing tool 'ú': z_invoke_tool raised for %s: %sr   ztool %s failed (%.2fs): %srÏ   ú#tool %s completed (%.2fs, %d chars)F)rž   rà  rá  r¡  r   r   r—  r  r�   Útools.environments.baser	  r4  r­  r×  r  r6  rÀ  rH   rµ  rd   Údiscard)rÕ  rã   r|  rå   Ú_worker_tidr	  r”  rÊ  Ú
tool_errorÚdurationÚis_errorrE  r¡  r
  ÚresultsrX   s               €€€€rZ   Ú	_run_toolz9AIAgent._execute_tool_calls_concurrent.<locals>._run_toolþ   sû  ø€ õ
 $Ô2Ñ4Ô4Ô:ˆKØÔ/ð ;ð ;ØÔ)×-Ò-¨kÑ:Ô:Ð:ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð Ô(ð ðÝ" 4¨Ñ5Ô5Ð5Ð5øÝ ð ð ð Ø�DðøøøðØIÐIÐIÐIÐIÐIØ%Ð% dÔ&:Ñ;Ô;Ð;Ð;øÝð ð ð Ø�ðøøøå”I‘K”KˆEðiØ×*Ò*¨=¸-ÐIZÐ\eÔ\hÐs{Ð*Ñ|Ô|��øÝð ið ið iØP°-ÐPÐPÀJÐPÐP�Ý—’Ð=¸}ÈjÐcg�ÑhÔhÐhÐhÐhÐhÐhÐhøøøøðiøøøõ ”y‘{”{ UÑ*ˆHÝ.¨}¸fÑEÔE‰KˆH�aØð iÝ—’Ð8¸-ÈÐSYÐZ^Ð[^ÐZ^ÔS_Ñ`Ô`Ð`Ð`å—’ÐAÀ=ÐRZÕ\_Ð`fÑ\gÔ\gÑhÔhÐhØ+¨]¸FÀHÈhÐWˆG�E‰Nð Ô/ð ?ð ?ØÔ)×1Ò1°+Ñ>Ô>Ð>ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?ðÝ˜u kÑ2Ô2Ð2Ð2Ð2øÝð ð ð Ø��ðøøøsq   ¡AÁAÁAÁA, Á,
A9Á8A9Á=B Â
B!Â B!Â8C Ã
DÃ"&DÄDÆ!GÇGÇGÇG& Ç&
G4Ç3G4u    âš¡ running z tools concurrentlyÚdots©Úspinner_typeÚprint_fn)Úmax_workersTç      @rã  u   âš¡ Interrupt: cancelling z pending concurrent tool(s)r’  g      @rö  r!  c                 óZ   •— g | ]'}|‰v ¯‰‰                      |¦  «                 d          ‘Œ(S )r¢   )rÕ  )rÉ   r  ÚfuturesÚparsed_callss     €€rZ   rË   z:AIAgent._execute_tool_calls_concurrent.<locals>.<listcomp>c!  s@   ø€ ð *ð *ð *à !Ø  G˜|˜|ð )¨¯ª°qÑ)9Ô)9Ô:¸1Ô=à+˜|˜|r\   zconcurrent tools running (zs, z remaining: rJ  c              3   ó   K  — | ]}|®dV — Œ	d S )Nr¢   rw   ©rÉ   Úrs     rZ   rÎ   z9AIAgent._execute_tool_calls_concurrent.<locals>.<genexpr>o!  s"   è è € ÐDÐD a°a°m °m°m°m°mÐDÐDr\   c              3   ó*   K  — | ]}|®|d         V — Œd S )NrJ  rw   r	  s     rZ   rÎ   z9AIAgent._execute_tool_calls_concurrent.<locals>.<genexpr>p!  s&   è è € ÐGÐG¨¸¸  !¤¸¸¸¸ÐGÐGr\   u   âš¡ rÀ  z tools completed in ú.1fzs totalr	  z!': thread did not return a resultrn  rÏ   ú"Tool %s returned error (%.2fs): %sútool.completed©r
	  r	  úTool ú completed in ú.2fr¾  úTool result (rL  ©rÊ  ú  õ     âœ… Tool úResult: ús - útool completed: rd  rÒ  úTool complete callback error: ©r  rä   Útool_use_idÚenv©r,	  )Krà   rd   r—  rÈ  rŒ  rÞ   rÇ   rp   r  rò  ró  rÕ   rÖ   r×   r9  rb   rÚ   ræ  r*  rƒ   Úget_working_dir_for_pathÚensure_checkpointr�   rÃ   r�   r  Úgetcwdr  r‰  r  r8  rˆ  r  Úkeysrë  r‹  r”  Ú_build_tool_previewrØ   rÙ   r•  r°  r4  rœ  rš  ÚrandomÚchoicerE   Úget_waiting_facesr†  r”  ró   Ú_MAX_TOOL_WORKERSÚ
concurrentr	  ÚThreadPoolExecutorÚsubmitr­  Úwaitr—  Úcancelr¬   r×  r  r6  r7  Ú_get_cute_tool_message_implr‘  r–  r   r   r  Úcheck_tool_callr1  r   )2rX   r  r
  r¡  rB  rà   Ú	num_toolsrÊ   rã   r|  rå   Ú	file_pathÚwork_dirr¾   rì   Útool_names_strr!  rp   r�  Úargs_strÚargs_previewr}  Úcb_errr	  ÚspinnerÚfacer	  Úexecutorr  Ú_conc_startÚ_interrupt_loggedrù  Únot_doneÚ_conc_elapsedÚ_still_runningr«  Ú	total_durr	  Úfunction_resultÚtool_durationr	  Úresult_previewÚcute_msgÚresponse_previewÚsubdir_hintsr·  Úturn_tool_msgsr	  r	  r	  s2   ` ``                                           @@@rZ   r¤  z&AIAgent._execute_tool_calls_concurrent›   s›  øøøøøø€ ð 'Ô1ˆ
Ý˜
‘O”Oˆ	ð Ô$ð 	Ý�T”_ÐVÐV¸iÐVÐVÐVÑWÔWÐWØ ð ð �Ø—’Ø"ØuÀÄÔ@PÐuÐuÐuØ$&¤Eð!ð !ñ ô ð ð ð
 ˆFð ˆØ#ð &	Kñ &	KˆIØ%Ô.Ô3ˆMð  Ò(Ð(Ø+,�Ô(Ð(Ø .Ò0Ð0Ø*+�Ô'ð#Ý $¤
¨9Ô+=Ô+GÑ HÔ H��øÝÔ'ð #ð #ð #Ø "���ð#øøøå˜m­TÑ2Ô2ð #Ø "�ð Ð 7Ð7Ð7¸DÔ<PÔ<XÐ7ðØ -× 1Ò 1°&¸"Ñ =Ô =�IØ ð dØ#'Ô#7×#PÒ#PÐQZÑ#[Ô#[˜ØÔ,×>Ò>¸xÐIbÐS`ÐIbÐIbÑcÔcÐcøøÝ ð ð ð Ø�Dðøøøð  
Ò*Ð*¨tÔ/CÔ/KÐ*ðØ'×+Ò+¨I°rÑ:Ô:�CÝ.¨sÑ3Ô3ð Ø+×/Ò/°	Ñ:Ô:Ðd½b¼iÈÕXZÔXaÑXcÔXcÑ>dÔ>d˜ØÔ,×>Ò>ØÐ!?°S¸¸"¸´XÐ!?Ð!?ñô ð øøõ !ð ð ð Ø�Dðøøøð ×Ò ¨M¸=Ð IÑJÔJÐJÑJð ŸšÐ"GÐ"G¸,Ð"GÑ"GÔ"GÑGÔGˆØŒñ 		\ÝÐR yÐRÐRÀ.ÐRÐRÑSÔSÐSÝ'0°¸qÑ'AÔ'Að \ð \Ñ#�Ñ#�B˜˜dÝœ: d¸Ð?Ñ?Ô?�ØÔ'ð \ÝÐI¨ÐIÐI¨dÐIÐIµT¸$¿)º)¹+¼+Ñ5FÔ5FÐIÐIÐIÑJÔJÐJÝ˜$×,Ò,¨Xµt´zÀ$ÈqÐ_dÐ7eÑ7eÔ7eÑfÔfÑgÔgÐgÐgåORÐS[É}Ì}Ð_cÔ_tÒOtÐOt 8Ð,B¨TÔ-BÐ,BÔ#CÀeÑ#KÐ#Kð  {C�LÝÐZ¨ÐZÐZ¨dÐZÐZµT¸$¿)º)¹+¼+Ñ5FÔ5FÐZÐZÈLÐZÐZÑ[Ô[Ð[Ð[à*ð 	Mð 	M‰NˆB��dØÔ*ð MðMÝ1°$¸Ñ=Ô=�GØ×/Ò/°ÀÀgÈtÑTÔTÐTÐTøÝ ð Mð Mð MÝ”MÐ"KÀ6Ð"KÐ"KÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð	Mð +ð 	Jð 	J‰NˆB��dØÔ'ð JðJØ×,Ò,¨R¬U°D¸$Ñ?Ô?Ð?Ð?øÝ ð Jð Jð JÝ”MÐ"HÀÐ"HÐ"HÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøðJð �&˜9Ñ$ˆð ,ˆÔØ×ÒÐZ¨)ÐZÐZÈ.ÐZÐZÑ[Ô[Ð[ð/	ð /	ð /	ð /	ð /	ð /	ð /	ð /	ðd ˆØ×0Ò0Ñ2Ô2ð 	°t×7WÒ7WÑ7YÔ7Yð 	Ý”=¥Ô!@Ñ!BÔ!BÑCÔCˆDÝ# tÐ$XÐ$X¸)Ð$XÐ$XÐ$XÐgmÐx|ô  yGð  Hñ  Hô  HˆGØ�MŠM‰OŒOˆOð;	gÝ˜iÕ):Ñ;Ô;ˆKÝÔ#×6Ò6À;Ð6ÑOÔOð 3ÐS[Ø�Ý+4°\Ñ+BÔ+Bð &ð &Ñ'�AÑ'˜˜D $Ø Ÿš¨	°1°b¸$ÀÑEÔE�AØ—N’N 1Ñ%Ô%Ð%Ð%õ #œi™kœk�Ø$)Ð!ð&Ý%/Ô%7×%<Ò%<Ø¨ð &=ñ &ô &‘N�D˜(ð $ð Øð Ô0ð Ø0ð Ø04Ð-Ø ŸLšLØ#'¤?ð !Nð !NÝ#& x¡=¤=ð!Nð !Nð !Nà&*ð )ñ ô ð ð
 "*ð 'ð '˜AØŸHšH™JœJ˜J˜Jõ #Ô*×/Ò/°À#Ð/ÑFÔFÐFØå$'­¬	©¬°kÑ(AÑ$BÔ$B�Mà$ qÒ(Ð(¨]¸RÑ-?À!Ò-CÐ-Cð*ð *ð *ð *ð *à%-ð*ñ *ô *˜ð
 ×,Ò,ð[¸ð [ð [Ý" 8™}œ}ð[ð [Ø:>¿)º)ÀNÐSUÐTUÐSUÔDVÑ:WÔ:Wð[ð [ð [ñô ð ñG&ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ðj ð gåÐDÐD¨7ÐDÑDÔDÑDÔD�	ÝÐGÐG¨gÐGÑGÔGÑGÔG�	Ø—’Ðe IÐeÐe°	ÐeÐeÈyÐeÐeÐeÐeÑfÔfÐføøð	 ð gåÐDÐD¨7ÐDÑDÔDÑDÔD�	ÝÐGÐG¨gÐGÑGÔGÑGÔG�	Ø—’Ðe IÐeÐe°	ÐeÐeÈyÐeÐeÐeÐeÑfÔfÐfÐfð	gøøøõ $-¨\Ñ#:Ô#:ð G	Cñ G	CÑˆAÑ��D˜$Ø˜”
ˆAØˆyàÔ,ð gØ&pÀtÐ&pÐ&pÐ&p�O�Oà&f¸tÐ&fÐ&fÐ&f�OØ #��àYZÑV�˜}¨o¸}Èhàð wÝ>AÀ/Ñ>RÔ>RÐUXÒ>XÐ>X _°T°c°TÔ%:Ð%:Ð^m�NÝ—N’NÐ#GÈÐXeÐguÑvÔvÐvàÔ.ð QðQØ×3Ò3Ø,¨m¸TÀ4Ø%2¸Xð 4ñ ô ð ð øõ %ð Qð Qð QÝœÐ&OÀvÐ&OÐ&OÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøð Ô'ð dÝ”MÐ"[¨-Ð"[Ð"[À}Ð"[Ð"[Ð"[Ð"[Ñ\Ô\Ð\Ý”MÐ"bµ#°oÑ2FÔ2FÐ"bÐ"bÐQ`Ð"bÐ"bÑcÔcÐcð ×4Ò4Ñ6Ô6ð 	fÝ6°t¸TÀ=ÐYhÐiÑiÔi�Ø× Ò   h  Ñ1Ô1Ð1Ð1Ø”_ð fØÔ'ð fÝÐO¨¨!©ÐOÐO¸=ÐOÐOÐOÐOÑPÔPÐPÝ˜$×,Ò,¨Z¸ÑIÔIÑJÔJÐJÐJåZ]Ð^mÑZnÔZnÐquô  rGò  [Gð  [G Ð7M¸Ô8MÐ7MÔ'NÐQVÑ'VÐ'Vð  M\Ð$ÝÐd¨¨!©ÐdÐd¸=ÐdÐdÐdÐRbÐdÐdÑeÔeÐeà!%ˆDÔØ× Ò Ð!Q°DÐ!QÐ!Q¸MÐ!QÐ!QÐ!QÐ!QÑRÔRÐRàÔ*ð MðMØ×/Ò/°´°t¸TÀ?ÑSÔSÐSÐSøÝ ð Mð Mð MÝ”MÐ"KÀ6Ð"KÐ"KÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøõ 8Ø'ØØœEÝ"Ð#4Ñ5Ô5ð	ñ ô ˆOð  Ô3×CÒCÀDÈ$ÑOÔOˆLØð 0Ø <Ñ/�ð Ø*Ø "¤ðð ˆHð
 �OŠO˜HÑ%Ô%Ð%ð
 ×5Ò5°hÀÑBÔBÐBÑBõ ˜Ñ%Ô%ˆ	Ø�qŠ=ˆ=Ø% y j k kÔ2ˆNÝ µNÐCTÑ4UÔ4UÐVÑVÔVÐVð �qŠ=ˆ=Ø×5Ò5°hÀ	ÑJÔJÐJÐJÐJð ˆ=sÊ   Â B?Â?CÃCÃ>AEÅ
EÅEÅ2BG9Ç9
HÈHÍ=(N&Î&
OÎ0OÏOÏ%PÐ
P-ÐP(Ð(P-Ó"5\	 ÔFZ)Ú\	 Ú)Z-Ú-\	 Ú0Z-Ú1\	 Ü	A] ß+`à
`2à`-à-`2å?fæ
gæ'gçgc                 óP)  — t          |j        d¦  «        D �]/\  }}| j        r{|j        |dz
  d…         }|r/|                      | j        › dt          |¦  «        › d�d¬¦  «         |D ]2}|j        j        }	dd|	› d	�|j        d
œ}
| 	                    |
¦  «         Œ3 �n©|j        j        }	 t          j        |j        j        ¦  «        }n5# t          j        $ r#}t          j        d|› �¦  «         i }Y d}~nd}~ww xY wt!          |t"          ¦  «        si }d}	 ddlm}  ||||pd¬¦  «        }n# t(          $ r Y nw xY w|�n|dk    rd| _        n|dk    rd| _        | j        sôt          j        |d¬¦  «        }| j        rqt5          d|› d|› dt7          |                     ¦   «         ¦  «        › d�¦  «         t5          |                      dt          j        |dd¬¦  «        ¦  «        ¦  «         nft          |¦  «        | j        k    r|d| j        …         dz   n|}t5          d|› d|› dt7          |                     ¦   «         ¦  «        › d|› �¦  «         |€|| _        |                       d|› �¦  «         |€(	 ddl!m"}  || j         ¦  «         n# t(          $ r Y nw xY w|€_| j#        rX	 tI          ||¦  «        }|  #                    d|||¦  «         n.# t(          $ r!}t          j%        d |› �¦  «         Y d}~nd}~ww xY w|€S| j&        rL	 |  &                    |j        ||¦  «         n.# t(          $ r!}t          j%        d!|› �¦  «         Y d}~nd}~ww xY w|€r|d"v rn| j'        j(        rb	 | )                    d#d¦  «        }|r8| j'         *                    |¦  «        }| j'         +                    |d$|› �¦  «         n# t(          $ r Y nw xY w|€ª|d%k    r¤| j'        j(        r˜	 | )                    d&d¦  «        }tY          |¦  «        ra| )                    d'¦  «        p%t[          j.        d(t[          j/        ¦   «         ¦  «        }| j'         +                    |d)|dd*…         › �¦  «         n# t(          $ r Y nw xY wta          j0        ¦   «         }|�t          j        d+|id¬¦  «        }d,}�n|d-k    r•dd.l1m2}  || )                    d/¦  «        | )                    d0d¦  «        | j3        ¬1¦  «        }ta          j0        ¦   «         |z
  }|  4                    ¦   «         r)|                      d2tk          d-|||¬3¦  «        › �¦  «         �nƒ|d4k    rÏ| j6        st          j        dd5d6œ¦  «        }n[dd7l7m8}  || )                    d8d¦  «        | )                    d9¦  «        | )                    d:d;¦  «        | j6        | j9        ¬<¦  «        }ta          j0        ¦   «         |z
  }|  4                    ¦   «         r)|                      d2tk          d4|||¬3¦  «        › �¦  «         �
n®|dk    �rY| )                    d=d¦  «        }dd>l:m;}  || )                    d?¦  «        || )                    d@¦  «        | )                    dA¦  «        | j<        ¬B¦  «        }| j=        r“| )                    d?¦  «        dCv r|	 | j=         >                    | )                    d?d¦  «        || )                    d@d¦  «        |  ?                    |t�          |dDd¦  «        ¬E¦  «        ¬F¦  «         n# t(          $ r Y nw xY wta          j0        ¦   «         |z
  }|  4                    ¦   «         r)|                      d2tk          d|||¬3¦  «        › �¦  «         �	nN|dGk    r•ddHlAmB}   | | )                    dId¦  «        | )                    dJ¦  «        | jC        ¬K¦  «        }ta          j0        ¦   «         |z
  }|  4                    ¦   «         r)|                      d2tk          dG|||¬3¦  «        › �¦  «         �n³|dLk    �rù| )                    dM¦  «        }!|!r)t!          |!t6          ¦  «        rdNt          |!¦  «        › dO�}"n(| )                    dP¦  «        pdddQ…         }#|#rdR|#› �ndS}"d}$|  4                    ¦   «         ri|  D                    ¦   «         rUt‹          jF        t�          jH        ¦   «         ¦  «        }%t�          |%› dT|"› �dU| jI        ¬V¦  «        }$|$ J                    ¦   «          |$| _K        d}&	 |  L                    |¦  «        }|}&d| _K        ta          j0        ¦   «         |z
  }tk          dL|||&¬3¦  «        }'|$r|$ M                    |'¦  «         �n[|  4                    ¦   «         r|                      d2|'› �¦  «         �n-# d| _K        ta          j0        ¦   «         |z
  }tk          dL|||&¬3¦  «        }'|$r|$ M                    |'¦  «         w |  4                    ¦   «         r|                      d2|'› �¦  «         w w xY w| jN        �rð|| jN        v �ræd}$|  4                    ¦   «         ryt‹          jF        t�          jH        ¦   «         ¦  «        }%tŸ          |¦  «        }(tI          ||¦  «        p|}t�          |%› dT|(› dT|› �dU| jI        ¬V¦  «        }$|$ J                    ¦   «          d})	 | jP         Q                    |||¬W¦  «        }|})nQ# t(          $ rD}*t          j        d+dX|› dY|*› �i¦  «        }t¤           S                    dZ||*d¬[¦  «         Y d}*~*nd}*~*ww xY wta          j0        ¦   «         |z
  }tk          ||||)¬3¦  «        }'|$r|$ M                    |'¦  «         �n\|  4                    ¦   «         r|                      d2|'› �¦  «         �n.# ta          j0        ¦   «         |z
  }tk          ||||)¬3¦  «        }'|$r|$ M                    |'¦  «         w |  4                    ¦   «         r|                      d2|'› �¦  «         w w xY w| j=        �r| j=         T                    |¦  «        �rød}$|  4                    ¦   «         r�|  D                    ¦   «         ryt‹          jF        t�          jH        ¦   «         ¦  «        }%tŸ          |¦  «        }(tI          ||¦  «        p|}t�          |%› dT|(› dT|› �dU| jI        ¬V¦  «        }$|$ J                    ¦   «          d}+	 | j=         Q                    ||¦  «        }|}+nQ# t(          $ rD}*t          j        d+d\|› dY|*› �i¦  «        }t¤           S                    d]||*d¬[¦  «         Y d}*~*nd}*~*ww xY wta          j0        ¦   «         |z
  }tk          ||||+¬3¦  «        }'|$r|$ M                    |'¦  «         �nA|  4                    ¦   «         r|                      d2|'› �¦  «         �n# ta          j0        ¦   «         |z
  }tk          ||||+¬3¦  «        }'|$r|$ M                    |'¦  «         w |  4                    ¦   «         r|                      d2|'› �¦  «         w w xY w| j        �rd}$|  4                    ¦   «         r�|  D                    ¦   «         ryt‹          jF        t�          jH        ¦   «         ¦  «        }%tŸ          |¦  «        }(tI          ||¦  «        p|}t�          |%› dT|(› dT|› �dU| jI        ¬V¦  «        }$|$ J                    ¦   «          d},	 t«          ||||j        | j9        pd| jV        rt7          | jV        ¦  «        ndd¬^¦  «        }|},n=# t(          $ r0}*d_|› d`|*› �}t¤           S                    da||*d¬[¦  «         Y d}*~*nd}*~*ww xY wta          j0        ¦   «         |z
  }tk          ||||,¬3¦  «        }'|$r|$ M                    |'¦  «         �n3|  4                    ¦   «         r|                      d2|'› �¦  «         �n# ta          j0        ¦   «         |z
  }tk          ||||,¬3¦  «        }'|$r|$ M                    |'¦  «         w |  4                    ¦   «         r|                      d2|'› �¦  «         w w xY w	 t«          ||||j        | j9        pd| jV        rt7          | jV        ¦  «        ndd¬^¦  «        }n=# t(          $ r0}*d_|› d`|*› �}t¤           S                    da||*d¬[¦  «         Y d}*~*nd}*~*ww xY wta          j0        ¦   «         |z
  }| j        r|nt          |¦  «        dbk    r
|ddb…         n|}-t¯          ||¦  «        \  }.}/|.rt¤                               dc|||-¦  «         n*t¤           X                    dd||t          |¦  «        ¦  «         | j#        rK	 |  #                    de|dd||.¬f¦  «         n.# t(          $ r!}t          j%        d |› �¦  «         Y d}~nd}~ww xY wd| _        |                       dg|› dh|di›dj�¦  «         | j        rCt          j%        dk|› dl|dm›dn�¦  «         t          j%        dot          |¦  «        › dp|› �¦  «         | jY        rM	 |  Y                    |j        |||¦  «         n.# t(          $ r!}t          j%        dq|› �¦  «         Y d}~nd}~ww xY wtµ          |||j        t·          |¦  «        ¬r¦  «        }| j\         ]                    ||¦  «        }0|0r||0z  }d||j        d
œ}1| 	                    |1¦  «         |  ^                    |d¦  «         | j        s‡| j        r;t5          ds|› dl|dm›dn�¦  «         t5          |                      dt|¦  «        ¦  «         nEt          |¦  «        | j        k    r|d| j        …         dz   n|}2t5          ds|› dl|dm›du|2› �¦  «         | j        r•|t          |j        ¦  «        k     r}t          |j        ¦  «        |z
  }3|                      | j        › d|3› dv�d¬¦  «         |j        |d…         D ]2}|j        j        }	ddw|	› dx�|j        d
œ}
| 	                    |
¦  «         Œ3 n>| j_        dk    r1|t          |j        ¦  «        k     rta          j`        | j_        ¦  «         �Œ1t          |j        ¦  «        }4|4dk    r'tÃ          ||4 d…         t·          |¦  «        ¬y¦  «         |4dk    r|  ^                    ||4¦  «         dS dS )zz`Execute tool calls sequentially (original behavior). Used for single calls or interactive tools.r¢   Nrí  rî  Tr’  r  rï  rð  r¥  z(Unexpected JSON error after validation: r   r®  r€   r\  r2  rl  Fr¤  r÷  rT  rø  re  rù  r  rú  ræ  rû  zexecuting tool: r 	  rü  rý  rþ  rñ  rè   rò  ró  r€  rô  rl  rõ  r  rÀ  rn  r°  r±  rb  rc  r³  r$	  r#	  r·   rµ  r¶  r·  rð  r¸  r¹  rJ  rº  rÏ  r½  r¿  r  rÀ  rÁ  rÂ  r  rÃ  rÄ  r¯   rÅ  rÇ  r"  rÈ  r±  r©  u   ðŸ”€ delegating z tasksr§  rö  u   ðŸ”€ u   ðŸ”€ delegatingr´  r	  r	  r	  zContext engine tool 'z
' failed: z1context_engine.handle_tool_call raised for %s: %sr   zMemory tool 'z1memory_manager.handle_tool_call raised for %s: %srÊ  r	  r	  z&handle_function_call raised for %s: %srÏ   r	  r	  r	  r	  r(	  rd  r	  rÒ  r	  r 	  r!	  r¾  r"	  rL  r)	  r*	  r%	  r&	  r'	  z remaining tool call(s)u   [Tool execution skipped â€” z* was not started. User sent a new message]r-	  )br  rà   r—  r—  rŒ  rd   rÇ   rp   r  rÞ   rÕ   rÖ   r×   r9  rØ   r7  rb   rÚ   r  r¯  r�   rò  ró  r‰  r8  rˆ  rÈ  r  r1	  rë  r‹  r°  r4  r	  r	  r”  r2	  rÙ   r•  ræ  r*  rƒ   r.	  r/	  rÃ   r�   r  r0	  r­  rë  r²  rì  rœ  r<	  rç  rÍ  r·   r“  rô  r¾  rî  rö  rÎ  r‰  ro   rÑ  rÆ  r™  rš  r3	  r4	  rE   r5	  r†  r”  Ú_delegate_spinnerr¬  r  r  Ú_get_tool_emojirk  rÐ  r6  rÀ  rÏ  r   rÖ  rH   rµ  r–  r   r   r  r=	  r1  r„  r«  r   )5rX   r  r
  r¡  rB  r!  rã   Úremaining_callsÚ
skipped_tcÚskipped_nameÚskip_msgr|  rå   rA  Ú
_block_msgr¯  rB	  rC	  r	  r}  rD	  r?	  r@	  r¾   rì   Útool_start_timerN	  rO	  rÓ  rÔ  rÏ  rÕ  rÖ  Ú	tasks_argÚspinner_labelÚgoal_previewrE	  rF	  Ú_delegate_resultrQ	  ÚemojiÚ
_ce_resultr		  Ú_mem_resultÚ_spinner_resultrP	  Ú_is_error_resultrE  rS	  r·  rR	  rª   Únum_tools_seqs5                                                        rZ   r£  z&AIAgent._execute_tool_calls_sequentialÊ!  sÝ  € å%Ð&7Ô&BÀAÑFÔFð t	,ñ t	,‰LˆAˆyð Ô(ð Ø"3Ô">¸qÀ¹s¸t¸tÔ"D�Ø"ð ~Ø—L’L D¤OÐ!pÐ!pÍSÐQ`ÑMaÔMaÐ!pÐ!pÐ!pÐx|�LÑ}Ô}Ð}Ø"1ð .ð .�JØ#-Ô#6Ô#;�Là &Ø#uÀLÐ#uÐ#uÐ#uØ(2¬ð ð  �Hð
 —O’O HÑ-Ô-Ð-Ð-Ø‘à%Ô.Ô3ˆMð#Ý $¤
¨9Ô+=Ô+GÑ HÔ H��øÝÔ'ð #ð #ð #Ý”Ð NÈ1Ð NÐ NÑOÔOÐOØ "������øøøøð#øøøõ ˜m­TÑ2Ô2ð #Ø "�ð )-ˆJðØNÐNÐNÐNÐNÐNØ<Ð<Ø! =Ð:KÐ:QÈrðñ ô �
�
øõ ð ð ð Ø�ðøøøð Ð%ð ð ! HÒ,Ð,Ø/0�DÔ,Ð,Ø" nÒ4Ð4Ø./�DÔ+à”?ð nÝœ: mÀ%ÐHÑHÔH�ØÔ'ð nÝÐ[¨Ð[Ð[¨mÐ[Ð[½dÀ=×CUÒCUÑCWÔCWÑ>XÔ>XÐ[Ð[Ð[Ñ\Ô\Ð\Ý˜$×,Ò,¨Xµt´zÀ-ÐXYÐhmÐ7nÑ7nÔ7nÑoÔoÑpÔpÐpÐpåORÐS[É}Ì}Ð_cÔ_tÒOtÐOt 8Ð,B¨TÔ-BÐ,BÔ#CÀeÑ#KÐ#Kð  {C�LÝÐl¨ÐlÐl¨mÐlÐl½dÀ=×CUÒCUÑCWÔCWÑ>XÔ>XÐlÐlÐ^jÐlÐlÑmÔmÐmàÐ!Ø%2�Ô"Ø×$Ò$Ð%G¸Ð%GÐ%GÑHÔHÐHð
 Ð!ðØMÐMÐMÐMÐMÐMØ)Ð)¨$Ô*>Ñ?Ô?Ð?Ð?øÝ ð ð ð Ø�Dðøøøð Ð! dÔ&AÐ!ðMÝ1°-ÀÑOÔO�GØ×/Ò/°ÀÈwÐXeÑfÔfÐfÐføÝ ð Mð Mð MÝ”MÐ"KÀ6Ð"KÐ"KÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð Ð! dÔ&>Ð!ðJØ×,Ò,¨Y¬\¸=È-ÑXÔXÐXÐXøÝ ð Jð Jð JÝ”MÐ"HÀÐ"HÐ"HÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøð Ð! mÐ7NÐ&NÐ&NÐSWÔSgÔSoÐ&NðØ -× 1Ò 1°&¸"Ñ =Ô =�IØ ð Ø#'Ô#7×#PÒ#PÐQZÑ#[Ô#[˜ØÔ,×>Ò>Ø$Ð&?°Ð&?Ð&?ñô ð øøõ !ð ð ð Ø�Dðøøøð Ð! m°zÒ&AÐ&AÀdÔFZÔFbÐ&AðØ'×+Ò+¨I°rÑ:Ô:�CÝ.¨sÑ3Ô3ð Ø+×/Ò/°	Ñ:Ô:Ðd½b¼iÈÕXZÔXaÑXcÔXcÑ>dÔ>d˜ØÔ,×>Ò>ØÐ!?°S¸¸"¸´XÐ!?Ð!?ñô ð øøõ !ð ð ð Ø�Dðøøøõ #œi™kœkˆOàÐ%å"&¤*¨g°zÐ-BÐQVÐ"WÑ"WÔ"W�Ø #�‘Ø &Ò(Ð(ØCÐCÐCÐCÐCÐCØ", *Ø'×+Ò+¨GÑ4Ô4Ø'×+Ò+¨G°UÑ;Ô;ØÔ*ð#ñ #ô #�õ
 !%¤	¡¤¨oÑ =�Ø×8Ò8Ñ:Ô:ð CØ—L’Lð  "BÕ&AÀ&È-ÐYfÐo~Ð&Ñ&Ô&ð  "Bð  "Bñ  Cô  Cð  CùØÐ"2Ò2Ð2ØÔ'ð 
Ý&*¤j¸UÐMnÐ1oÐ1oÑ&pÔ&p�O�Oà[Ð[Ð[Ð[Ð[Ð[Ø&5 oØ+×/Ò/°¸Ñ<Ô<Ø$1×$5Ò$5°mÑ$DÔ$DØ+×/Ò/°¸Ñ;Ô;ØÔ+Ø+/¬?ð'ñ 'ô '�Oõ !%¤	¡¤¨oÑ =�Ø×8Ò8Ñ:Ô:ð MØ—L’Lð  "LÕ&AÐBRÐTaÐcpð  zIð  'Jñ  'Jô  'Jð  "Lð  "Lñ  Mô  Mð  MùØ (Ò*Ñ*Ø&×*Ò*¨8°XÑ>Ô>�ØIÐIÐIÐIÐIÐIØ". ,Ø(×,Ò,¨XÑ6Ô6Ø!Ø)×-Ò-¨iÑ8Ô8Ø*×.Ò.¨zÑ:Ô:ØÔ,ð#ñ #ô #�ð Ô'ð ¨M×,=Ò,=¸hÑ,GÔ,GÐK]Ð,]Ð,]ðØÔ,×<Ò<Ø)×-Ò-¨h¸Ñ;Ô;Ø"Ø)×-Ò-¨i¸Ñ<Ô<Ø%)×%FÒ%FØ(9Ý-4°YÀÀdÑ-KÔ-Kð &Gñ &ô &ð	 =ñ ô ð ð øõ %ð ð ð Ø˜ðøøøå $¤	¡¤¨oÑ =�Ø×8Ò8Ñ:Ô:ð EØ—L’Lð  "DÕ&AÀ(ÈMÐ[hð  rAð  'Bñ  'Bô  'Bð  "Dð  "Dñ  Eô  Eð  EùØ )Ò+Ð+ØLÐLÐLÐLÐLÐLØ"/ -Ø*×.Ò.¨z¸2Ñ>Ô>Ø)×-Ò-¨iÑ8Ô8Ø!Ô2ð#ñ #ô #�õ
 !%¤	¡¤¨oÑ =�Ø×8Ò8Ñ:Ô:ð FØ—L’Lð  "EÕ&AÀ)È]Ð\ið  sBð  'Cñ  'Cô  'Cð  "Eð  "Eñ  Fô  Fð  FùØ /Ò1Ñ1Ø)×-Ò-¨gÑ6Ô6�	Øð b¥¨IµtÑ!<Ô!<ð bØ$Mµs¸9±~´~Ð$MÐ$MÐ$M�M�Mà$1×$5Ò$5°fÑ$=Ô$=Ð$CÀÀSÀbÀSÔ#I�LØ>JÐ$aÐ$:¨LÐ$:Ð$:Ð$:ÐPa�MØ�Ø×8Ò8Ñ:Ô:ð $¸t×?_Ò?_Ñ?aÔ?að $Ý!œ=­Ô)HÑ)JÔ)JÑKÔK�DÝ+¨tÐ,EÐ,E°mÐ,EÐ,EÐTZÐeiÔesÐtÑtÔt�GØ—M’M‘O”O�OØ)0�Ô&Ø#'Ð ð
6Ø&*×&BÒ&BÀ=Ñ&QÔ&Q�OØ'6Ð$à-1�DÔ*Ý$(¤I¡K¤K°/Ñ$A�MÝ:¸?ÈMÐ[hð  rBð   Cñ   Cô   C�HØð 6ØŸš XÑ.Ô.Ð.Ñ.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5ùøð .2�DÔ*Ý$(¤I¡K¤K°/Ñ$A�MÝ:¸?ÈMÐ[hð  rBð   Cñ   Cô   C�HØð 6ØŸš XÑ.Ô.Ð.Ð.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5Ð5ð6øøøàÔ0ñ W>°]ÀdÔFeÐ5eÑ5eà�Ø×8Ò8Ñ:Ô:ð $Ý!œ=­Ô)HÑ)JÔ)JÑKÔK�DÝ+¨MÑ:Ô:�EÝ1°-ÀÑOÔOÐ`ÐS`�GÝ+¨tÐ,GÐ,G°eÐ,GÐ,G¸gÐ,GÐ,GÐV\ÐgkÔguÐvÑvÔv�GØ—M’M‘O”O�OØ!�
ð6Ø&*Ô&=×&NÒ&NÈ}Ð^kÐv~Ð&NÑ&Ô&�OØ!0�J�JøÝ ð @ð @ð @Ý&*¤j°'Ð;xÐS`Ð;xÐ;xÐlvÐ;xÐ;xÐ1yÑ&zÔ&z�OÝ—L’LÐ!TÐVcÐeoÐz~�LÑÔÐÐÐÐÐÐøøøøð@øøøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐoyÐzÑzÔz�HØð 6ØŸš XÑ.Ô.Ð.Ñ.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5ùøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐoyÐzÑzÔz�HØð 6ØŸš XÑ.Ô.Ð.Ð.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5Ð5ð6øøøàÔ%ñ @>¨$Ô*>×*GÒ*GÈÑ*VÔ*Vñ @>ð �Ø×8Ò8Ñ:Ô:ð $¸t×?_Ò?_Ñ?aÔ?að $Ý!œ=­Ô)HÑ)JÔ)JÑKÔK�DÝ+¨MÑ:Ô:�EÝ1°-ÀÑOÔOÐ`ÐS`�GÝ+¨tÐ,GÐ,G°eÐ,GÐ,G¸gÐ,GÐ,GÐV\ÐgkÔguÐvÑvÔv�GØ—M’M‘O”O�OØ"�ð6Ø&*Ô&:×&KÒ&KÈMÐ[hÑ&iÔ&i�OØ"1�K�KøÝ ð @ð @ð @Ý&*¤j°'Ð;pÈ=Ð;pÐ;pÐdnÐ;pÐ;pÐ1qÑ&rÔ&r�OÝ—L’LÐ!TÐVcÐeoÐz~�LÑÔÐÐÐÐÐÐøøøøð@øøøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐozÐ{Ñ{Ô{�HØð 6ØŸš XÑ.Ô.Ð.Ñ.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5ùøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐozÐ{Ñ{Ô{�HØð 6ØŸš XÑ.Ô.Ð.Ð.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5Ð5ð6øøøà”ñ (>Ø�Ø×8Ò8Ñ:Ô:ð $¸t×?_Ò?_Ñ?aÔ?að $Ý!œ=­Ô)HÑ)JÔ)JÑKÔK�DÝ+¨MÑ:Ô:�EÝ1°-ÀÑOÔOÐ`ÐS`�GÝ+¨tÐ,GÐ,G°eÐ,GÐ,G¸gÐ,GÐ,GÐV\ÐgkÔguÐvÑvÔv�GØ—M’M‘O”O�OØ"&�ð6Ý&:Ø% }Ð6GØ%.¤\Ø#'¤?Ð#8°bØEIÔEZÐ&d¥d¨4Ô+@Ñ&AÔ&AÐ&AÐ`dØ04ð'ñ 'ô '�Oð '6�O�OøÝ ð uð uð uØ&]¸}Ð&]Ð&]ÐQ[Ð&]Ð&]�OÝ—L’LÐ!IÈ=ÐZdÐos�LÑtÔtÐtÐtÐtÐtÐtÐtøøøøðuøøøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐo~ÐÑÔ�HØð 6ØŸš XÑ.Ô.Ð.Ñ.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5ùøõ %)¤I¡K¤K°/Ñ$A�MÝ:¸=È-ÐYfÐo~ÐÑÔ�HØð 6ØŸš XÑ.Ô.Ð.Ð.Ø×>Ò>Ñ@Ô@ð 6ØŸš _¨( _ _Ñ5Ô5Ð5Ð5ð6øøøð
uÝ&:Ø% }Ð6GØ%.¤\Ø#'¤?Ð#8°bØEIÔEZÐ&d¥d¨4Ô+@Ñ&AÔ&AÐ&AÐ`dØ04ð'ñ 'ô '�O�Oøõ !ð uð uð uØ&]¸}Ð&]Ð&]ÐQ[Ð&]Ð&]�OÝ—L’LÐ!IÈ=ÐZdÐos�LÑtÔtÐtÐtÐtÐtÐtÐtøøøøðuøøøõ !%¤	¡¤¨oÑ =�à04Ô0Dð ˜_˜_Ý),¨_Ñ)=Ô)=ÀÒ)CÐ)C�   Ô%Ð%Èð õ #7°}ÀoÑ"VÔ"VÑÐ˜aØð wÝ—’ÐCÀ]ÐTaÐcqÑrÔrÐrÐrå—’ÐAÀ=ÐR_ÕadÐetÑauÔauÑvÔvÐvàÔ*ð MðMØ×/Ò/Ø(¨-¸¸tØ!.Ð9Ið 0ñ ô ð ð øõ !ð Mð Mð MÝ”MÐ"KÀ6Ð"KÐ"KÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøð "&ˆDÔØ× Ò Ð!Z°MÐ!ZÐ!ZÀ]Ð!ZÐ!ZÐ!ZÐ!ZÑ[Ô[Ð[àÔ#ð `Ý”ÐW mÐWÐWÀ=ÐWÐWÐWÐWÑXÔXÐXÝ”Ð^­c°/Ñ.BÔ.BÐ^Ð^È_Ð^Ð^Ñ_Ô_Ð_àÔ*ð MðMØ×/Ò/°	´¸mÈ]Ð\kÑlÔlÐlÐløÝ ð Mð Mð MÝ”MÐ"KÀ6Ð"KÐ"KÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøõ 8Ø'Ø'Ø%œLÝ"Ð#4Ñ5Ô5ð	ñ ô ˆOð  Ô3×CÒCÀMÐS`ÑaÔaˆLØð 0Ø <Ñ/�ð Ø*Ø )¤ðð ˆHð
 �OŠO˜HÑ%Ô%Ð%ð ×5Ò5°hÀÑBÔBÐBà”?ð dØÔ'ð dÝÐM¨ÐMÐM¸ÐMÐMÐMÐMÑNÔNÐNÝ˜$×,Ò,¨Z¸ÑIÔIÑJÔJÐJÐJåZ]Ð^mÑZnÔZnÐquô  rGò  [Gð  [G Ð7M¸Ô8MÐ7MÔ'NÐQVÑ'VÐ'Vð  M\Ð$ÝÐb¨ÐbÐb¸ÐbÐbÐbÐP`ÐbÐbÑcÔcÐcàÔ(ð ¨QµÐ5FÔ5QÑ1RÔ1RÒ-RÐ-RÝÐ 1Ô <Ñ=Ô=ÀÑA�	Ø—’ ¤ÐkÐkÈÐkÐkÐkÐsw�ÑxÔxÐxØ"3Ô">¸q¸r¸rÔ"Bð .ð .�JØ#-Ô#6Ô#;�Là &Ø#zÀ,Ð#zÐ#zÐ#zØ(2¬ð ð  �Hð
 —O’O HÑ-Ô-Ð-Ð-Ø�àŒ Ò"Ð" q­3Ð/@Ô/KÑ+LÔ+LÒ'LÐ'LÝ”
˜4œ?Ñ+Ô+Ð+ùõ Ð-Ô8Ñ9Ô9ˆØ˜1ÒÐÝ ¨-¨¨¨Ô 9½~ÐN_Ñ?`Ô?`ÐaÑaÔaÐað
 ˜1ÒÐØ×5Ò5°hÀÑNÔNÐNÐNÐNð Ðs¦  Â+C
Ã
C<ÃC7Ã7C<ÄD0Ä0
D=Ä<D=É=JÊ
J!Ê J!Ê.(KË
LË!K=Ë=LÌL,Ì,
MÌ6MÍMÍ-AN>Î>
OÏ
OÏ#BQ*Ñ*
Q7Ñ6Q7Ú+A*\Ü
\#Ü"\#äfæA7hê:kënë
l(ë$:l#ìnì#l(ì(nîA0pós5ó4v6ó5
uó?:t>ô9v6ô>uõv6ö6A0x&û?|üü
}ü!&}ýý}ýÿA0A@4Á@8=AA6ÁA6
AB0ÁB &AB+ÁB+AB0ÁEAE2ÁE2
AFÁE<AFÁFAFÁHAH4ÁH4
AIÁH>AIÁIAIc           
      ó  — t          d| j        › d�¦  «         d}|                     d|dœ¦  «         	 |                      ¦   «         }g }|D ]s}|                     ¦   «         }|                      ||¦  «         dD ]}|                     |d¦  «         Œ|r|                      |¦  «         |                     |¦  «         Œt| j        pd}	| j	        r|	d	z   | j	        z    
                    ¦   «         }	|	r	d
|	dœg|z   }| j        rK|	rdnd}
t          | j        ¦  «        D ]0\  }}|                     |
|z   |                     ¦   «         ¦  «         Œ1i }	 ddlm}m} n# t"          $ r d}d}Y nw xY w|� || j        | j        ¦  «        nd}||u }|rdn|}d| j        v }|                      ¦   «         r| j        �| j        |d<   ndddœ|d<   |rdg|d<   | j        dk    r†|                      |¦  «        }|                     dd¦  «         |                      |¦  «        }|                      ¦   «         }|                     |¦  «        }|j        pd 
                    ¦   «         }�n´| j        |dœ}|�||d<   | j        �-|                     |                      | j        ¦  «        ¦  «         i }| j         r
| j         |d<   | j!        r
| j!        |d<   | j"        r
| j"        |d<   | j#        r
| j#        |d<   |r||d<   |r||d<   | j        dk    r£|                      ¦   «         }| $                    | j        |d| j        | j        | j%        |  &                    ¦   «         ¬ ¦  «        }|  '                    |¦  «        }|                     || j%        ¬!¦  «        }|j        pd 
                    ¦   «         }nm |  (                    d"¬#¦  «        j)        j*        j+        d.i |¤Ž}|                      ¦   «                              |¦  «        }|j        pd 
                    ¦   «         }|rXd$|v r4tY          j-        d%d|tX          j.        ¬&¦  «         
                    ¦   «         }|r|                     d'|dœ¦  «         �nVd(}�nR| j        dk    r†|                      |¦  «        }|                     dd¦  «         |                      |¦  «        }|                      ¦   «         }|                     |¦  «        } | j        pd 
                    ¦   «         }�ng| j        dk    r£|                      ¦   «         }!|! $                    | j        |d| j%        | j        | j        |  &                    ¦   «         ¬)¦  «        }"|  '                    |"¦  «        }|!                     || j%        ¬!¦  «        }#|#j        pd 
                    ¦   «         }n¹| j        |dœ}|�||d<   | j        �-|                     |                      | j        ¦  «        ¦  «         |r||d<    |  (                    d*¬#¦  «        j)        j*        j+        d.i |¤Ž}|                      ¦   «                              |¦  «        }#|#j        pd 
                    ¦   «         }|rVd$|v r4tY          j-        d%d|tX          j.        ¬&¦  «         
                    ¦   «         }|r|                     d'|dœ¦  «         nd(}nd(}nH# t"          $ r;}$t_          j0        d+|$› �¦  «         d,| j        › d-tc          |$¦  «        › �}Y d}$~$nd}$~$ww xY w|S )/zSRequest a summary when max iterations are reached. Returns the final response text.u$   âš ï¸�  Reached maximum iterations (z). Requesting summary...z¼You've reached the maximum number of tool-calling iterations allowed. Please provide a final response summarizing what you've found and accomplished so far, without calling any more tools.r_  rŠ  )rE  r  Ú_thinking_prefillNr€   rK  ri  r¢   r   r  r  rE  TrB  )r*  rA  zproduct=hermes-agentÚtagsrµ  rR  )r‚  r
  Útemperaturer  rJ  r  r  r|  Ú
extra_bodyr¸  )r‚  r
  rR  rŸ  r   rþ  rÿ  ©Ústrip_tool_prefixÚiteration_limit_summaryr,  r°  z<think>.*?</think>\s*r  r”  z>I reached the iteration limit and couldn't generate a summary.)r‚  r
  rR  rþ  rŸ  r   rÿ  Úiteration_limit_summary_retryz Failed to get summary response: z"I reached the maximum iterations (z!) but couldn't summarize. Error: rw   )2rÈ  rƒ  rÞ   rƒ  r�  rk  rë  rp  rä  rŠ  r„   r£  r  rx  rÌ  r  r  r�   r‚  rˆ   ru  r(  r   r}  r:  ri  r‹  Únormalize_responser  rŸ  r"  rû  r�  rŽ  r�  r�  r&  rÀ  rï  r°  r-  rÄ  rÅ  rp  r;  rû   r  rØ   r7  rc   )%rX   r
  rB  Úsummary_requestÚ_needs_sanitizerä  r  rg  Úinternal_fieldÚeffective_systemÚ
sys_offsetr  ÚpfmÚsummary_extra_bodyr  Ú
_OMIT_TEMPÚ_raw_summary_tempÚ_omit_summary_temperatureÚ_summary_temperaturer0  Úcodex_kwargsÚsummary_responseÚ_ct_sumÚ_cnr_sumrO  Úsummary_kwargsr  Ú_tsumÚ_ant_kwÚ_summary_resultÚretry_responseÚ	_ct_retryÚ
_cnr_retryÚ_tretryÚ_ant_kw2Ú_retry_resultrA  s%                                        rZ   Ú_handle_max_iterationszAIAgent._handle_max_iterationsO#  sÕ  € åÐb°TÔ5HÐbÐbÐbÑcÔcÐcð.ð 	ð
 	�Š °OÐDÐDÑEÔEÐEðU	Að #×>Ò>Ñ@Ô@ˆOØˆLØð -ð -�ØŸ(š(™*œ*�Ø×4Ò4°S¸'ÑBÔBÐBØ&Yð 6ð 6�NØ—K’K °Ñ5Ô5Ð5Ð5Ø"ð FØ×<Ò<¸WÑEÔEÐEØ×#Ò# GÑ,Ô,Ð,Ð,à#Ô9Ð?¸RÐØÔ+ð fØ$4°vÑ$=ÀÔ@\Ñ$\×#cÒ#cÑ#eÔ#eÐ Øð `Ø)1Ð>NÐ OÐ OÐPÐS_Ñ_�ØÔ$ð FØ"2Ð9˜Q˜Q¸�
Ý )¨$Ô*?Ñ @Ô @ð Fð F‘H�C˜Ø ×'Ò'¨
°SÑ(8¸#¿(º(¹*¼*ÑEÔEÐEÐEà!#Ðð"ØoÐoÐoÐoÐoÐoÐoÐoÐoøÝð "ð "ð "Ø/3Ð,Ø!�
�
�
ð"øøøð
 0Ð;ð -Ð,¨T¬Z¸¼ÑGÔGÐGàð ð
 ):¸ZÐ(GÐ%Ø+DÐ#[ 4 4ÐJ[Ð Ø%¨Ô)=Ð=ˆHØ×2Ò2Ñ4Ô4ð ØÔ(Ð4Ø6:Ô6KÐ& {Ñ3Ð3ð $(Ø"*ð7ð 7Ð& {Ñ3ð ð FØ.DÐ-EÐ" 6Ñ*àŒ}Ð 1Ò1Ð1Ø#×5Ò5°lÑCÔC�Ø× Ò  ¨$Ñ/Ô/Ð/Ø#'×#9Ò#9¸,Ñ#GÔ#GÐ Ø×-Ò-Ñ/Ô/�Ø"×5Ò5Ð6FÑGÔG�Ø"*Ô"2Ð"8°b×!?Ò!?Ñ!AÔ!A�‘ð "œZØ ,ð"ð "�ð (Ð3Ø4H�N =Ñ1Ø”?Ð.Ø"×)Ò)¨$×*@Ò*@ÀÄÑ*QÔ*QÑRÔRÐRð (*Ð$ØÔ)ð JØ37Ô3IÐ(¨Ñ0ØÔ)ð LØ59Ô5KÐ(¨Ñ2ØÔ'ð IØ48Ô4HÐ(¨Ñ1ØÔ%ð FØ37Ô3EÐ(¨Ñ0Ø'ð JØ5IÐ& zÑ2à%ð FØ3E�N <Ñ0à”=Ð$8Ò8Ð8Ø ×/Ò/Ñ1Ô1�EØ#×0Ò0°t´zÈLÐ`dØ.2¬oÐPTÔPeØ,0Ô,DØ15×1NÒ1NÑ1PÔ1Pð 1ñ Rô R�Gð (,×'FÒ'FÀwÑ'OÔ'OÐ$Ø&+×&>Ò&>Ð?OÐcgÔc{Ð&>Ñ&|Ô&|�OØ&5Ô&=Ð&CÀ×%JÒ%JÑ%LÔ%L�N�Nð (D t×'IÒ'IÐQjÐ'IÑ'kÔ'kÔ'pÔ'|ô  (Dð  (Vð  (Vð  GUð  (Vð  (VÐ$Ø&*×&9Ò&9Ñ&;Ô&;×&NÒ&NÐO_Ñ&`Ô&`�OØ&5Ô&=Ð&CÀ×%JÒ%JÑ%LÔ%L�Nàð 1fØ Ð.Ð.Ý%'¤VÐ,DÀbÈ.Õ`bÔ`iÐ%jÑ%jÔ%j×%pÒ%pÑ%rÔ%r�NØ!ð fØ—O’O¨[À^Ð$TÐ$TÑUÔUÐUÑUà%e�N‘Nð ”=Ð$5Ò5Ð5Ø#'×#9Ò#9¸,Ñ#GÔ#G�LØ ×$Ò$ W¨dÑ3Ô3Ð3Ø%)×%;Ò%;¸LÑ%IÔ%I�NØ $× 3Ò 3Ñ 5Ô 5�IØ!*×!=Ò!=¸nÑ!MÔ!M�JØ&0Ô&8Ð&>¸B×%EÒ%EÑ%GÔ%G�N‘NØ”]Ð&:Ò:Ð:Ø"×1Ò1Ñ3Ô3�GØ&×3Ò3¸$¼*È|ÐcgØ-1Ô-EØ/3¬ÐQUÔQfØ26×2OÒ2OÑ2QÔ2Qð  4ñ  Sô  S�Hð &*×%DÒ%DÀXÑ%NÔ%N�NØ$+×$>Ò$>¸~ÐaeÔayÐ$>Ñ$zÔ$z�MØ&3Ô&;Ð&A¸r×%HÒ%HÑ%JÔ%J�N�Nð "&¤Ø$0ð&ð &�Nð ,Ð7Ø8L˜ }Ñ5Ø”Ð2Ø&×-Ò-¨d×.DÒ.DÀTÄ_Ñ.UÔ.UÑVÔVÐVØ)ð JØ7I˜ |Ñ4ð (J t×'IÒ'IÐQpÐ'IÑ'qÔ'qÔ'vô  (Cô  (Jð  (\ð  (\ð  M[ð  (\ð  (\Ð$Ø$(×$7Ò$7Ñ$9Ô$9×$LÒ$LÐM]Ñ$^Ô$^�MØ&3Ô&;Ð&A¸r×%HÒ%HÑ%JÔ%J�Nà!ð fØ  NÐ2Ð2Ý)+¬Ð0HÈ"ÈnÕdfÔdmÐ)nÑ)nÔ)n×)tÒ)tÑ)vÔ)v˜Ø%ð jØ Ÿš°ÈÐ(XÐ(XÑYÔYÐYÐYà)i˜˜à%e�Nøøåð 	Að 	Að 	AÝŒOÐB¸qÐBÐBÑCÔCÐCð AÀ$ÔBUð  Að  AÕx{Ð|}Ñx~Ôx~ð  Að  AˆNˆNˆNˆNˆNˆNøøøøð	Aøøøð Ðs=   ´D[ ÅE Å[ ÅE)Å&[ Å(E)Å)U[ Û
\Û1\Ü\Ústream_callbackÚpersist_user_messagec                 óüÏ  ‡ �‡)�‡*�‡+�‡,�‡-�‡.— t          ¦   «          ddlm}  |‰ j        ¦  «         ‰                      ¦   «          t          |t          ¦  «        rt          |¦  «        }t          |t          ¦  «        rt          |¦  «        }t          |t          ¦  «        rt          |¦  «        }t          |t          ¦  «        rt          |¦  «        }|‰ _	        d‰ _
        |‰ _        |pt          t          j        ¦   «         ¦  «        }|‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        ‰ j        dk    r;	 ‰                      ¦   «         r‰                      d¦  «         n# t:          $ r Y nw xY w‰ j        r‰                      ¦   «          d‰ _        tA          ‰ j!        ¦  «        ‰ _"        tG          |¦  «        }	tI          |	¦  «        dk    r|	dd…         dz   n|	}
|
 %                    d	d
¦  «        }
tL           '                    d‰ j        pd‰ j(        ‰ j)        pd‰ j*        pdtI          |pg ¦  «        |
¦  «         |rtW          |¦  «        ng }|r.‰ j,         -                    ¦   «         s‰  .                    |¦  «         ‰ xj/        dz  c_/        |�|n|}d}‰ j0        dk    r9d‰ j1        v r0‰ j2        r)‰ xj3        dz  c_3        ‰ j3        ‰ j0        k    r	d}d‰ _3        d|dœ}| 4                    |¦  «         tI          |¦  «        dz
  }|‰ _
        ‰ j5        sGtG          |¦  «        }‰  6                    d|dd…         › tI          |¦  «        dk    rdnd› d�¦  «         ‰ j7        �€=d}|rQ‰ j8        rJ	 ‰ j8         9                    ‰ j        ¦  «        }|r| :                    d¦  «        pd}n# t:          $ r Y nw xY w|r|‰ _7        nÞ‰  ;                    |¦  «        ‰ _7        	 ddl<m=}  |d‰ j        ‰ j(        t}          ‰ dd¦  «        pd¬¦  «         n2# t:          $ r%}tL           ?                    d|¦  «         Y d}~nd}~ww xY w‰ j8        rY	 ‰ j8         @                    ‰ j        ‰ j7        ¦  «         n2# t:          $ r%}tL           A                    d|¦  «         Y d}~nd}~ww xY w‰ j7        }‰ jB        �rjtI          |¦  «        ‰ jC        jD        ‰ jC        jE        z   dz   k    �r<t�          ||pd‰ jG        pd¬¦  «        }|‰ jC        jH        k    �rtL           '                    d|d ›‰ jC        jH        d ›‰ j(        ‰ jC        jI        d ›¦  «         ‰ j5        s(‰  6                    d!|d ›d"‰ jC        jH        d ›d#�¦  «         t•          d$¦  «        D ]”}tI          |¦  «        }‰  K                    ||||¬%¦  «        \  }}tI          |¦  «        |k    r nSd}d‰ _        d‰ _        d‰ _        d‰ _        d‰ _        t�          ||pd‰ jG        pd¬¦  «        }|‰ jC        jH        k     r nŒ•d}	 ddl<m=}  |d&‰ j        |tW          |¦  «        t™          |¦  «         ‰ j(        t}          ‰ dd¦  «        pdt}          ‰ d'd¦  «        pd¬(¦  «        }g }|D ]“}t          |tš          ¦  «        r>| :                    d)¦  «        r)| 4                    t          |d)         ¦  «        ¦  «         ŒUt          |t          ¦  «        r)| N                    ¦   «         r| 4                    |¦  «         Œ”|rd* O                    |¦  «        }n2# t:          $ r%}tL           ?                    d+|¦  «         Y d}~nd}~ww xY wd}d}d} d}!d}"d}#d}$d}%d}&t¡          jQ        ¦   «         jR        ‰ _S        t©          d‰ jS        ¦  «         ‰ jU        rt©          d‰ jS        ¦  «         d‰ _V        nd‰ _W        d‰ _V        ‰ jX        rK	 t          |t          ¦  «        r|nd}'‰ jX         Y                    ‰ j/        |'¦  «         n# t:          $ r Y nw xY wd}(‰ jX        rG	 t          |t          ¦  «        r|nd})‰ jX         Z                    |)¦  «        pd}(n# t:          $ r Y nw xY w|‰ j!        k     r‰ j"        j[        dk    s‰ j\        �Yrß‰ j]         ^                    ¦   «          ‰ jU        r"d} d,}&‰ j5        s‰  6                    d-¦  «         �Yn�|dz  }|‰ __        ‰  `                    d.|› �¦  «         ‰ j\        rd‰ _\        nT‰ j"         a                    ¦   «         s;d/}&‰ j5        s0‰  6                    d0‰ j"        jb        › d1‰ j"        jc        › d2�¦  «         �Yn‰ jd        ��"	 g }*tË          tÍ          |¦  «        ¦  «        D ]¸\  }+},|, :                    d3¦  «        d4k    rš|, :                    d5¦  «        r…tI          |¦  «        |+z
  }-i �Š*||-d…         D ]N}.|. :                    d3¦  «        d6k    r n2|. :                    d7¦  «        }/|/r|. :                    d8d¦  «        �‰*|/<   ŒO�ˆ*fd9„|,d5         D ¦   «         }* nŒ¹‰  d                    ||*¦  «         n3# t:          $ r&}0tL           A                    d:||0¦  «         Y d}0~0nd}0~0ww xY w‰ jg        dk    rd;‰ j1        v r‰ xjh        dz  c_h        ‰  i                    ¦   «         }1|1�rid}2t•          tI          |¦  «        dz
  d<d<¦  «        D ]Ò}3||3         }4t          |4tš          ¦  «        r³|4 :                    d3¦  «        d6k    ršd=|1› �}5|4 :                    d8d¦  «        }6t          |6t          ¦  «        r	|6|5z   |4d8<   nB	 |6rtW          |6¦  «        ng }7|7 4                    d>|5d?œ¦  «         |7|4d8<   n# t:          $ r Y nw xY wd}2tL           A                    d@|3¦  «          nŒÓ|2sqt}          ‰ dAd¦  «        }8|8�<|85  ‰ jj        r‰ jj        d	z   |1z   ‰ _j        n|1‰ _j        ddd¦  «         n# 1 swxY w Y   n"t}          ‰ dBd¦  «        }6|6r|6d	z   |1z   n|1‰ _j        t}          ‰ dCd¦  «        pt×          jl        tÚ          ¦  «        }9‰  n                    ||9‰ j        ¬D¦  «        }:|:dk    r|9 '                    dE|:‰ j        pdF¦  «         g };tË          |¦  «        D �]a\  }<}=|= o                    ¦   «         }>|<|k    r¥|= :                    d3¦  «        dk    rŒg }?|(r&tá          |(¦  «        }@|@r|? 4                    |@¦  «         |r|? 4                    |¦  «         |?rI|> :                    d8d¦  «        }At          |At          ¦  «        r|Ad*z   d* O                    |?¦  «        z   |>d8<   ‰  q                    |=|>¦  «         dG|>v r|> r                    dG¦  «         dH|>v r|> r                    dH¦  «         |> r                    dId¦  «         ‰  s                    ¦   «         r‰  t                    |>¦  «         |; 4                    |>¦  «         �Œc|pd}B‰ ju        r|Bd*z   ‰ ju        z    N                    ¦   «         }B|Br	dJ|Bdœg|;z   };‰ jv        rK|Brdnd}CtË          ‰ jv        ¦  «        D ]0\  }<}D|; w                    |C|<z   |D o                    ¦   «         ¦  «         Œ1‰ jx        rtó          |;‰ jz        ‰ j{        ¬K¦  «        };‰  |                    |;¦  «        };|;D ]G}Et          |E :                    d8¦  «        t          ¦  «        r|Ed8          N                    ¦   «         |Ed8<   ŒH|;D ]ú}E|E :                    d5¦  «        }F|FsŒg }G|FD ]Ö�Š-t          �‰-tš          ¦  «        r§dL�‰-v r¢	 tû          j~        �‰-dL         dM         ¦  «        }Hi �‰-¥dLi �‰-dL         ¥dMtû          j        |HdNd¬O¦  «        i¥i¥�Š-nS# t:          $ rF �t          �‰-dL         dM         �‰-dL          :                    dPdQ¦  «        ¦  «        �‰-dL         dM<   Y nw xY w|G 4                    �‰-¦  «         Œ×|G|Ed5<   Œû�t          |;¦  «         �t          dR„ |;D ¦   «         ¦  «        }I�t          |;¦  «        }Jd�Š.‰ j5        s™‰  „                    d	‰ j…        › dS|› d1‰ j!        › d�¦  «         ‰  „                    ‰ j…        › dTtI          |;¦  «        › dU|Jd ›dV|Id ›dW�¦  «         ‰  „                    ‰ j…        › dX‰ jG        rtI          ‰ jG        ¦  «        nd› �¦  «         nä�t          j‡        �t          j‰        ¦   «         ¦  «        }K�t          j‡        �t          jŠ        ¦   «         ¦  «        }L‰ j‹        r‰  ‹                    |K› d
|L› d�¦  «         ns‰  Œ                    ¦   «         s_‰  �                    ¦   «         rK�t          j‡        g dY¢¦  «        }M�t          |K› d
|L› d�|M‰ jŽ        ¬Z¦  «        �Š.�‰. �                    ¦   «          ‰ j�        rŠt×          jA        d[‰ j(        › d\tI          |¦  «        › d]‰ jG        rtI          ‰ jG        ¦  «        nd› �¦  «         t×          jA        d^|r|d<         d3         nd› �¦  «         t×          jA        d_|Jd ›d`�¦  «         �t#          j‘        ¦   «         }Nd}O‰ j’        }Pd}Qd$}Rd}Sd}Td}Ud}Vd}Wd}Xd}Yd}Zda}[d}\d}]|O|Pk     �4r¾‰ j)        dbk    r¿	 ddcl“m”}^m•}_  |^¦   «         }`|`��|`dk    r‡dd |_|`¦  «        › de�}a‰  „                    ‰ j…        › df|a› dg�d¬h¦  «         ‰                      df|a› �¦  «         ‰  –                    ¦   «         rd}Od}%d}QŒ‘‰  —                    ||¦  «         df|a› di�||dd|adjœS n# �t0          $ r Y nt:          $ r Y nw xY w	 ‰  ™                    ¦   «          ‰  š                    |;¦  «        }]‰ j›        r�t9          |]¦  «         ‰ j        dkk    r)‰  �                    ¦   «          ž                    |]d¬l¦  «        }]	 ddl<m=}  |dm|‰ j        pd‰ j*        pd‰ j(        ‰ j)        ‰ jŸ        ‰ j        |tI          |;¦  «        tI          ‰ jG        pg ¦  «        |J|I‰ j         ¬n¦  «         n# t:          $ r Y nw xY w�tC          do¦  «        r‰  ¢                    |]dp¬q¦  «         ˆ �ˆ.fdr„}bd}ct}          ‰ dsd¦  «        rd}cn;‰  Œ                    ¦   «         s'ddtl£m¤}d t          t}          ‰ dud¦  «        |d¦  «        rd}c|cr‰  ¥                    |]|b¬v¦  «        }\n‰  ¦                    |]¦  «        }\�t#          j‘        ¦   «         |Nz
  }e�‰.r�‰. §                    d¦  «         d�Š.‰ j‹        r‰  ‹                    d¦  «         ‰ j5        s!‰  „                    ‰ j…        › dw|edx›dy�¦  «         ‰ j�        rG|\rt}          |\dzd{¦  «        nd{}ft×          jA        d||f› d}�tQ          |\d~¦  «        r|\j©        nd{› �¦  «         d}gg }h‰ j        dkk    �r‰  �                    ¦   «         }i|i ª                    |\¦  «        �sÛ|\€d}g|h 4                    d¦  «         �n(t          t}          |\d€d¦  «        pd¦  «         N                    ¦   «          «                    ¦   «         }j|jd�v ršt}          |\d‚d¦  «        }kt          |ktš          ¦  «        r|k :                    dƒ¦  «        n|krt          |k¦  «        nd„|j› d�}lt×          j?        d…|j|l‰  ¬                    ¦   «         ¦  «         d}g|h 4                    d†|j› d‡|l› �¦  «         �nFt}          |\dˆd¦  «        }mt          |mt          ¦  «        r|m N                    ¦   «         nd}n|nr*tL           A                    d‰tI          |n¦  «        ¦  «         �nÞt}          |\d€d¦  «        }ot}          |\dŠd¦  «        }ptL           ?                    d‹|o|pt}          |\dzd¦  «        dŒ‰ j        › d�‰ j)        › �¦  «         d}g|h 4                    dŽ¦  «         �nf‰ j        dk    r[‰  �                    ¦   «         }q|q ª                    |\¦  «        s0d}g|\€|h 4                    d¦  «         �n|h 4                    d�¦  «         �n ‰ j        d�k    rY‰  �                    ¦   «         }r|r ª                    |\¦  «        s/d}g|\€|h 4                    d¦  «         n²|h 4                    d‘¦  «         nœ‰  �                    ¦   «         }s|s ª                    |\¦  «        ssd}g|\€|h 4                    d¦  «         nY�tQ          |\d’¦  «        s|h 4                    d“¦  «         n2|\j­        €|h 4                    d”¦  «         n|h 4                    d•¦  «         |g�ry�‰.r�‰. §                    d–¦  «         d�Š.‰ j‹        r‰  ‹                    d¦  «         |Odz  }O‰ j®        tI          ‰ j¯        ¦  «        k     r‰                      d—¦  «         ‰  –                    ¦   «         rd}Od}%d}Q�Œ=d˜�Š+d˜}t|\rp�tQ          |\d‚¦  «        r_|\j°        rXt          |\j°        ¦  «        �Š+�tQ          |\j°        d™¦  «        r,|\j°        j±        r |\j°        j±         :                    dšd˜¦  «        }tn/|\r-�tQ          |\dƒ¦  «        r|\j²        rt          |\j²        ¦  «        �Š+|td˜k    r$|\r"�tQ          |\dz¦  «        r|\j(        r
d›|\j(        › �}t|td˜k    rL|\rJdœ„ �tg          |\¦  «         ´                    ¦   «         D ¦   «         }u‰ j�        rt×          jA        d�|u› �¦  «         d}v|\r‘�tQ          |\d‚¦  «        r€|\j°        ryt}          |\j°        džd¦  «        }w|w€4t          |\j°        tš          ¦  «        r|\j°         :                    dž¦  «        }w|w�+	 �tk          |w¦  «        }vn# �tl          �tn          f$ r Y nw xY w|vdŸk    rd |ed¡›d¢�}xna|vd£k    rd¤|ed¡›d¢�}xnS|vd¥k    rd¦}xnJ|vd§v rd¨|v› d©|ed¡›d¢�}xn;|vdªv rd«|v› d¬�}xn0|v�d­|v› d©|ed¡›d¢�}xn#|ed®k     rd¯|ed°›d±�}xn|edk    rd²|ed¡›d³�}xnd´|ed°›dy�}x‰  „                    ‰ j…        › dµ|O› d1|P› d¶d© O                    |h¦  «        › �d¬h¦  «         ‰  „                    ‰ j…        › d·|t› �d¬h¦  «         ‰  ¸                    �‰+¦  «        }y‰  „                    ‰ j…        › d¸|y› �d¬h¦  «         ‰  „                    ‰ j…        › d¹|x› �d¬h¦  «         |O|Pk    r‘‰                      dº|P› d»�¦  «         ‰  –                    ¦   «         rd}Od}%d}Q�
ŒQ‰                      d¼|P› d½�¦  «         t×          j°        ‰ j…        › d¾|P› d¿�¦  «         ‰  —                    ||¦  «         |d|d¾|P› dÀ|x› �ddÁœS �ts          |OdÂdÃ¬Ä¦  «        }z‰  „                    ‰ j…        › dÅ|zd°›dÆ|x› dÇ�d¬h¦  «         t×          j?        dÈ|O› d1|P› d¶d© O                    |h¦  «        › dÉ|t› �¦  «         �t#          j‘        ¦   «         |zz   }{d}|�t#          j‘        ¦   «         |{k     rß‰ jU        r[‰  „                    ‰ j…        › dÊ�d¬h¦  «         ‰  —                    ||¦  «         ‰  º                    ¦   «          dË|x› dÌ|O› d1|P› dÍ�||dddÎœS �t#          j»        dÏ¦  «         ||dz  }|||dÐz  dk    rB‰  `                    dÑ|O› d1|P› dÒ�tk          |{�t#          j‘        ¦   «         z
  ¦  «        › dÓ�¦  «         �t#          j‘        ¦   «         |{k     °ß�Œ+‰ j        dkk    rpt}          |\d€d¦  «        }}t}          |\dŠd¦  «        }~d}t          |~tš          ¦  «        r|~ :                    dÔ¦  «        }nt}          |~dÔd¦  «        }|}dÕk    r|dÖv rd×}[nãda}[nà‰ j        dk    r/‰  �                    ¦   «         }€|€ ¼                    |\j½        ¦  «        }[n¦‰ j        d�k    r1‰  �                    ¦   «         }�|� ¾                    |\¦  «        }‚|‚j¿        }[nj‰  �                    ¦   «         }ƒ|ƒ ¾                    |\¦  «        }„|„j¿        }[|„}…‰  À                    |[|…|¦  «        r!‰  „                    ‰ j…        › dØ�d¬h¦  «         d×}[|[d×k    �r¬‰  „                    ‰ j…        › dÙ�d¬h¦  «         d}†‰  �                    ¦   «         }‡‰ j        dk    r|‡ ¾                    |\‰ jÁ        ¬Ú¦  «        }ˆn|‡ ¾                    |\¦  «        }ˆ|ˆ}†|†rt}          |†d8d¦  «        nd}‰|†rt™          t}          |†d5d¦  «        ¦  «        nd}Št™          |‰o!�t…          jÃ        dÛ|‰�t„          jÄ        ¦  «        ¦  «        }‹|Š o|‹o|‰dur‰  Å                    |‰¦  «         p|‰du }Œ|ŒrWdÜ}�‰  „                    ‰ j…        › dÝ�d¬h¦  «         dÞ}Ž‰  Æ                    |¦  «         ‰  —                    ||¦  «         |Ž||dd|�dßœS ‰ j        dàv �r|†}…|…�� |Šsþ|"dz  }"‰  Ç                    |…|[¦  «        }�| 4                    |�¦  «         |…jÈ        r
|$|…jÈ        z  }$|"d$k     rZ‰  „                    ‰ j…        › dá|"› dâ�¦  «         ddãdœ}�| 4                    |�¦  «         |‰ _É        ‰  Ê                    |¦  «         d}Z�%n.‰  Ë                    |$¦  «         N                    ¦   «         }‘‰  Æ                    |¦  «         ‰  —                    ||¦  «         |‘pd||dddädßœS ‰ j        dàv r…|†}…|…��|Šr|#dk     r&|#dz  }#‰  „                    ‰ j…        › då�d¬h¦  «         �Œ/‰  „                    ‰ j…        › dæ�d¬h¦  «         ‰  Æ                    |¦  «         ‰  —                    ||¦  «         d||dddçdßœS tI          |¦  «        dk    rf‰  „                    ‰ j…        › dè�¦  «         ‰  Ì                    |¦  «        }’‰  Æ                    |¦  «         ‰  —                    ||¦  «         d|’|dddçdßœS ‰  „                    ‰ j…        › dé�d¬h¦  «         ‰  —                    ||¦  «         d||dddêdjœS �tQ          |\d~¦  «        �r°|\j©        �r¨�t›          |\j©        ‰ j)        ‰ j        ¬ë¦  «        }“|“jÎ        }”|“jÏ        }•|“jÐ        }–|”|•|–dìœ}—‰ jC         Ñ                    |—¦  «         t}          ‰ jC        díd¦  «        r~‰ jC        jI        }˜t}          ‰ jC        dîd¦  «        rD�t¥          ‰ j(        ‰ jŸ        |˜¦  «         ‰  6                    ‰ j…        › dï|˜d ›dð‰ j(        › �¦  «         d‰ jC        _Ó        d‰ jC        _Ô        ‰ xjÕ        |”z  c_Õ        ‰ xjÖ        |•z  c_Ö        ‰ xj×        |–z  c_×        ‰ xjØ        dz  c_Ø        ‰ xjÙ        |“jÚ        z  c_Ù        ‰ xjÛ        |“jÏ        z  c_Û        ‰ xjÜ        |“jÝ        z  c_Ü        ‰ xjÞ        |“jß        z  c_Þ        ‰ xjà        |“já        z  c_à        d}™|“jÝ        r|”rdñ|“jÝ        › d1|”› dòdó|“jÝ        z  |”z  d¡›dô�}™tL           '                    dõ‰ jØ        ‰ j(        ‰ j)        pd|”|•|–|e|™¦	  «	         �tÅ          ‰ j(        |“‰ j)        ‰ jŸ        t}          ‰ död¦  «        ¬÷¦  «        }š|šjã        �#‰ xjä        �tË          |šjã        ¦  «        z  c_ä        |šjæ        ‰ _ç        |šjè        ‰ _é        ‰ j8        r¡‰ j        rš	 ‰ j8         ê                    ‰ j        |“jÚ        |“jÏ        |“jÝ        |“jß        |“já        |šjã        ��tË          |šjã        ¦  «        nd|šjæ        |šjè        ‰ j)        ‰ jŸ        |šjæ        døk    rdùnd‰ j(        d¬ú¦  «         n# t:          $ r Y nw xY w‰ j�        r3t×          jA        dû|—dü         d ›dý|—dþ         d ›dÿ|—�d          d ›�¦  «         |“jÝ        }›|“jß        }œ|—dü         }�|›s|œrH‰ j5        sA|�dk    r|›|�z  dóz  nd}ž‰  „                    ‰ j…        › �d|›d ›d1|�d ›�d|žd¡›�d|œd ›�d�
¦  «         d}X‰ j)        dbk    r#	 d�dl“më}Ÿ  |Ÿ¦   «          n# t:          $ r Y nw xY w‰  `                    �d|› �d�¦  «         �n}# �tØ          $ r” �‰.r�‰. §                    d¦  «         d�Š.‰ j‹        r‰  ‹                    d¦  «         �t#          j‘        ¦   «         |Nz
  } ‰  „                    ‰ j…        › �d�d¬h¦  «         ‰  —                    ||¦  «         d} �d	| d°›�d
�}Y �nßt:          $ �rË}¡�‰.r�‰. §                    �d¦  «         d�Š.‰ j‹        r‰  ‹                    d¦  «         t          |¡�tÚ          ¦  «        �r/t}          ‰ �dd¦  «        �dk     �rt          |¡¦  «         «                    ¦   «         }¢�d|¢v p�d|¢v }£�d|¢v p�d|¢v o|£ }¤�t          |¦  «        }¥t          |;tV          ¦  «        r�t          |;¦  «        rd}¥t          |]tš          ¦  «        r�tÝ          |]¦  «        rd}¥t          t}          ‰ �dd¦  «        tV          ¦  «        r�t          ‰ jv        ¦  «        rd}¥|¥s|¤rY‰ xj        dz  c_        |¥r!‰  „                    ‰ j…        › �d�d¬h¦  «         n ‰  „                    ‰ j…        › �d�d¬h¦  «         Y d}¡~¡�Œ‡|£�råd‰ _›        �tß          |¦  «        }¦t          |;tV          ¦  «        r�tß          |;¦  «         t          |]tš          ¦  «        r�t9          |]¦  «         d}§t          t}          ‰ �dd¦  «        tV          ¦  «        r�tß          ‰ jv        ¦  «        }§d}¨t          t}          ‰ �dd¦  «        tV          ¦  «        r�tá          ‰ jG        ¦  «        }¨d}©t          |t          ¦  «        r!�tã          |¦  «        }ª|ª|k    r|ª}|ª‰ _7        d}©t          t}          ‰ �dd¦  «        t          ¦  «        r)�tã          ‰ ju        ¦  «        }«|«‰ ju        k    r	|«‰ _u        d}©d}¬t          t}          ‰ �dd¦  «        tš          ¦  «        r‰ jò         :                    �d¦  «        nd}­t          |­tš          ¦  «        r�t9          |­¦  «        }¬d}®t}          ‰ död¦  «        pd}¯|¯r¡�tã          |¯¦  «        }°|°|¯k    r‹|°‰ _ó        t          t}          ‰ �dd¦  «        tš          ¦  «        r
|°‰ jò        dö<   t}          ‰ dud¦  «        �"�tQ          ‰ jô        dö¦  «        r|°‰ jô        _ó        d}®‰  „                    ‰ j…        › �d�d¬h¦  «         ‰ xj        dz  c_        |¦p	|§p|¨p|©p|¬p|®}±|±r!‰  „                    ‰ j…        › �d�d¬h¦  «         n ‰  „                    ‰ j…        › �d�d¬h¦  «         Y d}¡~¡�Œot}          |¡�dd¦  «        }²‰  õ                    |¡¦  «        }³t}          ‰ �dd¦  «        }´|´rt}          |´�d�d¦  «        n�d}µ�tí          |¡t}          ‰ �d d¦  «        pdt}          ‰ dzd¦  «        pd|J|µ|;rtI          |;¦  «        nd�¬!¦  «        }¶tL           A                    �d"|¶j÷        jø        |¶jù        |¶jú        |¶jû        |¶jü        |¶jý        ¦  «         ‰  þ                    |²|X|¶j÷        |³�¬#¦  «        \  }·}X|·rY d}¡~¡�Œy‰ j        dkk    rQ‰ j)        �d$k    rE|²�d%k    r>|Ss<d}S‰  ÿ                    d¬h¦  «        r$‰  „                    ‰ j…        › �d&�¦  «         Y d}¡~¡�ŒÕ‰ j        �d'k    �r„‰ j)        dbk    �rx|²�d%k    �rp|U�smd}U‰ �                      d¬h¦  «        r�t          ‰ j…        › �d(�¦  «         Y d}¡~¡�Œ1d�d)�l�m}¸  |¸¦   «         }¹d}º	 t}          |¡�d*d¦  «        pt}          |¡�d+d¦  «        }»|»�t          |»¦  «        d�d,…         }ºn# t:          $ r Y nw xY w�t          ‰ j…        › �d-�¦  «         |ºr�t          ‰ j…        › �d.|º› �¦  «         �t          ‰ j…        › �d/�¦  «         �t          ‰ j…        › �d0�¦  «         �t          ‰ j…        › �d1�¦  «         �t          ‰ j…        › �d2�¦  «         �t          ‰ j…        › �d3|¹› �d4�¦  «         �t          ‰ j…        › �d5�¦  «         ‰ j)        �d6k    rD|²�d%k    r=|Vs;d}V‰ �                     ¦   «         r$‰  „                    ‰ j…        › �d7�¦  «         Y d}¡~¡�Œ¶‰ j        dk    �rº|²�d%k    �r²�tQ          ‰ �d8¦  «        �rŸ|T�sœd}Td�d9�l�m}¼ ‰ �                     ¦   «         r�t          ‰ j…        › �d:�¦  «         Y d}¡~¡�Œ‰ �j        }½ |¼|½¦  «        r�d;n�d<}¾�t          ‰ j…        › �d=�¦  «         �t          ‰ j…        › �d>|¾› �¦  «         �t          |½r+tI          |½¦  «        �d?k    r‰ j…        › �d@|½d�d?…         › d�n
‰ j…        › �dA�¦  «         �t          ‰ j…        › �d0�¦  «         d�d)�l�m}¸  |¸¦   «         }¹�t          ‰ j…        › �dB|¹› �dC�¦  «         �t          ‰ j…        › �dD|¹› �dE�¦  «         �t          ‰ j…        › �dF�¦  «         �t          ‰ j…        › �dG�¦  «         �t          ‰ j…        › �dH�¦  «         �t          ‰ j…        › �dI�¦  «         |¶j÷        �t          �j
        k    r„|Ws‚d}W|D ].},t          |,tš          ¦  «        r|, r                    �dJd¦  «         Œ/‰  „                    ‰ j…        › �dK�d¬h¦  «         t×          j?        �dL‰ j…        tI          |¦  «        ¦  «         Y d}¡~¡� Œ|Odz  }O�t#          j‘        ¦   «         |Nz
  }¿‰  `                    �dM|O› d1|P› d¬�¦  «         �t          |¡¦  «        jm        }Àt          |¡¦  «         «                    ¦   «         �Š+‰ �                     |¡¦  «        }ÁtL           ?                    �dN|O|P|À‰  ¬                    ¦   «         |Á¦  «         t}          ‰ �d d¦  «        }Ât}          ‰ �dOd¦  «        }At}          ‰ dzd¦  «        }Ã|²r�dP|²› �dQ�nd}Ä‰  „                    ‰ j…        › �dR|O› d1|P› d¶|À› |Ä› �d¬h¦  «         ‰  „                    ‰ j…        › �dS|Â› �dT|Ã› �d¬h¦  «         ‰  „                    ‰ j…        › �dU|A› �d¬h¦  «         ‰  „                    ‰ j…        › �dV|Á› �d¬h¦  «         |²rY|²�dWk     rRt}          |¡�d*d¦  «        }Å|Årt          |Å¦  «        d�dX…         nd}Æ|Ær"‰  „                    ‰ j…        › �dY|Æ› �d¬h¦  «         ‰  „                    ‰ j…        › �dZ|¿dx›�d[tI          |;¦  «        › �d\|Jd ›d`�¦  «         ‰ �                     ¦   «         r”�d]�‰+v rŽ‰  „                    ‰ j…        › �d^|Ã› �d_�d¬h¦  «         ‰ �j        r@‰  „                    ‰ j…        › �d`�d¬h¦  «         ‰  „                    ‰ j…        › �da�d¬h¦  «         ‰  „                    ‰ j…        › �db|Ã› �d¬h¦  «         ‰ jU        r‰  „                    ‰ j…        › �dc�d¬h¦  «         ‰  —                    ||¦  «         ‰  º                    ¦   «          �dd|À› d‡‰  ¸                    t          |¡¦  «        ¦  «        › dÍ�||dddÎœcY d}¡~¡S t}          |¡�dd¦  «        }²|¶j÷        �t          �j        k    �r)�d}Ç‰ jC        }È|ÈjI        }É|É|Çk    r‚|È�                     ‰ j(        |Ç‰ jŸ        t}          ‰ död¦  «        ‰ j)        �¬e¦  «         �tQ          |Èdí¦  «        rd|È_Ó        d|È_Ô        ‰  „                    ‰ j…        › �df|Éd ›�dg|Çd ›d`�d¬h¦  «         |%dz  }%|%|Rk    r…tI          |¦  «        }Ê‰  K                    |||J|¬%¦  «        \  }}d}tI          |¦  «        |Êk     s|É|Çk    r?‰                      �dh|Çd ›�di|Éd ›�dj�¦  «         �t#          j»        �d¦  «         d}YY d}¡~¡�n|¶j÷        �t          �j        �t          �j        fv }Ë|Ërr‰ j®        tI          ‰ j¯        ¦  «        k     rU�t'          ‰ �j        ¦  «        }Ì|Ìs=‰                      �dk¦  «         ‰  –                    |¶j÷        ¬q¦  «        rd}Od}%d}QY d}¡~¡�%ŒP|Ër¯‰ j)        dbk    r¤|¶j÷        �t          �j        k    r�|·s‹d}Í	 d�dll“�m}Î�m}Ï t}          |¡�d+d¦  «        }Ð|Ðrt}          |Ð�dmd¦  «        nd}Ñ |Î|Ñ‰ �j        �¬n¦  «        }Í|Ír |Ï|Ñ|³�¬o¦  «         nt×          j'        �dp¦  «         n# t:          $ r Y nw xY w|Ír|P}OY d}¡~¡�&Œ|¶j÷        �t          �j        k    }Ò|Ò�rÇ|%dz  }%|%|Rk    r‘‰  „                    ‰ j…        › �dq|R› �dr�d¬h¦  «         ‰  „                    ‰ j…        › �ds�d¬h¦  «         t×          j°        ‰ j…        › �dt|R› �du�¦  «         ‰  —                    ||¦  «         |d|�dv|R› �dw�ddd�dxœcY d}¡~¡S ‰                      �dy|%› d1|R› d�¦  «         tI          |¦  «        }Ê‰  K                    |||J|¬%¦  «        \  }}d}tI          |¦  «        |Êk     rJ‰                      �dz|Ê› �dgtI          |¦  «        › �d{�¦  «         �t#          j»        �d¦  «         d}YY d}¡~¡�ng‰  „                    ‰ j…        › �d|�d¬h¦  «         ‰  „                    ‰ j…        › �ds�d¬h¦  «         t×          j°        ‰ j…        › �d}�¦  «         ‰  —                    ||¦  «         |d|�d~ddd�dxœcY d}¡~¡S |¶j÷        �t          �j        k    }Ó|Ó�rÇ‰ jC        }È|ÈjI        }É�t5          �‰+¦  «        }Ô|Ô�ï�t7          d|Ô�dz
  ¦  «        }Õ|Õ‰ �_        ‰  „                    ‰ j…        › �d€|Õd ›�d�|Ôd ›�d‚|Éd ›d¬�d¬h¦  «         |%dz  }%|%|Rk    r‘‰  „                    ‰ j…        › �dq|R› �dw�d¬h¦  «         ‰  „                    ‰ j…        › �ds�d¬h¦  «         t×          j°        ‰ j…        › �dƒ|R› �du�¦  «         ‰  —                    ||¦  «         |d|�d„|R› �dw�ddd�dxœcY d}¡~¡S d}YY d}¡~¡�n¹�t;          �‰+¦  «        }Öt}          ‰ �d d¦  «        pd «                    ¦   «         }×t}          ‰ �dOd¦  «        pd�                     d1¦  «         «                    ¦   «         }Ø|×�d…v p|Ø�                     �d†¦  «        }Ù|Ùo	|Ödu o�d‡�‰+v }Ú|Ör2|Ö|Ék     r,|Ö}Û‰  „                    ‰ j…        › �dˆ|Ûd ›�di|Éd ›d¬�d¬h¦  «         n:|Úr(|É}Û‰  „                    ‰ j…        › �d‰|Éd ›�dŠ�d¬h¦  «         n�tA          |É¦  «        }Û|Ûrœ|Û|Ék     r–|È�                     ‰ j(        |Û‰ jŸ        t}          ‰ död¦  «        ‰ j)        �¬e¦  «         �tQ          |Èdí¦  «        r!d|È_Ó        t™          |Öo|Ö|Ûk    ¦  «        |È_Ô        ‰  „                    ‰ j…        › �d‹|Éd ›�dg|Ûd ›d`�d¬h¦  «         n ‰  „                    ‰ j…        › �dŒ�d¬h¦  «         |%dz  }%|%|Rk    r‘‰  „                    ‰ j…        › �dq|R› �dw�d¬h¦  «         ‰  „                    ‰ j…        › �ds�d¬h¦  «         t×          j°        ‰ j…        › �dƒ|R› �du�¦  «         ‰  —                    ||¦  «         |d|�d„|R› �dw�ddd�dxœcY d}¡~¡S ‰                      �d�|Jd ›�dŽ|%› d1|R› dÇ�¦  «         tI          |¦  «        }Ê‰  K                    |||J|¬%¦  «        \  }}d}tI          |¦  «        |Êk     s|Ûrc|Û|Ék     r]tI          |¦  «        |Êk     r,‰                      �dz|Ê› �dgtI          |¦  «        › �d{�¦  «         �t#          j»        �d¦  «         d}YY d}¡~¡�n‘‰  „                    ‰ j…        › �d��d¬h¦  «         ‰  „                    ‰ j…        › �d��d¬h¦  «         t×          j°        ‰ j…        › �d‘|Jd ›�d’�¦  «         ‰  —                    ||¦  «         |d|�d“|Jd ›�d”�ddd�dxœcY d}¡~¡S t          |¡�tn          �tl          f¦  «        o@t          |¡�tÚ          tú          �j!        f¦  «         ot          |¡�tD          �j#        ¦  «         }Ü|Üps|¶jú         ok|¶jû         oc|¶j÷        �t          �j        �t          �j        �t          �j$        �t          �j        �t          �j        �t          �j        �t          �j
        fvo|Ó }Ý|Ý�r÷‰                      �d•|²› �d–�¦  «         ‰  –                    ¦   «         rd}Od}%d}QY d}¡~¡�-ŒÙ|]�‰  ¢                    |]�d—|¡�¬˜¦  «         ‰                      �d™|²› d¶‰ �                     |¡¦  «        › �¦  «         ‰  „                    ‰ j…        › �dš|²› �d›�d¬h¦  «         ‰  „                    ‰ j…        › �dS|Â› �dT|Ã› �d¬h¦  «         ‰  „                    ‰ j…        › �dU|A› �d¬h¦  «         |¶�j%        s|¶j÷        �t          �j        k    �r2|Â�d$k    rˆ|²�d%k    r�‰  „                    ‰ j…        › �dœ�d¬h¦  «         ‰  „                    ‰ j…        › �d��d¬h¦  «         ‰  „                    ‰ j…        › �dž�d¬h¦  «         ‰  „                    ‰ j…        › �dŸ�d¬h¦  «         nÃ‰  „                    ‰ j…        › �d �d¬h¦  «         ‰  „                    ‰ j…        › �d¡�d¬h¦  «         ‰  „                    ‰ j…        › �d¢|Ã› dQ�d¬h¦  «         �tM          t          |A¦  «        �d£¦  «        r ‰  „                    ‰ j…        › �d¤�d¬h¦  «         n ‰  „                    ‰ j…        › �d¥�d¬h¦  «         t×          j°        ‰ j…        › �d¦|¡› �¦  «         |²�d§k    r;|J�d¨k    stI          |;¦  «        dk    r!‰  „                    ‰ j…        › �d©�d¬h¦  «         n‰  —                    ||¦  «         d||ddt          |¡¦  «        djœcY d}¡~¡S |O|Pk    �rÊ|Qs$‰ � '                    |¡|O|P�¬ª¦  «        r
d}Qd}OY d}¡~¡�0ŒÂ‰                      dº|P› �d«�¦  «         ‰  –                    ¦   «         rd}Od}%d}QY d}¡~¡�0Œü‰ �                     |¡¦  «        }Þ|Ër‰                      �d¬|P› �d­|Þ› �¦  «         n‰                      �d®|P› �d­|Þ› �¦  «         ‰  „                    ‰ j…        › �d¯|Þ› �d¬h¦  «         t}          |¡�dd¦  «         o�tQ          �ˆ+f�d°„�d±D ¦   «         ¦  «        }ß|ßr@‰  „                    ‰ j…        › �d²�d¬h¦  «         ‰  „                    ‰ j…        › �d³�d¬h¦  «         t×          j°        �d´‰ j…        |P|Þ|Â|ÃtI          |;¦  «        |Jd ›¦  «         |]�‰  ¢                    |]�dµ|¡�¬˜¦  «         ‰  —                    ||¦  «         �d¶|P› dÀ|Þ› �}à|ßr|à�d·z  }à|à||dd|ÞdjœcY d}¡~¡S d}á|ËrŸt}          t}          |¡�d+d¦  «        �dmd¦  «        }â|âr{�tQ          |â�d¸¦  «        ri|â :                    �d¹¦  «        p|â :                    �dº¦  «        }ã|ãr;	 �tS          �tk          |ã¦  «        �d»¦  «        }án# �tl          �tn          f$ r Y nw xY w|ár|án�ts          |O�d¼�d½¬Ä¦  «        }z|Ër&‰                      �d¾|zd°›�d¿|Odz   › d1|P› dÇ�¦  «         n!‰                      dÅ|zd°›�d¿|O› d1|P› dÇ�¦  «         tL           ?                    �dÀ|z|O|P‰  ¬                    ¦   «         |¡¦  «         �t#          j‘        ¦   «         |zz   }{d}|�t#          j‘        ¦   «         |{k     rã‰ jU        r^‰  „                    ‰ j…        › dÊ�d¬h¦  «         ‰  —                    ||¦  «         ‰  º                    ¦   «          �dÁ|O› d1|P› dÍ�||dddÎœcY d}¡~¡S �t#          j»        dÏ¦  «         ||dz  }|||dÐz  dk    rC‰  `                    �dÂ|O› d1|P› dÒ�tk          |{�t#          j‘        ¦   «         z
  ¦  «        › dÓ�¦  «         �t#          j‘        ¦   «         |{k     °ãY d}¡~¡nd}¡~¡ww xY w|O|Pk     �4°¾| r�dÃ}&�n|Yr(|dz  }‰ j"        � *                    ¦   «          |Odz  }Od}Y�?Œ|Zr3‰ j         r‰ j         n�dÄ}ä|ä|"dz   z  }å�tS          |å�dÅ¦  «        ‰ �_        �?ŒS|\€4�dÆ}&�t          ‰ j…        › �dÇ�¦  «         ‰  —                    ||¦  «         �ny	 ‰  �                    ¦   «         }æi }ç‰ j        dk    r‰ jÁ        |ç�dÈ<    |æj¾        |\fi |ç¤Ž}è|è}…|èj¿        }[|…jÈ        ��Žt          |…jÈ        t          ¦  «        �ss|…jÈ        }ét          |étš          ¦  «        rG|é :                    d>d¦  «        p)|é :                    d8d¦  «        ptû          j        |é¦  «        |…_È        �nt          |étV          ¦  «        rçg }ê|éD ]Ç}ët          |ët          ¦  «        r|ê 4                    |ë¦  «         Œ-t          |ëtš          ¦  «        rD|ë :                    �dÉ¦  «        d>k    r*|ê 4                    |ë :                    d>d¦  «        ¦  «         Œ†t          |ëtš          ¦  «        r,d>|ëv r(|ê 4                    t          |ëd>         ¦  «        ¦  «         ŒÈd	 O                    |ê¦  «        |…_È        nt          |é¦  «        |…_È        	 ddl<m=} t}          |…d5d¦  «        pg }ì|…jÈ        pd}í |	 �dN|‰ j        pd‰ j*        pd‰ j(        ‰ j)        ‰ jŸ        ‰ j        ||e|[tI          |;¦  «        t}          |\dzd¦  «        ‰ � +                    |\¦  «        tI          |í¦  «        tI          |ì¦  «        �dËœŽ n# t:          $ r Y nw xY w|…jÈ        r}‰ j5        sv‰ j�        r&‰  „                    ‰ j…        › �dÌ|…jÈ        › �¦  «         nI‰  „                    ‰ j…        › �dÌ|…jÈ        ddó…         › tI          |…jÈ        ¦  «        dók    rdnd› �¦  «         |…jÈ        rî‰ �j,        ræ|…jÈ         N                    ¦   «         }î�t…          �j-        �dÍd|î¦  «         N                    ¦   «         }î|îr$|î� .                    d	¦  «        d         dd…         nd}ï|ïr@t}          ‰ �dÎd¦  «        dk    r*	 ‰ � ,                    �dÏ|ï¦  «         nH# t:          $ r Y n<w xY w|îr6	 ‰ � ,                    �dÐ�dÏ|îd�dW…         d¦  «         n# t:          $ r Y nw xY w�t_          |…jÈ        pd¦  «        rÔ‰ xj        dz  c_        ‰  „                    ‰ j…        › �dÑ�¦  «         ‰ j        �dk    r)‰  „                    ‰ j…        › �dÒ‰ j        › �dÓ�¦  «         �DŒ‰  „                    ‰ j…        › �dÔ�d¬h¦  «         d‰ _        ‰  Ì                    |¦  «        }’‰  Æ                    |¦  «         ‰  —                    ||¦  «         d|’|dd�dÕdßœS d‰ _        ‰ j        dkk    �r|[dÕk    �rú‰ xj        dz  c_        ‰  Ç                    |…|[¦  «        }�t™          |� :                    d8¦  «        pd N                    ¦   «         ¦  «        }ðt          |� :                    dG¦  «        t          ¦  «        r5t™          |� :                    dGd¦  «         N                    ¦   «         ¦  «        nd}ñt™          |� :                    �dÖ¦  «        ¦  «        }òt™          |� :                    �d×¦  «        ¦  «        }ó|ðs|ñs|òs|ó�rr|r|d<         nd}ôt          |ôtš          ¦  «        r|ô :                    �dÖ¦  «        nd}õ|� :                    �dÖ¦  «        }öt          |ôtš          ¦  «        r|ô :                    �d×¦  «        nd}÷|� :                    �d×¦  «        }øt          |ôtš          ¦  «        o�|ô :                    d3¦  «        d4k    o„|ô :                    dH¦  «        dÕk    ok|ô :                    d8¦  «        pd|� :                    d8¦  «        pdk    o;|ô :                    dG¦  «        pd|� :                    dG¦  «        pdk    o|õ|ök    o|÷|øk    }ù|ùs+| 4                    |�¦  «         ‰ � 0                    |�¦  «         ‰ j        d$k     rL‰ j5        s'‰  „                    ‰ j…        › �dØ‰ j        › �dÙ�¦  «         |‰ _É        ‰  Ê                    |¦  «         �GŒmd‰ _        ‰  —                    ||¦  «         d||dd�dÚdßœS �tQ          ‰ �dÛ¦  «        rd‰ _        |…�j1        �rð‰ j5        s5‰  „                    ‰ j…        › �dÜtI          |…�j1        ¦  «        › �dÝ�¦  «         ‰ j�        rL|…�j1        D ]C�Š-t×          jA        �dÞ�‰-�j2        �j3        › �dß�‰-�j2        �j4        d�d,…         › d�¦  «         ŒD|…�j1        D ]z�Š-�‰-�j2        �j3        ‰ j1        vra‰ � 5                    �‰-�j2        �j3        ¦  «        }ú|úr<�t          ‰ j…        › �dà�‰-�j2        �j3        › �dá|ú› d�¦  «         |ú�‰-�j2        �_3        Œ{ˆ f�dâ„|…�j1        D ¦   «         }û|û�rp‰ xj        dz  c_        d© O                    �tm          ‰ j1        ¦  «        ¦  «        }ü|ûd         }ýtI          |ý¦  «        dk    r|ýdd…         dz   n|ý}þ‰  „                    ‰ j…        › �dã|þ› �dä‰ j        › �dÙ�¦  «         ‰ j        d$k    rJ‰  „                    ‰ j…        › �då�d¬h¦  «         d‰ _        ‰  —                    ||¦  «         d||dd�dæ|þ› �dßœS ‰  Ç                    |…|[¦  «        }ÿ| 4                    |ÿ¦  «         |…�j1        D ]X�Š-�‰-�j2        �j3        ‰ j1        vr�dç�‰-�j2        �j3        › �dè|ü› ��} n�dé�} | 4                    d6�‰-�j7        �| �dêœ¦  «         ŒY�JŒPd‰ _        g �Š,|…�j1        D �](�Š-�‰-�j2        �j4        �}t          �|tš          tV          f¦  «        r#tû          j        �|¦  «        �‰-�j2        �_4        ŒT�|�Ct          �|t          ¦  «        s-t          �|¦  «        �‰-�j2        �_4        �‰-�j2        �j4        �}�|r�| N                    ¦   «         s�dë�‰-�j2        �_4        ŒÃ	 tû          j~        �|¦  «         ŒÚ# tú          �j!        $ r=}�‰, 4                    �‰-�j2        �j3        t          |¦  «        f¦  «         Y d}~�Œ"d}~ww xY w�‰,�rÐ�tQ          �ˆ,f�dì„|…�j1        D ¦   «         ¦  «        �}�|r_‰  „                    ‰ j…        › �dí|[›�dî�d¬h¦  «         d‰ _        ‰  Æ                    |¦  «         ‰  —                    ||¦  «         d||dddçdßœS ‰ xj        dz  c_        �‰,d         \  �}�Š+‰  „                    ‰ j…        › �dï�|› �dð�‰+› �¦  «         ‰ j        d$k     r(‰  „                    ‰ j…        › �dÒ‰ j        › dâ�¦  «         �LŒŽ‰  „                    ‰ j…        › �dñ�¦  «         d‰ _        ‰  Ç                    |…|[¦  «        �}| 4                    �|¦  «         �dò„ �‰,D ¦   «         �}|…�j1        D ]f�Š-�‰-�j2        �j3        �|v r+�tq          �ˆ-f�dó„�‰,D ¦   «         ¦  «        �}�dô�|› �dõ��}n�dö�}| 4                    d6�‰-�j7        �|�dêœ¦  «         Œg�MŒ`d‰ _        ‰ � 9                    |…�j1        ¦  «        |…�_1        ‰ � :                    |…�j1        ¦  «        |…�_1        ‰  Ç                    |…|[¦  «        }ÿ|…jÈ        pd�}�|rÙ‰  Å                    �|¦  «        rÃ�|‰ _        �tw          h �d÷£¦  «        �Š)�ty          �ˆ)f�dø„|…�j1        D ¦   «         ¦  «        �}	�|	‰ _        �|	r‰  Œ                    ¦   «         rd‰ _        n[‰ � =                    ¦   «         rF‰  Ë                    �|¦  «         N                    ¦   «         �}
�|
r‰  „                    �dù�|
› �¦  «         d�}|r…t          |d<         tš          ¦  «        rj|d<          :                    dI¦  «        rO| r                    ¦   «          d�}|r6t          |d<         tš          ¦  «        r|d<          :                    dI¦  «        °O�|rd‰ _        d‰ _        d‰ _        | 4                    |ÿ¦  «         ‰ � 0                    |ÿ¦  «         ‰ �j>        r(	 ‰ � >                    d¦  «         n# t:          $ r Y nw xY w‰ � ?                    |…|||¦  «         d}#d‰ �_@        �dú„ |…�j1        D ¦   «         �}�|�dûhk    r‰ j"        � *                    ¦   «          ‰ jC        }´|´�jA        dk    r
|´�jA        �}n�t          |¦  «        �}‰ jB        rU|´ û                    �|¦  «        r?‰  6                    �dü¦  «         ‰  K                    ||‰ jC        �jA        |¬%¦  «        \  }}d}|‰ _É        ‰  Ê                    |¦  «         �PŒ¦|…jÈ        pd}d‰ _        ‰  Å                    |¦  «        �set}          ‰ �dýd¦  «        pd�}‰  Å                    �|¦  «        ry�dþ}&‰  Ë                    �|¦  «         N                    ¦   «         �}tL           '                    �dÿtI          �|¦  «        ¦  «         ‰                      �d ¦  «         �|}d‰ �_B        �n’t}          ‰ �dd¦  «        �}�|r�t}          ‰ �dd¦  «        r{�d}&tL           '                    �d¦  «         ‰                      �d¦  «         d‰ _        d‰ _        d‰ _        ‰  Ë                    �|¦  «         N                    ¦   «         }d‰ �_B        �nï�tQ          �d„ |�dd…         D ¦   «         ¦  «        �}�|r§t}          ‰ �dd¦  «        s•d‰ _        d‰ _        d‰ _        tL           '                    �d	¦  «         ‰                      �d
¦  «         ‰  Ç                    |…|[¦  «        �}�d�|d8<   | 4                    �|¦  «         | 4                    d�ddœ¦  «         �RŒât™          t}          |…dGd¦  «        p#t}          |…�dd¦  «        pt}          |…�dJd¦  «        ¦  «        �}�|r«‰ j        �dk     rŸ‰ xj        dz  c_        tL           '                    �d‰ j        ¦  «         ‰                      �d‰ j        › �d�¦  «         ‰  Ç                    |…dÕ¦  «        }�d|�dI<   | 4                    |�¦  «         |‰ _É        ‰  Ê                    |¦  «         �SŒÓ‰  Ë                    |¦  «         N                    ¦   «          �}�|o‰ j        �dk    �}�|rj�|r�|rd‰ j        d$k     rY‰ xj        dz  c_        tL           ?                    �d‰ j        ‰ j(        ¦  «         ‰                      �d‰ j        › �dÙ�¦  «         �TŒy�|rµ‰ j¯        r®tL           ?                    �d‰ j        ‰ j(        ‰ j)        ¦  «         ‰                      �d¦  «         ‰  –                    ¦   «         rWd‰ _        ‰                      �d‰ j(        › dò‰ j)        › d¬�¦  «         tL           '                    �d‰ j(        ‰ j)        ¦  «         �UŒ1�d}&‰ � C                    |…¦  «        �}‰  Ç                    |…|[¦  «        }ÿ�d|ÿd8<   | 4                    |ÿ¦  «         �|r\tI          �|¦  «        �dWk    r�|d�dW…         dz   n�|�}tL           ?                    �d�|¦  «         ‰                      �d¦  «         nQtL           ?                    �d‰ j        ‰ j(        ‰ j)        ¦  «         ‰                      �d‰ j¯        r�dn�dz   ¦  «         �d}�nÑd‰ _        d‰ _        ‰ j        dkk    r§‰ j1        r |!�dk     r™‰ � D                    |||�¬¦  «        r|!dz  }!‰  Ç                    |…dÕ¦  «        }�| 4                    |�¦  «         ‰ � 0                    |�¦  «         d�ddœ}�| 4                    |�¦  «         |‰ _É        ‰  Ê                    |¦  «         �VŒñd}!|$r	|$|z   }d}$d}"‰  Ë                    |¦  «         N                    ¦   «         }‰  Ç                    |…|[¦  «        �}|r‚t          |d<         tš          ¦  «        rg|d<          :                    dI¦  «        rL| r                    ¦   «          |r6t          |d<         tš          ¦  «        r|d<          :                    dI¦  «        °L| 4                    �|¦  «         �d |[› d¬�}&‰ j5        s‰  6                    �d!|› �d"�¦  «         �n# t:          $ �rÏ}�d#|› d‡t          |¦  «        › ��Š+	 �t          �d$�‰+› �¦  «         n4# �tŠ          �tn          f$ r tL           °                    �‰+¦  «         Y nw xY wtL           A                    �d%|d�¬&¦  «         t•          tI          |¦  «        dz
  d<d<¦  «        D ]à}<||<         }=t          |=tš          ¦  «        s nÀ|= :                    d3¦  «        d6k    rŒ;|= :                    d3¦  «        d4k    rŒ|= :                    d5¦  «        rw�d'„ ||<dz   d…         D ¦   «         �}|=d5         D ]U�Š-�‰-rt          �‰-tš          ¦  «        sŒ�‰-�d(         �|vr+d6�‰-�d(         �d)�‰+› ��dêœ�}| 4                    �|¦  «         ŒV |‰ j!        dz
  k    r4�d*�‰+dd…         › d¬�}&�d+�‰+› �}| 4                    d4|dœ¦  «         Y d}~n1Y d}~nd}~ww xY w|‰ j!        k     r‰ j"        j[        dk    �Y°×‰ j\        �Y°ß|€�|‰ j!        k    s‰ j"        j[        dk    rr�d,|› d1‰ j!        › d¬�}&‰                      �d-|› d1‰ j!        › �d.�¦  «         ‰ j5        s"‰  6                    d0|› d1‰ j!        › �d/�¦  «         ‰ � F                    ||¦  «        }|duo
|‰ j!        k     �}‰ � G                    |tG          |¦  «        �|¦  «         ‰  Æ                    |¦  «         ‰  —                    ||¦  «         |r|d<          :                    d3¦  «        nd�}d�}�|d6k    r›tÍ          |¦  «        D ]‹},|, :                    d3¦  «        d4k    rp|, :                    d5¦  «        r[|,d5         �}�|rMt          �|d         tš          ¦  «        r1�|d<          :                    dLi ¦  «         :                    dP¦  «        �} nŒŒ�t          �d0„ |D ¦   «         ¦  «        �}|rtI          |¦  «        nd�} ‰ j"        r‰ j"        jb        nd�}!‰ j"        r‰ j"        jc        nd�}"�d1�}#|&‰ j(        |‰ j!        �|!�|"�|�|�| ‰ j        pdf
�}$�|d6k    r"| s tM          j?        �d2�|#z   �d3z   g�|$¢�|‘R Ž  ntM          j'        �|#g�|$¢R Ž  |ry| sw	 ddl<m=}  |�d4‰ j        ||tW          |¦  «        ‰ j(        t}          ‰ dd¦  «        pd�¬5¦  «         n3# t:          $ r&}tL           ?                    �d6|¦  «         Y d}~nd}~ww xY wd�}%tÍ          |¦  «        D ];}=|= :                    d3¦  «        d4k    r |= :                    dG¦  «        r|=dG         �}% nŒ<i �d7|“�d8�|%“�d9|“�d:|“�d;�|“�d<d“�d=| “�d>t}          ‰ �d?d¦  «        “dz‰ j(        “�d ‰ j)        “�dO‰ jŸ        “�d@‰ jÙ        “�dA‰ jÛ        “�dB‰ jÜ        “�dC‰ jÞ        “�dD‰ jà        “dü‰ jÕ        “‰ jÖ        ‰ j×        t}          ‰ jC        �dEd¦  «        pd‰ jä        ‰ jç        ‰ jé        �dFœ¥�}&‰  i                    ¦   «         �}'�|'r�|'�|&�dG<   d‰ �_B        | r‰ jW        r‰ jW        �|&�dH<   ‰  º                    ¦   «          d‰ _	        d�}(‰ jg        dk    r#‰ jh        ‰ jg        k    rd;‰ j1        v r
d�}(d‰ _h        ‰ � H                    ||| �¬I¦  «         |rA| s?|s�|(r:	 ‰ � I                    tW          |¦  «        |�|(�¬J¦  «         n# t:          $ r Y nw xY w	 ddl<m=}  |�dK‰ j        �|| ‰ j(        t}          ‰ dd¦  «        pd�¬L¦  «         n3# t:          $ r&}tL           ?                    �dM|¦  «         Y d}~nd}~ww xY w�|&S (O  a[  
        Run a complete conversation with tool calling until completion.

        Args:
            user_message (str): The user's message/question
            system_message (str): Custom system message (optional, overrides ephemeral_system_prompt if provided)
            conversation_history (List[Dict]): Previous conversation messages (optional)
            task_id (str): Unique identifier for this task to isolate VMs between concurrent tasks (optional, auto-generated if not provided)
            stream_callback: Optional callback invoked with each text delta during streaming.
                Used by the TTS pipeline to start audio generation before the full response.
                When None (default), API calls use the standard non-streaming path.
            persist_user_message: Optional clean user message to store in
                transcripts/history when user_message contains API-only
                synthetic prefixes.
                    or queuing follow-up prefetch work.

        Returns:
            Dict: Complete conversation result with final response and message history
        r   )Úset_session_contextNFr¸  u~   ðŸ”Œ Detected stale connections from a previous provider issue â€” cleaned up automatically. Proceeding with fresh connection.r5  ræ  r¯  r´  zPconversation turn: session=%s model=%s provider=%s platform=%s history=%d msg=%rr  ro  r¢   r2  Tr_  rŠ  u   ðŸ’¬ Starting conversation: 'r  r€   r  r  )Úinvoke_hookr  rg  )r“  r‚  rg  z on_session_start hook failed: %sz*Session DB update_system_prompt failed: %s)r  rR  zDPreflight compression: ~%s tokens >= %s threshold (model %s, ctx %s)r,  u   ðŸ“¦ Preflight compression: ~z tokens >= z
 thresholdrJ  )r„  rR  Úpre_llm_callr  )r“  r  rq  Úis_first_turnr‚  rg  Ú	sender_idr[  rK  zpre_llm_call hook failed: %sÚinterrupted_by_useru2   
âš¡ Breaking out of tool loop due to interrupt...zstarting API call #Úbudget_exhaustedu%   
âš ï¸�  Iteration budget exhausted (rÀ  z iterations used)r  r”  rà   r  rY  r  c                 óÜ   •— g | ]h}t          |t          ¦  «        ¯|d          d         ‰                     |                     d¦  «        ¦  «        |d                               d¦  «        dœ‘ŒiS )rÇ   rp   r  r×   )rp   rÊ  r×   r  )rÉ   rÊ   Ú_results_by_ids     €rZ   rË   z,AIAgent.run_conversation.<locals>.<listcomp>�%  s~   ø€ ð *ð *ð *ð %'Ý#-¨bµ$Ñ#7Ô#7ð*à,.¨z¬N¸6Ô,BØ.<×.@Ò.@ÀÇÂÈÁÄÑ.NÔ.NØ13°J´×1CÒ1CÀKÑ1PÔ1Pð!"ð !"ð*ð *ð *r\   z&step_callback error (iteration %s): %srl  r4  r)  r÷   r*  z<Pre-API-call steer drain: injected into tool msg at index %drž  r�  r6  rq  zFSanitized %s corrupted tool_call arguments before request (session=%s)rÀ  rE  r  ri	  ri  )rÔ  Únative_anthropicrÇ   r×   r+  )r.  Ú	sort_keysrp   r%  c              3   óN   K  — | ] }t          t          |¦  «        ¦  «        V — Œ!d S rg   rÒ  r  s     rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>c&  s.   è è € ÐDÐD°�c¥# c¡(¤(™mœmÐDÐDÐDÐDÐDÐDr\   u   ðŸ”„ Making API call #u      ðŸ“Š Request size: z messages, ~z
 tokens (~z chars)u      ðŸ”§ Available tools: )ÚbrainÚsparkleÚpulseÚmoonÚstarr	  zAPI Request - Model: z, Messages: z	, Tools: zLast message role: zTotal message size: ~z tokensr  r}  )Únous_rate_limit_remainingÚformat_remainingu,   Nous Portal rate limit active â€” resets in ú.u   â�³ z Trying fallback...r’  zg

No fallback provider available. Try again after the reset, or add a fallback provider in config.yaml.)rO  r
  Ú	api_callsr«  ÚfailedrÀ  rµ  rl  Úpre_api_request)rR  r“  rg  r‚  r|  rˆ   r}  rB  r  Ú
tool_countÚapprox_input_tokensÚrequest_char_countrŸ  ÚHERMES_DUMP_REQUESTSÚ	preflightr,  c                  óv   •— ‰r‰                      d¦  «         d Š‰ j        r‰                      d¦  «         d S d S rt  )r  r—  )rX   Úthinking_spinners   €€rZ   Ú_stop_spinnerz/AIAgent.run_conversation.<locals>._stop_spinnerï&  sT   ø€ à+ð 4Ø,×1Ò1°"Ñ5Ô5Ð5Ø/3Ð,ØÔ1ð 7Ø ×2Ò2°2Ñ6Ô6Ð6Ð6Ð6ð7ð 7r\   r`  rë  rÆ  r÷  u   â�±ï¸�  API call completed in r!	  r¾  r‚  zN/AzAPI Response received - Model: z	, Usage: rä  zresponse is NonerG  >   r¤	  Ú	cancelledrÀ  r�  zResponses API returned status 'z>Codex response status='%s' (error=%s). Routing to fallback. %szresponse.status=rT  rK  zaCodex response.output is empty but output_text is present (%d chars); deferring to normalization.rH  zeCodex response.output is empty after stream backfill (status=%s, incomplete_details=%s, model=%s). %sz	api_mode=rå  zresponse.output is emptyz/response.content invalid (not a non-empty list)r¶  z/Bedrock response invalid (no output or choices)r"  z#response has no 'choices' attributezresponse.choices is Nonezresponse.choices is emptyu   (Â´;Ï‰;`) oops, retrying...u<   âš ï¸� Empty/malformed response â€” switching to fallback...ÚUnknownrˆ  r%  zmodel=c                 ón   — i | ]2\  }}|                      d ¦  «        °|t          |¦  «        dd…         “Œ3S )rE  Nrz  )rŠ  rc   ró  s      rZ   rö  z,AIAgent.run_conversation.<locals>.<dictcomp>—'  sA   € Ð)vÐ)vÐ)v¹d¸aÀÐde×dpÒdpÐqtÑduÔduÐ)v¨!­S°©V¬V°D°S°D¬\Ð)vÐ)vÐ)vr\   z*Response attributes for invalid response: rÔ  i  z-upstream provider timed out (Cloudflare 524, z.0frÒ  iø  zupstream gateway timeout (504, r£  z'rate limited by upstream provider (429))rÆ  iö  zupstream server error (r  )i÷  i  zupstream provider overloaded (re  zupstream error (code r1  zfast response (r	  u   s) â€” likely rate limitedzslow response (u   s) â€” likely upstream timeoutzresponse time u&   âš ï¸�  Invalid API response (attempt z): u      ðŸ�¢ Provider: u      ðŸ“� Provider message: u      â�±ï¸�  u   âš ï¸� Max retries (u.   ) for invalid responses â€” trying fallback...u   â�Œ Max retries (z,) exceeded for invalid responses. Giving up.zInvalid API response after z	 retries.z
 retries: )r
  r«  r£	  rÀ  r¤	  r	  r  )Ú
base_delayÚ	max_delayu   â�³ Retrying in zs (z)...zInvalid API response (retry z | Provider: u3   âš¡ Interrupt detected during retry wait, aborting.z$Operation interrupted during retry (z
, attempt z).)rO  r
  r£	  r«  rP  rQ  rÐ  zretry backoff (z), zs remainingr  Ú
incomplete>   r  Úmax_output_tokensr  uA   âš ï¸�  Treating suspicious Ollama/GLM stop response as truncateduQ   âš ï¸�  Response truncated (finish_reason='length') - model hit max output tokensrm	  z8<(?:think|thinking|reasoning|REASONING_SCRATCHPAD)[^>]*>z‚Model used all output tokens on reasoning with none left for the response. Try lowering reasoning effort or increasing max_tokens.uV   ðŸ’­ Reasoning exhausted the output token budget â€” no visible response was produced.u  âš ï¸� **Thinking Budget Exhausted**

The model used all its output tokens on reasoning and had none left for the actual response.

To fix this:
â†’ Lower reasoning effort: `/thinkon low` or `/thinkon minimal`
â†’ Or switch to a larger/non-reasoning model with `/model`)rO  r
  r£	  r«  ÚpartialrÀ  )r·  r¶  r¸  u   â†» Requesting continuation (z/3)...z°[System: Your previous response was truncated by the output length limit. Continue exactly where you left off. Do not restart or repeat prior text. Finish the answer directly.]z9Response remained truncated after 3 continuation attemptsu=   âš ï¸�  Truncated tool call detected â€” retrying API call...uf   âš ï¸�  Truncated tool call response detected again â€” refusing to execute incomplete tool arguments.z-Response truncated due to output length limitu3      â�ª Rolling back to last complete assistant turnu-   â�Œ First response truncated - cannot recoverz3First response truncated due to output length limitræ  )rè  Úcompletion_tokensré  Ú_context_probedÚ_context_probe_persistableu   ðŸ’¾ Cached context length: z tokens for z cache=rd  rz  z%)zHAPI call #%d: model=%s provider=%s in=%d out=%d total=%d latency=%.1fs%sr{  )r|  rˆ   r{  ÚincludedÚsubscription_included)Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokensÚreasoning_tokensÚestimated_cost_usdÚcost_statusÚcost_sourceÚbilling_providerÚbilling_base_urlÚbilling_moder‚  rB  zToken usage: prompt=rè  z, completion=r¶	  z, total=ré  u      ðŸ’¾ Cache: z	 tokens (z% hit, z	 written))Úclear_nous_rate_limitz
API call #z
 completedu    âš¡ Interrupted during API call.z3Operation interrupted: waiting for model response (zs elapsed).u   (â•¥_â•¥) error, retrying...Ú_unicode_sanitization_passesr  z'ascii'rI  Ú	surrogatez'utf-8'r£  uH   âš ï¸�  Stripped invalid surrogate characters from messages. Retrying...uP   âš ï¸�  Surrogate encoding error â€” retrying after full-payload sanitization...rR  rŠ  rÇ  rú  u’   âš ï¸�  API key contained non-ASCII characters (bad copy-paste?) â€” stripped them. If auth fails, re-copy the key from your provider's dashboard.ud   âš ï¸�  System encoding is ASCII â€” stripped non-ASCII characters from request payload. Retrying...uT   âš ï¸�  System encoding is ASCII â€” enabling full-payload sanitization for retry...rÃ  rk  rT  i@ r|  )r|  r‚  r„  rT  Únum_messageszTError classified: reason=%s status=%s retryable=%s compress=%s rotate=%s fallback=%s)rÃ  r¡  rŸ  r   r¹  r¤  u8   ðŸ”� Codex auth refreshed after 401. Retrying request...r·  u<   ðŸ”� Nous agent key refreshed after 401. Retrying request...)Údisplay_hermes_homerÄ  rÙ  rÏ   u/   ðŸ”� Nous 401 â€” Portal authentication failed.z   Response: zS   Most likely: Portal OAuth expired, account out of credits, or agent key revoked.z   Troubleshooting:u6        â€¢ Re-authenticate: hermes login --provider nousuA        â€¢ Check credits / billing: https://portal.nousresearch.comu$        â€¢ Verify stored credentials: z
/auth.jsonuK        â€¢ Switch providers temporarily: /model <model> --provider openrouterrö  uA   ðŸ”� Copilot credentials refreshed after 401. Retrying request...rÄ  rá  uC   ðŸ”� Anthropic credentials refreshed after 401. Retrying request...zBearer (OAuth/setup-token)zx-api-key (API key)u-   ðŸ”� Anthropic 401 â€” authentication failed.z   Auth method: rå  z   Token prefix: z   Token: (empty or short)u"        â€¢ Check ANTHROPIC_TOKEN in z+/.env for Hermes-managed OAuth/setup tokensu$        â€¢ Check ANTHROPIC_API_KEY in z)/.env for API keys or legacy token valuesuJ        â€¢ For API keys: verify at https://platform.claude.com/settings/keysuD        â€¢ For Claude Code: run 'claude /login' to refresh, then retryu=        â€¢ Legacy cleanup: hermes config set ANTHROPIC_TOKEN ""uA        â€¢ Clear stale keys: hermes config set ANTHROPIC_API_KEY ""rG  uV   âš ï¸�  Thinking block signature invalid â€” stripped all thinking blocks, retrying...zP%sThinking block signature recovery: stripped reasoning_details from %d messageszAPI error recovery (attempt z;API call failed (attempt %s/%s) error_type=%s %s summary=%srˆ   z [HTTP r2  u!   âš ï¸�  API call failed (attempt u      ðŸ”Œ Provider: z	  Model: u      ðŸŒ� Endpoint: u      ðŸ“� Error: rÆ  rÅ  u      ðŸ“‹ Details: u      â�±ï¸�  Elapsed: zs  Context: z msgs, ~zsupport tool useu$      ðŸ’¡ No OpenRouter providers for z1 support tool calling with your current settings.zU      Your provider_routing.only restriction is filtering out tool-capable providers.zY      Try removing the restriction or adding providers that support tools for this model.zH      Check which providers support tools: https://openrouter.ai/models/u?   âš¡ Interrupt detected during error handling, aborting retries.z+Operation interrupted: handling API error (rb  uO   âš ï¸�  Anthropic long-context tier requires extra usage â€” reducing context: r  u   ðŸ—œï¸� Context reduced to z tokens (was z), retrying...u9   âš ï¸� Rate limited â€” switching to fallback provider...)Úis_genuine_nous_rate_limitÚrecord_nous_rate_limitr=  )r=  Úlast_known_state)r=  r   z�Nous 429 looks like upstream capacity (no exhausted bucket in headers or last-known state) -- not tripping cross-session breaker.u   â�Œ Max compression attempts (z&) reached for payload-too-large error.uR      ðŸ’¡ Try /new to start a fresh conversation, or /compress to retry compression.z413 compression failed after z
 attempts.z5Request payload too large: max compression attempts (z
) reached.)r
  r«  r£	  rÀ  rµ	  r¤	  Úcompression_exhaustedu@   âš ï¸�  Request payload too large (413) â€” compression attempt u   ðŸ—œï¸� Compressed z messages, retrying...u2   â�Œ Payload too large and cannot compress further.z/413 payload too large. Cannot compress further.z9Request payload too large (413). Cannot compress further.é@   uM   âš ï¸�  Output cap too large for current prompt â€” retrying with max_tokens=z (available_tokens=z; context_length unchanged at z!Context compression failed after z3Context length exceeded: max compression attempts (>   rê  rë  )z https://api.minimax.io/anthropicz"https://api.minimaxi.com/anthropiczcontext window exceeds limit (z!Context limit detected from API: zBProvider reported overflow amount only; keeping context_length at z tokens and compressing.u3   âš ï¸�  Context length exceeded â€” stepping down: uM   âš ï¸�  Context length exceeded at minimum tier â€” attempting compression...u   ðŸ—œï¸� Context too large (~u    tokens) â€” compressing (u8   â�Œ Context length exceeded and cannot compress further.u�      ðŸ’¡ The conversation has accumulated too much content. Try /new to start fresh, or /compress to manually trigger compression.zContext length exceeded: z! tokens. Cannot compress further.zContext length exceeded (z" tokens). Cannot compress further.u!   âš ï¸� Non-retryable error (HTTP u   ) â€” trying fallback...Únon_retryable_client_error)r  rÀ  u   â�Œ Non-retryable error (HTTP u%   â�Œ Non-retryable client error (HTTP z). Aborting.uK      ðŸ’¡ Codex OAuth token was rejected (HTTP 401). Your token may have beenz?      refreshed by another client (Codex CLI, VS Code). To fix:z?      1. Run `codex` in your terminal to generate fresh tokens.z3      2. Then run `hermes auth` to re-authenticate.u9      ðŸ’¡ Your API key was rejected by the provider. Check:u-         â€¢ Is the key valid? Run: hermes setupu+         â€¢ Does your account have access to rù  u?         â€¢ Check credits: https://openrouter.ai/settings/creditsu6      ðŸ’¡ This type of error won't be fixed by retrying.zNon-retryable client error: i�  rÖ  uU   âš ï¸�  Skipping session persistence for large failed session to prevent growth loop.)r¦  r§  u"   ) exhausted â€” trying fallback...u   â�Œ Rate limited after u    retries â€” u   â�Œ API failed after u      ðŸ’€ Final error: c              3   ó    •K  — | ]}|‰v V — Œ	d S rg   rw   )rÉ   ru  rÎ  s     €rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>Ã,  s7   øè è € ð $ð $°q A¨ Nð $ð $ð $ð $ð $ð $r\   )rN  rO  rP  rR  rQ  rS  u’      ðŸ’¡ The provider's stream connection keeps dropping. This often happens when the model tries to write a very large file in a single tool call.z~      Try asking the model to use execute_code with Python's open() for large files, or to write the file in smaller sections.zP%sAPI call failed after %s retries. %s | provider=%s model=%s msgs=%s tokens=~%sÚmax_retries_exhaustedzAPI call failed after u  

The provider's stream connection keeps dropping â€” this often happens when generating very large tool call responses (e.g. write_file with long content). Try asking me to use execute_code with Python's open() for large files, or to write in smaller sections.rƒ   rÚ  rÛ  r+  rÑ  g      N@u   â�±ï¸� Rate limited. Waiting zs (attempt z4Retrying API call in %ss (attempt %s/%s) %s error=%sz<Operation interrupted: retrying API call after error (retry zerror retry backoff (Úinterrupted_during_api_callr  i €  Ú!all_retries_exhausted_no_responseu:   â�Œ All API retries exhausted with no successful response.rn	  rÛ   Úpost_api_request)rR  r“  rg  r‚  r|  rˆ   r}  rB  Úapi_durationr  r  Úresponse_modelrä  Úassistant_content_charsÚassistant_tool_call_countu   ðŸ¤– Assistant: z,</?(?:REASONING_SCRATCHPAD|think|reasoning)>r¢  Ú	_thinkingzreasoning.availableuL   âš ï¸�  Incomplete <REASONING_SCRATCHPAD> detected (opened but never closed)u   ðŸ”„ Retrying API call (z/2)...uA   â�Œ Max retries (2) for incomplete scratchpad. Saving as partial.z/Incomplete REASONING_SCRATCHPAD after 2 retriesr•  r–  u0   â†» Codex response incomplete; continuing turn (z/3)z@Codex response remained incomplete after 3 continuation attemptsÚ_codex_incomplete_retriesu   ðŸ”§ Processing z tool call(s)...zTool call: z with args: u   ðŸ”§ Auto-repaired tool name: 'z' -> 'c                 óN   •— g | ]!}|j         j        ‰j        v¯|j         j        ‘Œ"S rw   )rÇ   rp   rÖ  )rÉ   rÊ   rX   s     €rZ   rË   z,AIAgent.run_conversation.<locals>.<listcomp>
.  s;   ø€ ð *ð *ð *Ø-/Øœ;Ô+°4Ô3HÐHÐHð œÔ(ØHÐHÐHr\   u   âš ï¸�  Unknown tool 'u2   ' â€” sending error to model for self-correction (uI   â�Œ Max retries (3) for invalid tool calls exceeded. Stopping as partial.z#Model generated invalid tool call: zTool 'z#' does not exist. Available tools: zZSkipped: another tool call in this turn used an invalid name. Please retry this tool call.rv  r(  c              3   ó°   •K  — | ]P}|j         j        d „ ‰D ¦   «         v ¯|j         j        pd                     ¦   «                              d¦  «         V — ŒQdS )c                 ó   — h | ]\  }}|’ŒS rw   rw   )rÉ   r"  rE  s      rZ   r  z5AIAgent.run_conversation.<locals>.<genexpr>.<setcomp>S.  s   € Ð3TÐ3TÐ3T¹$¸!¸Q°AÐ3TÐ3TÐ3Tr\   r€   )r0  r2  N)rÇ   rp   r×   r‰  r>  )rÉ   rÊ   Úinvalid_json_argss     €rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>P.  sw   øè è € ð )ð )à "Ø!œ{Ô/Ð3TÐ3TÐBSÐ3TÑ3TÔ3TÐTÐTð "$¤Ô!6Ð!<¸"× DÒ DÑ FÔ F× OÒ OÐPZÑ [Ô [Ð[àTÐTÐTÐTð)ð )r\   u>   âš ï¸�  Truncated tool call arguments detected (finish_reason=u   ) â€” refusing to execute.u1   âš ï¸�  Invalid JSON in tool call arguments for 'r	  u;   âš ï¸�  Injecting recovery tool results for invalid JSON...c                 ó   — h | ]\  }}|’ŒS rw   rw   )rÉ   rp   rE  s      rZ   r  z+AIAgent.run_conversation.<locals>.<setcomp>|.  s   € Ð,SÐ,SÐ,S±g°d¸A¨TÐ,SÐ,SÐ,Sr\   c              3   óB   •K  — | ]\  }}|‰j         j        k    ¯|V — Œd S rg   rÆ   )rÉ   r"  rA  rÊ   s      €rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>.  s9   øè è € Ð.hÐ.h±T°Q¸ÐRSÐWYÔWbÔWgÒRgÐRg¨qÐRgÐRgÐRgÐRgÐ.hÐ.hr\   zError: Invalid JSON arguments. z_. For tools with no required parameters, use an empty object: {}. Please retry with valid JSON.z;Skipped: other tool call in this response had invalid JSON.>   r°  r2  rl  r·   c              3   ó4   •K  — | ]}|j         j        ‰v V — Œd S rg   rÆ   )rÉ   rÊ   Ú_HOUSEKEEPING_TOOLSs     €rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>ª.  sB   øè è € ð 0ð 0à "ð œKÔ,Ð0CÐCð0ð 0ð 0ð 0ð 0ð 0r\   u     â”Š ðŸ’¬ c                 ó&   — h | ]}|j         j        ’ŒS rw   rÆ   rÈ   s     rZ   r  z+AIAgent.run_conversation.<locals>.<setcomp>ñ.  s   € Ð YÐ YÐ Y°b ¤Ô!1Ð YÐ YÐ Yr\   Úexecute_codeu     âŸ³ compacting contextâ€¦r»  Úpartial_stream_recoveryuG   Partial stream content delivered (%d chars) â€” using as final responseuD   â†» Stream interrupted â€” using delivered content as final responseÚ_last_content_with_toolsÚ$_last_content_tools_all_housekeepingÚfallback_prior_turn_contentuO   Empty follow-up after tool calls â€” using prior turn content as final responseuM   â†» Empty response after tool calls â€” using earlier content as final answerc              3   óH   K  — | ]}|                      d ¦  «        dk    V — ŒdS r  r£  ©rÉ   ró  s     rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>m/  sE   è è € ð .ð .à !ð ŸEšE &™MœM¨VÒ3ð.ð .ð .ð .ð .ð .r\   éûÿÿÿÚ_post_tool_empty_retrieduH   Empty response after tool calls â€” nudging model to continue processinguD   âš ï¸� Model returned empty after tool calls â€” nudging to continueré  z~You just executed tool calls but returned an empty response. Please process the tool results above and continue with the task.rF  uM   Thinking-only response (no visible content) â€” prefilling to continue (%d/2)u7   â†» Thinking-only response â€” prefilling to continue (z/2)uB   Empty response (no content or reasoning) â€” retry %d/3 (model=%s)u/   âš ï¸� Empty response from model â€” retrying (uO   Empty response after %d retries â€” attempting fallback (model=%s, provider=%s)uL   âš ï¸� Model returning empty responses â€” switching to fallback provider...u   â†» Switched to fallback: z<Fallback activated after empty responses: now using %s on %sÚempty_response_exhaustedzaReasoning-only response (no visible content) after exhausting retries and fallback. Reasoning: %su[   âš ï¸� Model produced reasoning but no visible response after all retries. Returning empty.zfEmpty response (no content or reasoning) after %d retries. No fallback available. model=%s provider=%su/   â�Œ Model returned no content after all retriesz and fallback attempts.z#. No fallback providers configured.)r  r  r
  zr[System: Continue now. Execute the required tool calls and only send your final answer after completing the task.]ztext_response(finish_reason=u"   ðŸŽ‰ Conversation completed after z OpenAI-compatible API call(s)z)Error during OpenAI-compatible API call #u   â�Œ z Outer loop error in API call #%dr   c                 óz   — h | ]8}t          |t          ¦  «        r!|                     d ¦  «        dk    ¯0|d         ’Œ9S r¢  r  rë	  s     rZ   r  z+AIAgent.run_conversation.<locals>.<setcomp>d0  sP   € ð (ð (ð (à !Ý)¨!­TÑ2Ô2ð(ð 89·u²u¸V±}´}ÈÒ7NÐ7Nð ˜nÔ-à7NÐ7NÐ7Nr\   r  zError executing tool: zerror_near_max_iterations(z0I apologize, but I encountered repeated errors: zmax_iterations_reached(u#   âš ï¸� Iteration budget exhausted (u   ) â€” asking model to summariseu   ) â€” requesting summary...c              3   ó    K  — | ]I}t          |t          ¦  «        r2|                     d ¦  «        dk    ¯0|                     d¦  «        ¯EdV — ŒJdS )r  r”  rà   r¢   Nr  rë	  s     rZ   rÎ   z+AIAgent.run_conversation.<locals>.<genexpr>²0  sf   è è € ð 
ð 
ØÝ˜!�TÑ"Ô"ð
à'(§u¢u¨V¡}¤}¸Ò'CÐ'CÈÏÊÈlÑH[ÔH[Ð'Cð Ø'CÐ'CÐ'CÐ'Cð
ð 
r\   zuTurn ended: reason=%s model=%s api_calls=%d/%d budget=%d/%d tool_turns=%d last_msg_role=%s response_len=%d session=%sz>Turn ended with pending tool result (agent may appear stuck). z last_tool=%sÚpost_llm_call)r“  r  Úassistant_responserq  r‚  rg  zpost_llm_call hook failed: %srO  Úlast_reasoningr
  r£	  r«  rµ	  rP  Úresponse_previewedÚ_response_was_previewedr»	  r¼	  r½	  r¾	  r¿	  r”  )r¶	  ré  r”  rÀ	  rÁ	  rÂ	  Úpending_steerÚinterrupt_message)rN  rO  rP  )rj  rk  rl  rI  )r“  r«  rP  r‚  rg  zon_session_end hook failed: %s)rÕ	  (J  r˜   r³  r�	  r“  r¢  rb   rc   rý   r    r¹  r¼  r½  rÛ  rÜ  Ú_current_task_idÚ_invalid_tool_retriesÚ_invalid_json_retriesÚ_empty_content_retriesÚ_incomplete_scratchpad_retriesrÛ	  Ú_thinking_prefill_retriesrí	  rç	  rè	  r•  rÇ	  r}  r6  r¤  r�   r  rÀ  rš   rƒ  r®  rD   rd   rÁ  r6  rµ  r‚  r|  rg  r  rì  Ú	has_itemsrf  r  rñ  rÖ  rî  rò  rÞ   r‰  r‘  rä  rç  Úget_sessionrƒ   rœ  r  r�	  ro   r7  r’  rÙ   r
  rk  rd  rR  r-   rR  r  rT  r=  r   r­   rÚ   r„   r  rž   rà  rá  r™  r  r—  rš  r˜  rö  Úon_turn_startÚprefetch_allrª   r¬  ræ  Únew_turnr±  r4  r£   r§   r›   rš  r  rd  r  ró  r&  r�  rØ   r¶  rr   r�  r�  r   rk  rë  rƒ  rp  rŠ  r£  rx  r§  r6   r©  r¨  r­  rÕ   rÖ   r8  rG  r  r×  r,   r—  rŒ  r3	  r4	  rE   Úget_thinking_facesÚget_thinking_verbsr—  r–  rš  r†  r”  rˆ  r­  r  Úagent.nous_rate_guardr 	  r¡	  r�  r�  ÚImportErrorrÞ  r:  r¥  rT  r‹  ro  rˆ   rŸ  rP   r  rï  rì  rƒ  rÜ  r  r�  rä  Úvalidate_responserj  ræ  r"  rÓ  rÒ  rÀ  rˆ  r�  Úvarsr  r¬   r:  ra   rÒ  r!   r"  r«  Úmap_finish_reasonÚstop_reasonrq	  r  r  rÀ  r;  rÁ   r	  rÿ  rU  r_  r  rá  rŽ  rý  rŸ  r@   rè  r¼	  ré  Úupdate_from_responser1   r·	  r¸	  r  r  r  r  r  r»	  r  r  r½	  r  r¾	  r  r¿	  r?   Ú
amount_usdr  r  rG  r  r.  r  Úupdate_token_countsrÆ	  rO  ÚUnicodeEncodeErrorr	  rQ  rU  rN  rÇ  r{  rÆ  râ  r"   r  r†   rÃ  Ú	retryableÚshould_compressÚshould_rotate_credentialÚshould_fallbackr®  r{  r‡  rÈ  Úhermes_constantsrÊ	  r�  rÁ  râ  r’  rÄ  r#   Úthinking_signaturerÛ   r­  r’  r�  Úlong_context_tierr	  r¦  r¥  rb  rˆ  rË	  rÌ	  r²  Úpayload_too_largeÚcontext_overflowr0   r©   rû  r/   r‰  rŠ  r.   r9  ÚsslÚSSLErrorÚ
overloadedÚis_authrN   r®  rÔ   ró   r¥   rí  r”  rû   rÑ  rK   rí  rà   rÇ   rp   r×   rÒ  r×  r  Únextr·  r»  Ú	frozensetÚallrœ  r›  r¥  rº  r”  rõ	  rQ  rC  r`   r‹	  r¿  rT  rƒ  (/  rX   r  rj  rq  rR  rŒ	  r�	  r�	  r¡  Ú_preview_textÚ_msg_previewr
  rN  Ú_should_review_memoryÚuser_msgÚcurrent_turn_user_idxÚ_print_previewÚstored_promptÚsession_rowÚ_invoke_hookru  rA  Úactive_system_promptÚ_preflight_tokensÚ_passÚ	_orig_lenÚ_plugin_user_contextÚ_pre_resultsÚ
_ctx_partsr	  rB  rO  rP  Úcodex_ack_continuationsÚlength_continue_retriesÚtruncated_tool_call_retriesÚtruncated_response_prefixÚcompression_attemptsÚ_turn_exit_reasonÚ	_turn_msgÚ_ext_prefetch_cacheÚ_queryÚ
prev_toolsÚ_idxÚ_mÚ
_fwd_startÚ_tmÚ_tcidÚ	_step_errÚ_pre_api_steerÚ	_injectedÚ_siÚ_smr7  rÒ   r0  r    Úrequest_loggerÚrepaired_tool_callsrä  r  r  rg  Ú_injectionsÚ_fencedr‘  ru	  rv	  rw	  ÚamÚtcsÚnew_tcsÚargs_objÚtotal_charsr„  rF	  Úverbr	  Úapi_start_timer¦  r§  Úprimary_recovery_attemptedÚmax_compression_attemptsÚcodex_auth_retry_attemptedÚanthropic_auth_retry_attemptedÚnous_auth_retry_attemptedÚcopilot_auth_retry_attemptedÚthinking_sig_retry_attemptedr¡  Ú restart_with_compressed_messagesÚ restart_with_length_continuationr  rÙ  rî  r 	  Ú_fmt_nous_remainingÚ_nous_remainingÚ	_nous_msgr­	  Ú_use_streamingrì  rÖ	  Ú
resp_modelÚresponse_invalidÚerror_detailsÚ_ct_vÚ_codex_resp_statusÚ_codex_error_objÚ_codex_error_msgÚ	_out_textÚ_out_text_strippedÚ_resp_statusÚ_resp_incompleteÚ_tvÚ_btvÚ_ctvr%  Ú
resp_attrsÚ_resp_error_codeÚ	_code_rawÚ_failure_hintÚcleaned_provider_errorr­  Ú	sleep_endÚ_backoff_touch_counterrG  rH  Úincomplete_reasonÚ_tfrÚ_bt_frÚ_bedrock_resultÚ_cc_frÚ_finish_resultr  Ú
_trunc_msgÚ_trunc_transportÚ_trunc_resultÚ_trunc_contentÚ_trunc_has_tool_callsÚ_has_think_tagsÚ_thinking_exhaustedÚ_exhaust_errorÚ_exhaust_responseÚinterim_msgÚcontinue_msgÚpartial_responseÚrolled_back_messagesÚcanonical_usagerè  r¶	  ré  Ú
usage_dictÚctxÚ
_cache_pctÚcost_resultrÎ  Úwrittenr~  Úhit_pctrÆ	  Úapi_elapsedr¥  Ú_err_strÚ_is_ascii_codecÚ_is_surrogate_errorÚ_surrogates_foundÚ_messages_sanitizedÚ_prefill_sanitizedÚ_tools_sanitizedÚ_system_sanitizedÚ_sanitized_systemÚ_sanitized_ephemeralÚ_headers_sanitizedr  Ú_credential_sanitizedÚ_raw_keyÚ
_clean_keyÚ_any_sanitizedrÃ  r   Ú_compressorÚ_ctx_lenÚ
classifiedÚrecovered_with_poolÚ_dhh_fnÚ_dhhÚ
_body_textÚ_bodyrâ  r…   Úauth_methodÚelapsed_timer¬  Ú_error_summaryÚ	_providerÚ_modelÚ_status_code_strÚ	_err_bodyÚ_err_body_strÚ_reduced_ctxrZ  Úold_ctxÚoriginal_lenÚis_rate_limitedÚpool_may_recoverÚ_genuine_nous_rate_limitrË	  rÌ	  Ú	_err_respÚ	_err_hdrsÚis_payload_too_largeÚis_context_length_errorÚavailable_outÚsafe_outÚparsed_limitÚ_provider_lowerÚ_base_lowerÚis_minimax_providerÚminimax_delta_only_overflowÚnew_ctxÚis_local_validation_errorÚis_client_errorÚ_final_summaryÚ_is_stream_dropÚ_final_responseÚ_retry_afterÚ_resp_headersÚ_ra_rawÚ_boost_baseÚ_boostr  Ú_normalize_kwargsrÍ  r  rò   r  Ú_assistant_tool_callsÚ_assistant_textÚ_think_textÚ
first_lineÚinterim_has_contentÚinterim_has_reasoningÚinterim_has_codex_reasoningÚinterim_has_codex_message_itemsÚlast_msgÚlast_codex_itemsÚinterim_codex_itemsÚlast_codex_message_itemsÚinterim_codex_message_itemsÚduplicate_interimr7  Úinvalid_tool_callsr  Úinvalid_nameÚinvalid_previewrç  r  r�  Ú
_truncatedrä   Úrecovery_assistantÚinvalid_namesÚerrr  Úturn_contentÚ_all_housekeepingÚcleanÚ_had_prefillÚ	_tc_namesÚ_real_tokensÚ_partial_streamedÚ
_recoveredÚfallbackÚ_prior_was_toolÚ
_nudge_msgÚ_has_structuredÚ_truly_emptyÚ_prefill_exhaustedrb  Úreasoning_previewÚ	final_msgÚanswered_idsÚerr_msgr«  Ú_last_msg_roleÚ_last_tool_nameÚ_tcsÚ_turn_tool_countÚ	_resp_lenÚ_budget_usedÚ_budget_maxÚ	_diag_msgÚ
_diag_argsró	  rÊ  Ú_leftover_steerÚ_should_review_skillsrã	  r—	  rÎ  rß	  rÊ   r¬	  s/  `                                                                                                                                                                                                                                                                                                        @@@@@@rZ   rv  zAIAgent.run_conversationó#  sŽ‹  øùùùùùù€ õ< 	ÑÔÐð 	7Ð6Ð6Ð6Ð6Ð6ØÐ˜DœOÑ,Ô,Ð,ð
 	×%Ò%Ñ'Ô'Ð'õ
 �l¥CÑ(Ô(ð 	>Ý/°Ñ=Ô=ˆLÝÐ*­CÑ0Ô0ð 	NÝ#7Ð8LÑ#MÔ#MÐ õ �l¥CÑ(Ô(ð 	:Ý+¨LÑ9Ô9ˆLÝÐ*­CÑ0Ô0ð 	JÝ#3Ð4HÑ#IÔ#IÐ ð !0ˆÔØ)-ˆÔ&Ø.BˆÔ+à#Ð8¥s­4¬:©<¬<Ñ'8Ô'8Ðð
 !2ˆÔð &'ˆÔ"Ø%&ˆÔ"Ø&'ˆÔ#Ø./ˆÔ+Ø)*ˆÔ&Ø)*ˆÔ&Ø(-ˆÔ%Ø(,ˆÔ%Ø49ˆÔ1Ø#(ˆÔ Ø,-ˆÔ)ð
 Œ=Ð0Ò0Ð0ðØ×1Ò1Ñ3Ô3ð Ø×%Ò%ð&ñô ð øøõ
 ð ð ð Ø�ðøøøð Ô$ð 	-Ø×,Ò,Ñ.Ô.Ð.Ø(,ˆDÔ%õ
 !0°Ô0CÑ DÔ DˆÔõ 8¸ÑEÔEˆÝ7:¸=Ñ7IÔ7IÈBÒ7NÐ7N˜ c r cÔ*¨UÑ2Ð2ÐTaˆØ#×+Ò+¨D°#Ñ6Ô6ˆÝ�ŠØ^ØŒOÐ%˜v t¤z°4´=Ð3MÀIØŒMÐ&˜Y­Ð,@Ð,FÀBÑ(GÔ(GØñ		
ô 	
ð 	
ð 2FÐM•4Ð,Ñ-Ô-Ð-È2ˆð
  ð 	;¨Ô(8×(BÒ(BÑ(DÔ(Dð 	;Ø×$Ò$Ð%9Ñ:Ô:Ð:ð 	ÐÔ Ñ"ÐÔð 9MÐ8XÐ 4Ð 4Ð^jÐð
 !&ÐØÔ'¨!Ò+Ð+Ø Ô 5Ð5Ð5ØÔ&ð 6àÐ$Ô$¨Ñ)Ð$Ô$ØÔ'¨4Ô+FÒFÐFØ(,Ð%Ø+,�Ô(ð #¨|Ð<Ð<ˆØ�Š˜Ñ!Ô!Ð!Ý # H¡¤°Ñ 1ÐØ)>ˆÔ&àŒð 	@Ý<¸\ÑJÔJˆNØ×ÒÐ~¸^ÈCÈRÈCÔ=PÐ~Õ[^Ð_mÑ[nÔ[nÐqsÒ[sÐ[sÐRWÐRWÐy{Ð~Ð~Ð~ÑÔÐð Ô%Ñ-Ø ˆMØ#ð ¨Ô(8ð ðØ"&Ô"2×">Ò">¸t¼Ñ"OÔ"O�KØ"ð QØ(3¯ª¸Ñ(HÔ(HÐ(PÈD˜øøÝ ð ð ð Ø�Dðøøøð ð Vð .;�Ô*Ð*ð .2×-FÒ-FÀ~Ñ-VÔ-V�Ô*ð
	LØNÐNÐNÐNÐNÐNØ �LØ*Ø#'¤?Ø"œjÝ!(¨¨z¸4Ñ!@Ô!@Ð!FÀBð	ñ ô ð ð øõ !ð Lð Lð LÝ—N’NÐ#EÀsÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøð Ô#ð VðVØÔ(×=Ò=¸d¼oÈtÔOiÑjÔjÐjÐjøÝ$ð Vð Vð VÝŸšÐ%QÐSTÑUÔUÐUÐUÐUÐUÐUÐUøøøøðVøøøð  $Ô9Ðð Ô$ñ;	å�H‘” Ô 7Ô GØ"&Ô"9Ô"Hñ!IØKLñ!Mò Mñ Mõ
 !>ØØ2Ð8°bØ”jÐ( Dð!ñ !ô !Ðð ! DÔ$;Ô$LÒLÑLÝ—’ØZØ(Ð,Ð,ØÔ.Ô?ÐCÐCØ”JØÔ.Ô=ÐAÐAñô ð ð ”ð Ø×$Ò$ðUÐ8IÐUð Uð UØ"Ô5ÔFÐTðUð Uð Uñô ð õ # 1™XœXð ð �EÝ # H¡¤�IØ59×5KÒ5KØ  .Ð@QØ 1ð 6Lñ 6ô 6Ñ2�HÐ2õ ˜8‘}”}¨	Ò1Ð1Ø˜ð ,0Ð(ð 34�DÔ/Ø56�DÔ2Ø48�DÔ1Ø@E�DÔ=Ø/4�DÔ,å(EØ Ø&:Ð&@¸bØ"œjÐ0¨Dð)ñ )ô )Ð%ð
 )¨4Ô+BÔ+SÒSÐSØ˜ð Tð  "Ðð	@ØFÐFÐFÐFÐFÐFØ'˜<ØØœ?Ø2Ý%)¨(¡^¤^Ý#'Ð(<Ñ#=Ô#=Ð=Ø”jÝ   z°4Ñ8Ô8Ð>¸BÝ! $¨
°DÑ9Ô9Ð?¸Rð	ñ 	ô 	ˆLð %'ˆJØ!ð )ð )�Ý˜a¥Ñ&Ô&ð )¨1¯5ª5°Ñ+;Ô+;ð )Ø×%Ò%¥c¨!¨I¬,Ñ&7Ô&7Ñ8Ô8Ð8Ð8Ý ¥3Ñ'Ô'ð )¨A¯GªG©I¬Ið )Ø×%Ò% aÑ(Ô(Ð(øØð ?Ø'-§{¢{°:Ñ'>Ô'>Ð$øøÝð 	@ð 	@ð 	@Ý�NŠNÐ9¸3Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøð ˆØˆØˆØ"#ÐØ"#ÐØ&'Ð#Ø$&Ð!Ø ÐØ%Ðõ
 %.Ô$<Ñ$>Ô$>Ô$DˆÔ!õ
 	�u˜dÔ7Ñ8Ô8Ð8ØÔ$ð 	:Ý˜4 Ô!:Ñ;Ô;Ð;Ø49ˆDÔ1Ð1à&*ˆDÔ#Ø49ˆDÔ1ð
 Ôð 	ðÝ5?Ð@UÕWZÑ5[Ô5[ÐcÐ1Ð1Ðac�	ØÔ$×2Ò2°4Ô3HÈ)ÑTÔTÐTÐTøÝð ð ð Ø�ðøøøð !ÐØÔð 	ðÝ2<Ð=RÕTWÑ2XÔ2XÐ`Ð.Ð.Ð^`�Ø&*Ô&:×&GÒ&GÈÑ&OÔ&OÐ&UÐSUÐ#Ð#øÝð ð ð Ø�ðøøøð  Ô 3Ò3Ð3¸Ô8MÔ8WÐZ[Ò8[Ð8[Ð`dÔ`wÑ8[àÔ ×)Ò)Ñ+Ô+Ð+ð Ô(ð Ø"�Ø$9Ð!Ø”ð \Ø×$Ò$Ð%ZÑ[Ô[Ð[Ùà˜aÑˆNØ#1ˆDÔ Ø× Ò Ð!G°~Ð!GÐ!GÑHÔHÐHð
 Ô&ð Ø*/�Ô'Ð'ØÔ*×2Ò2Ñ4Ô4ð Ø$6Ð!Ø”ð _Ø×$Ò$ð  &^ÈdÔNcÔNhð  &^ð  &^Ðkoô  lAô  lKð  &^ð  &^ð  &^ñ  _ô  _ð  _Ùð Ô!Ñ-ðfØ!#�JÝ$-­h°xÑ.@Ô.@Ñ$AÔ$Að "ð "™˜˜bØŸ6š6 &™>œ>¨[Ò8Ð8¸R¿VºVÀLÑ=QÔ=QÐ8Ý),¨X©¬¸Ñ)=˜JØ-/™NØ'/°
°°Ô'<ð Sð S Ø#&§7¢7¨6¡?¤?°fÒ#<Ð#<Ø$) EØ(+¯ª°Ñ(?Ô(? Ø#(ð !SØ<?¿GºGÀIÈrÑ<RÔ<R¡N°5Ñ$9øñ*ð *ð *ð *ð +-¨\Ô*:ð*ñ *ô *˜Jð "˜EøØ×&Ò& ~°zÑBÔBÐBÐBøÝ ð fð fð fÝ—L’LÐ!IÈ>Ð[dÑeÔeÐeÐeÐeÐeÐeÐeøøøøðføøøð
 Ô*¨QÒ.Ð.Ø&¨$Ô*?Ð?Ð?ØÐ'Ô'¨1Ñ,Ð'Ô'ð "×6Ò6Ñ8Ô8ˆNØñ #qØ!�	Ý ¥ X¡¤°Ñ!2°B¸Ñ;Ô;ð ð �CØ" 3œ-�CÝ! #¥tÑ,Ô,ð °·²¸±´ÀFÒ1JÐ1JØ!G°~Ð!GÐ!G˜Ø#&§7¢7¨9°bÑ#9Ô#9˜Ý% hµÑ4Ô4ð 	%Ø-5¸Ñ->˜C 	™N˜Nð%Ø;CÐ)K­¨h©¬¨È Ø &§¢°vÀvÐ.NÐ.NÑ OÔ OÐ OØ17  I¡ øÝ#,ð %ð %ð %Ø $ ð%øøøà$(˜	ÝŸšØZØñô ð ð ˜øØ ð qõ $ DÐ*?ÀÑFÔF�EØÐ(Ø"ð Eð EØ#Ô2ð EØ6:Ô6IÈDÑ6PÐSaÑ6a Ô 3Ð 3à6D Ô 3ð	Eð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøõ $+¨4Ð1AÀ4Ñ#HÔ#H˜ØT\Ð.p¨x¸$©ÀÑ/OÐ/OÐbp˜Ô+õ % T¨8°TÑ:Ô:ÐY½gÔ>OÕPXÑ>YÔ>YˆNØ"&×"DÒ"DØØ%Øœ?ð #Eñ #ô #Ðð
 # QÒ&Ð&Ø×#Ò#Ø\Ø'Ø”OÐ* sñô ð ð ˆLÝ% hÑ/Ô/ð *-ñ *-‘��SØŸ(š(™*œ*�ð Ð/Ò/Ð/°C·G²G¸F±O´OÀvÒ4MÐ4MØ"$�KØ*ð 8Ý"<Ð=PÑ"QÔ"Q˜Ø"ð 8Ø'×.Ò.¨wÑ7Ô7Ð7Ø+ð AØ#×*Ò*Ð+?Ñ@Ô@Ð@Ø"ð [Ø '§¢¨I°rÑ :Ô :˜Ý% e­SÑ1Ô1ð [Ø16¸±À&Ç+Â+ÈkÑBZÔBZÑ1Z˜G IÑ.ð ×4Ò4°S¸'ÑBÔBÐBð  'Ð)Ð)Ø—K’K Ñ,Ô,Ð,à" gÐ-Ð-Ø—K’K Ñ0Ô0Ð0à—’Ð/°Ñ6Ô6Ð6ð
 ×3Ò3Ñ5Ô5ð FØ×<Ò<¸WÑEÔEÐEð ×#Ò# GÑ,Ô,Ð,Ñ,ð  4Ð9°rÐØÔ+ð fØ$4°vÑ$=ÀÔ@\Ñ$\×#cÒ#cÑ#eÔ#eÐ ð
  ð `Ø)1Ð>NÐ OÐ OÐPÐS_Ñ_�ð Ô$ð FØ"2Ð9˜Q˜Q¸�
Ý )¨$Ô*?Ñ @Ô @ð Fð F‘H�C˜Ø ×'Ò'¨
°SÑ(8¸#¿(º(¹*¼*ÑEÔEÐEÐEð Ô'ð Ý<Ø Ø"œoØ%)Ô%Bð ñ  ô  �ð  ×6Ò6°|ÑDÔDˆLð #ð :ð :�Ý˜bŸfšf YÑ/Ô/µÑ5Ô5ð :Ø$& y¤M×$7Ò$7Ñ$9Ô$9�B�y‘MøØ"ð +ð +�Ø—f’f˜\Ñ*Ô*�Øð ØØ�Øð 'ð '‘BÝ!¡"¥dÑ+Ô+ð °
¹bÐ0@Ð0@ðÝ'+¤z±"°Z´.ÀÔ2MÑ'NÔ'N˜Hð"¡Bð "¨
ð 5Ù"$ Z¤.ð5à +­T¬ZØ$,¸Ø.2ð."ñ ."ô ."ð5ð 5ð "ð "™B˜Bøõ  )ð ð ð Þ:UÙ " :¤¨{Ô ;Ù " :¤× 2Ò 2°6¸3Ñ ?Ô ?ñ;ô ;™B˜zœN¨;Ñ7Ð7Ð7ðøøøð
 —N’N¡2Ñ&Ô&Ð&Ð&Ø#*��<Ñ Ð ö *¨,Ñ7Ô7Ð7ö ÐDÐD°|ÐDÑDÔDÑDÔDˆKÞ:¸<ÑHÔHˆMð  $Ñà”?ð -Ø—’Ðr $¤/ÐrÐrÈÐrÐrÐZ^ÔZmÐrÐrÐrÑsÔsÐsØ—’ ¤ð  Xð  XÅsÈ<ÑGXÔGXð  Xð  XÐfsð  Xð  Xð  Xð  BMð  Xð  Xð  Xð  Xñ  Yô  Yð  YØ—’ ¤ÐpÐpÐ]aÔ]gÐJnÍ#ÈdÌjÉ/Ì/È/ÐmnÐpÐpÑqÔqÐqÐqö ”}¦]Ô%EÑ%GÔ%GÑHÔH�Þ”}¦]Ô%EÑ%GÔ%GÑHÔH�ØÔ)ð 	-ð ×*Ò*¨dÐ+>Ð+>°TÐ+>Ð+>Ð+>Ñ?Ô?Ð?Ð?Ø×3Ò3Ñ5Ô5ð -¸$×:ZÒ:ZÑ:\Ô:\ð -ö $*¤=Ð1^Ð1^Ð1^Ñ#_Ô#_�LÞ'4¸Ð5HÐ5H¸tÐ5HÐ5HÐ5HÐWcÐnrÔn|Ð'}Ñ'}Ô'}Ñ$Ù$×*Ò*Ñ,Ô,Ð,ð Ô#ð PÝ”ð  M°d´jð  Mð  MÍcÐRZÉmÌmð  Mð  MÐy}ô  zDð  gKÕfiÐjnÔjtÑfuÔfuÐfuð  JKð  Mð  Mñ  Nô  Nð  NÝ”ÐbÈHÐ4`°H¸R´LÀÔ4HÐ4HÐZ`ÐbÐbÑcÔcÐcÝ”ÐN°mÐNÐNÐNÐNÑOÔOÐOæ!œY™[œ[ˆNØˆKØÔ/ˆKØ).Ð&Ø'(Ð$Ø',Ð&Ø+0Ð*Ø&+Ð%Ø).Ð(Ø+0Ð(Ø#ˆOØ/4Ð,Ø/4Ð,à"ˆMØˆHØˆJà Ò+Ñ+ð ”= FÒ*Ð*ð'ðð ð ð ð ð ð ð ð +DÐ*CÑ*EÔ*E˜Ø*Ð6¸?ÈQÒ;NÐ;Nð!UØ-@Ð-@ÀÑ-QÔ-Qð!Uð !Uð !Uð &ð !ŸLšLØ#'¤?Ð VÐ V¸	Ð VÐ VÐ VØ&*ð )ñ ô ð ð !×-Ò-Ð.@°YÐ.@Ð.@ÑAÔAÐAØ#×:Ò:Ñ<Ô<ð )Ø./ Ø78Ð 4Ø=BÐ :Ø (à ×1Ò1°(Ð<PÑQÔQÐQð%H¨9ð %Hð %Hð %Hð
 -5Ø-;Ø-2Ø*.Ø)2ð$ð $ð øøö 'ð ð ð Ø˜Ý$ð ð ð Ø˜ðøøøðbØ×8Ò8Ñ:Ô:Ð:Ø!%×!7Ò!7¸Ñ!EÔ!E�JØÔ0ð BÞ5°jÑAÔAÐAØ”}Ð(9Ò9Ð9Ø%)×%8Ò%8Ñ%:Ô%:×%KÒ%KÈJÐejÐ%KÑ%kÔ%k˜
ðØRÐRÐRÐRÐRÐRØ$˜Ø-Ø$5Ø'+¤Ð'<¸"Ø%)¤]Ð%8°bØ"&¤*Ø%)¤]Ø%)¤]Ø%)¤]Ø+9Ý*-¨lÑ*;Ô*;Ý'*¨4¬:Ð+;¸Ñ'<Ô'<Ø0=Ø/:Ø'+¤ðñ ô ð ð øõ  %ð ð ð Ø˜ðøøøö 'Ð'=Ñ>Ô>ð UØ×4Ò4°ZÈÐ4ÑTÔTÐTð7ñ 7ð 7ð 7ð 7ð 7ð &*�Nõ ˜tÐ%9¸5ÑAÔAð 3Ø).˜˜Ø!×7Ò7Ñ9Ô9ð 3ð 7Ð6Ð6Ð6Ð6Ð6Ý%¥g¨d°H¸dÑ&CÔ&CÀTÑJÔJð 3Ø-2˜Nà%ð LØ#'×#IÒ#IØ&°}ð $Jñ $ô $˜˜ð $(×#?Ò#?À
Ñ#KÔ#K˜æ#'¤9¡;¤;°Ñ#?�Lñ (ð 0Ù(×-Ò-¨bÑ1Ô1Ð1Ø+/Ñ(ØÔ-ð 3Ø×.Ò.¨rÑ2Ô2Ð2àœ?ð lØŸš¨¬Ð%jÐ%jÐWcÐ%jÐ%jÐ%jÐ%jÑkÔkÐkàÔ+ð XàJRÐ%]¥W¨X°wÀÑ%FÔ%FÐ%FÐX]˜
Ýœð  'WÈ
ð  'Wð  'WÖovÐwð  BIñ  pJô  pJð  ^UÐ]eÔ]kÐ]kð  PUð  'Wð  'Wñ  Xô  Xð  Xð (-Ð$Ø$&�MØ”}Ð(9Ò9Ñ9Ø $× 3Ò 3Ñ 5Ô 5˜Ø$×6Ò6°xÑ@Ô@ñ -YØ'Ð/Ø37Ð 0Ø -× 4Ò 4Ð5GÑ HÔ HÐ HÑ Hõ
 69½ÀÈ8ÐUWÑ9XÔ9XÐ9^Ð\^Ñ5_Ô5_×5eÒ5eÑ5gÔ5g×5mÒ5mÑ5oÔ5oÐ 2Ø#5Ð9PÐ#PÐ#PÝ7>¸xÈÐRVÑ7WÔ7WÐ$4åKUÐVfÕhlÑKmÔKmð )eÐ(8×(<Ò(<¸YÑ(GÔ(GÐ(GØFVð .e­SÐ1AÑ-BÔ-BÐ-BØ-dÐOaÐ-dÐ-dÐ-dð %5õ
 %,¤OØ(hØ(:Ð<LØ(,×(@Ò(@Ñ(BÔ(Bñ%&ô %&ð %&ð
 8<Ð$4Ø$1×$8Ò$8Ð9tÐL^Ð9tÐ9tÐbrÐ9tÐ9tÑ$uÔ$uÐ$uÑ$uõ 18¸À-ÐQUÑ0VÔ0V IÝNXÐYbÕdgÑNhÔNhÐ9p¸¿ºÑ9JÔ9JÐ9JÐnpÐ$6Ø'9ð %YÝ(.¯ªð-Vå,/Ð0BÑ,CÔ,Cñ)*ô )*ð )*ñ )*õ 8?¸xÈÐSWÑ7XÔ7X¨Ý;BÀ8ÐMaÐcgÑ;hÔ;hÐ(8Ý(.¯ªð-_à,8Ð:JÝ,3°H¸gÀtÑ,LÔ,LØ,`¸¼Ð,`Ð,`ÐQUÔQ^Ð,`Ð,`ñ)*ô )*ð )*ð <@Ð(8Ø(5×(<Ò(<Ð=WÑ(XÔ(XÐ(XùØœÐ*>Ò>Ð>Ø"×1Ò1Ñ3Ô3˜Ø"×4Ò4°XÑ>Ô>ð hØ/3Ð,Ø'Ð/Ø -× 4Ò 4Ð5GÑ HÔ HÐ HÑ Hà -× 4Ò 4Ð5fÑ gÔ gÐ gùØœÐ*<Ò<Ð<Ø#×2Ò2Ñ4Ô4˜Ø#×5Ò5°hÑ?Ô?ð hØ/3Ð,Ø'Ð/Ø -× 4Ò 4Ð5GÑ HÔ HÐ HÐ Hà -× 4Ò 4Ð5fÑ gÔ gÐ gøà#×2Ò2Ñ4Ô4˜Ø#×5Ò5°hÑ?Ô?ð 	RØ/3Ð,Ø'Ð/Ø -× 4Ò 4Ð5GÑ HÔ HÐ HÐ HÞ%,¨X°yÑ%AÔ%Að RØ -× 4Ò 4Ð5ZÑ [Ô [Ð [Ð [Ø!)Ô!1Ð!9Ø -× 4Ò 4Ð5OÑ PÔ PÐ PÐ Pà -× 4Ò 4Ð5PÑ QÔ QÐ Qà'ñ D!á+ð 4Ù,×1Ò1Ð2OÑPÔPÐPØ/3Ñ,ØÔ1ð 7Ø ×2Ò2°2Ñ6Ô6Ð6ð $ qÑ(˜ð
  Ô/µ#°dÔ6JÑ2KÔ2KÒKÐKØ ×-Ò-Ð.lÑmÔmÐmØ×6Ò6Ñ8Ô8ð %Ø*+˜KØ34Ð0Ø9>Ð6Ù$ð %.™	Ø(1˜Ø#ð >®°¸'Ñ(BÔ(Bð >ÀxÄ~ð >Ý(+¨H¬NÑ(;Ô(;™Iæ& x¤~°zÑBÔBð hÀxÄ~ÔG^ð hØ08´Ô0G×0KÒ0KÈOÐ]fÑ0gÔ0g øØ%ð >®'°(¸IÑ*FÔ*Fð >È8ÔK[ð >Ý(+¨HÔ,<Ñ(=Ô(=™Ið )¨IÒ5Ð5¸(Ð5ÆwÈxÐY`ÑGaÔGaÐ5ÐfnÔftÐ5Ø,E°X´^Ð,EÐ,E˜Mð )¨IÒ5Ð5¸(Ð5à)vÐ)vÆdÈ8ÁnÄn×FZÒFZÑF\ÔF\Ð)vÑ)vÔ)v˜JØ#Ô3ð iÝ '¤Ð.gÐ[eÐ.gÐ.gÑ hÔ hÐ hð ,0Ð(Ø#ð )®°¸'Ñ(BÔ(Bð )ÀxÄ~ð )Ý(/°´ÀÈÑ(MÔ(M˜IØ(Ð0µZÀÄÕPTÑ5UÔ5UÐ0Ø,4¬N×,>Ò,>¸vÑ,FÔ,F 	Ø(Ð4ð!)Þ7:¸9±~´~Ð$4Ð$4øÞ(1¶:Ð'>ð !)ð !)ð !)Ø$( Dð!)øøøð
 ,¨sÒ2Ð2Ø,pÐ\hÐ,pÐ,pÐ,pÐ,p˜M˜MØ-°Ò4Ð4Ø,bÈlÐ,bÐ,bÐ,bÐ,b˜M˜MØ-°Ò4Ð4Ø,V˜M˜MØ-°Ð;Ð;Ø,nÐFVÐ,nÐ,nÐZfÐ,nÐ,nÐ,nÐ,n˜M˜MØ-°Ð;Ð;Ø,`ÐM]Ð,`Ð,`Ð,`˜M˜MØ-Ð9Ø,lÐDTÐ,lÐ,lÐXdÐ,lÐ,lÐ,lÐ,l˜M˜MØ)¨BÒ.Ð.Ø,j¸lÐ,jÐ,jÐ,jÐ,j˜M˜MØ)¨BÒ.Ð.Ø,n¸lÐ,nÐ,nÐ,nÐ,n˜M˜Mà,P¸\Ð,PÐ,PÐ,PÐ,P˜MàŸš¨¬ð  &Xð  &XÐ_jð  &Xð  &XÐmxð  &Xð  &Xð  ~B÷  ~Gò  ~Gð  HUñ  ~Vô  ~Vð  &Xð  &Xð  `d˜ñ  eô  eð  eØŸš¨¬Ð%ZÐ%ZÈ=Ð%ZÐ%ZÐbf˜ÑgÔgÐgØ15×1JÒ1JÉ9Ñ1UÔ1UÐ.ØŸš¨¬Ð%kÐ%kÐSiÐ%kÐ%kÐsw˜ÑxÔxÐxØŸš¨¬Ð%SÐ%SÀMÐ%SÐ%SÐ[_˜Ñ`Ô`Ð`à&¨+Ò5Ð5à ×-Ò-ð  /AÀ[ð  /Að  /Að  /Añ  Bô  Bð  BØ#×:Ò:Ñ<Ô<ð )Ø./ Ø78Ð 4Ø=BÐ :Ù (Ø ×-Ò-Ð.{À+Ð.{Ð.{Ð.{Ñ|Ô|Ð|Ý#œM¨T¬_Ð*oÐ*oÐYdÐ*oÐ*oÐ*oÑpÔpÐpØ ×1Ò1°(Ð<PÑQÔQÐQà,4Ø-2Ø-;Ø)mÀ{Ð)mÐ)mÐ^kÐ)mÐ)mØ*.ð$ð $ð ö %5°[ÈSÐ\aÐ$bÑ$bÔ$b˜	ØŸš¨¬Ð%nÐ%nÈÐ%nÐ%nÐ%nÐ[hÐ%nÐ%nÐ%nÐvz˜Ñ{Ô{Ð{Ýœð  )\À{ð  )\ð  )\ÐU`ð  )\ð  )\Ðei×enÒenÐo|Ñe}Ôe}ð  )\ð  )\ð  MZð  )\ð  )\ñ  ]ô  ]ð  ]ö %)¤I¡K¤K°)Ñ$;˜	Ø12Ð.Þ"œi™kœk¨IÒ5Ð5Ø#Ô8ð 
"Ø $§¢°´Ð-tÐ-tÐ-tð  }A ñ  !Bô  !Bð  !BØ $× 5Ò 5°hÐ@TÑ UÔ UÐ UØ $× 4Ò 4Ñ 6Ô 6Ð 6ð 7TÐ]jð  7Tð  7Tð  wBð  7Tð  7Tð  EPð  7Tð  7Tð  7TØ08Ø1?Ø16Ø37ð("ð ("ð !"ö !œJ s™OœO˜Oð 3°aÑ7Ð2Ø5¸Ñ;¸qÒ@Ð@Ø $× 4Ò 4ð%Q°kð %Qð %QÀKð %Qð %QÞ'*¨9¶t´y±{´{Ñ+BÑ'CÔ'Cð%Qð %Qð %Qñ!"ô !"ð !"ö# #œi™kœk¨IÒ5Ð5ñ* !ð ”}Ð(9Ò9Ð9Ý!(¨°8¸TÑ!BÔ!B˜Ý-4°XÐ?SÐUYÑ-ZÔ-ZÐ*Ø,0Ð)Ý%Ð&8½$Ñ?Ô?ð \Ø0B×0FÒ0FÀxÑ0PÔ0PÐ-Ð-å07Ð8JÈHÐVZÑ0[Ô0[Ð-Ø! \Ò1Ð1Ð6GÐKjÐ6jÐ6jØ,4˜M˜Mà,2˜M˜MØœÐ*>Ò>Ð>Ø#×2Ò2Ñ4Ô4˜Ø(,×(>Ò(>¸xÔ?SÑ(TÔ(T˜˜ØœÐ*<Ò<Ð<à!%×!4Ò!4Ñ!6Ô!6˜Ø*0×*CÒ*CÀHÑ*MÔ*M˜Ø(7Ô(E˜˜à!%×!4Ò!4Ñ!6Ô!6˜Ø)/×)BÒ)BÀ8Ñ)LÔ)L˜Ø(6Ô(D˜Ø,:Ð)Ø×?Ò?Ø)Ø-Ø$ñô ð 	5ð
 !ŸLšLØ#'¤?Ð uÐ uÐ uØ&*ð )ñ ô ð ð -5˜Mà$¨Ò0Ñ0ØŸš¨¬ð  &Kð  &Kð  &Kð  SW˜ñ  Xô  Xð  Xð &*˜
Ø+/×+>Ò+>Ñ+@Ô+@Ð(Øœ=Ð,@Ò@Ð@Ø,<×,OÒ,OØ (¸DÔ<Tð -Pñ -ô -˜M˜Mð -=×,OÒ,OÐPXÑ,YÔ,Y˜MØ%2˜
àQ[Ð)e­°¸YÈÑ)MÔ)MÐ)MÐae˜ØakÐ0vµµW¸ZÈÐW[Ñ5\Ô5\Ñ0]Ô0]Ð0]ÐqvÐ-õ +/Ø*ð ®r¬yØ [Ø .Þ "¤ñ0ô 0ñ+ô +˜ð !6Ð5ð Ø /ðð "0°tÐ!;Ð!wÀD×DgÒDgÐhvÑDwÔDwÐ@wð !:Ø#1°TÐ#9ð ,ð /ð ð!9ð +ð
 !ŸLšLØ#'¤?ð !Eð !Eð !Eà&*ð )ñ ô ð ð!^ð .ð !×8Ò8Ð9JÑKÔKÐKØ ×1Ò1°(Ð<PÑQÔQÐQà2CØ,4Ø-;Ø-2Ø+/Ø)7ð$ð $ð ð  œ=Ð,jÐjÑjØ0:Ð-Ø0Ñ<ÐEZÐ<Ø 7¸1Ñ <Ð 7Ø.2×.KÒ.KÐL]Ð_lÑ.mÔ.m Ø (§¢°Ñ <Ô <Ð <Ø#4Ô#<ð ![Ø$=ÐARÔAZÑ$ZÐ$=à#:¸QÒ#>Ð#>Ø$(§L¢LØ+/¬?ð )Lð )LØ,Cð)Lð )Lð )Lñ%&ô %&ð %&ð
 17ð-ið4&ð 4& Lð %-§O¢O°LÑ$AÔ$AÐ$AØ=E DÔ$:Ø$(×$:Ò$:¸8Ñ$DÔ$DÐ$DØGKÐ$DÙ$)à37×3KÒ3KÐLeÑ3fÔ3f×3lÒ3lÑ3nÔ3nÐ 0Ø $× <Ò <Ð=NÑ OÔ OÐ OØ $× 5Ò 5°hÐ@TÑ UÔ UÐ Uà6FÐ6NÈ$Ø08Ø1?Ø16Ø/3Ø-hð("ð ("ð !"ð  œ=Ð,jÐjÐjØ0:Ð-Ø0Ð<ÐAVÐ<Ø#>ÀÒ#BÐ#BØ$?À1Ñ$DÐ$?Ø$(§L¢LØ+/¬?Ð(yÐ(yÐ(yØ.2ð %1ñ %&ô %&ð %&ñ %-Ø $§¢Ø'+¤ð  %_ð  %_ð  %_Ø*.ð !-ñ !"ô !"ð !"ð !%× <Ò <Ð=NÑ OÔ OÐ OØ $× 5Ò 5°hÐ@TÑ UÔ UÐ Uà6:Ø08Ø1?Ø16Ø/3Ø-\ð("ð ("ð !"õ ˜x™=œ=¨1Ò,Ð,Ø ŸLšL¨D¬OÐ)pÐ)pÐ)pÑqÔqÐqØ37×3ZÒ3ZÐ[cÑ3dÔ3dÐ0à ×8Ò8Ð9JÑKÔKÐKØ ×1Ò1°(Ð<PÑQÔQÐQð 37Ø,@Ø-;Ø-2Ø+/Ø)Xð$ð $ð ð !ŸLšL¨D¬OÐ)jÐ)jÐ)jÐrv˜LÑwÔwÐwØ ×1Ò1°(Ð<PÑQÔQÐQà26Ø,4Ø-;Ø-2Ø*.Ø)^ð$ð $ð ö ˜x¨Ñ1Ô1ñ q°h´nñ qÞ*9Ø$œNØ%)¤]Ø%)¤]ð+ñ +ô +˜ð
 )8Ô(E˜Ø,;Ô,IÐ)Ø'6Ô'C˜à-:Ø1BØ,8ð&ð &˜
ð
 Ô/×DÒDÀZÑPÔPÐPõ
 # 4Ô#:Ð<MÈuÑUÔUð WØ"&Ô"9Ô"H˜CÝ& tÔ'>Ð@\Ð^cÑdÔdð BÞ 3°D´JÀÄÈsÑ SÔ SÐ SØ $× 0Ò 0°D´Oð  2Að  2AÐadð  2Að  2Að  2AÐtxÔt~ð  2Að  2Añ  !Bô  !Bð  !BØFK˜DÔ3ÔCØQV˜DÔ3ÔNàÐ2Ô2°mÑCÐ2Ô2ØÐ6Ô6Ð:KÑKÐ6Ô6ØÐ1Ô1°\ÑAÐ1Ô1ØÐ.Ô.°!Ñ3Ð.Ô.ØÐ1Ô1°_Ô5QÑQÐ1Ô1ØÐ2Ô2°oÔ6SÑSÐ2Ô2ØÐ6Ô6¸/Ô:[Ñ[Ð6Ô6ØÐ7Ô7¸?Ô;]Ñ]Ð7Ô7ØÐ5Ô5¸Ô9YÑYÐ5Ô5ð &(˜
Ø*Ô<ð dÀð dð *d°?Ô3Tð  *dð  *dÐWdð  *dð  *dÐhkÐl{ô  mNñ  iNð  O\ñ  i\ð  *dð  *dð  *dð  *d˜JÝŸšØfØ Ô2°D´JÀÄÐ@ZÐQZØ)Ð+<¸lØ(¨*ñ	ô ð ö ':Ø œJØ+Ø%)¤]Ø%)¤]Ý$+¨D°)¸RÑ$@Ô$@ð'ñ 'ô '˜ð 'Ô1Ð=Ø Ð;Ô;¾uÀ[ÔE[Ñ?\Ô?\Ñ\Ð;Ô;Ø3>Ô3E˜Ô0Ø3>Ô3E˜Ô0ð  Ô+ð %°´ð %ð%Ø $Ô 0× DÒ DØ$(¤OØ1@Ô1MØ2AÔ2OØ6EÔ6WØ7FÔ7YØ5DÔ5Uà'2Ô'=Ð'Iö 8=¸[Ô=SÑ7TÔ7TÐ7TØOSØ0;Ô0BØ0;Ô0BØ59´]Ø59´]à'2Ô'9¸ZÒ'GÐ'Gð 2IÐ1HØMQØ*.¬*Ø34ð! !Eñ !"ô !"ð !"ð !"øõ$ $-ð %ð %ð %Ø $ ð%øøøð  Ô/ð xÝ#œMð  +wÀÈOÔA\ð  +wð  +wð  +wÐmwð  yLô  nMð  +wð  +wð  +wð  Ycñ  drô  Ysð  +wð  +wð  +wñ  xô  xð  xð "1Ô!B˜Ø"1Ô"D˜Ø!+¨OÔ!<˜Ø"ð  gð °t´ð ØAGÈ!ÂÀ v°¡¸Ñ'<Ð'<ÐQR˜GØ ŸLšLØ#'¤?ð !Mñ !MØ#)Ð @ð!Mð !MØ.4Ð @ð!Mñ !Mà$+Ð Lð!Mñ !Mà8?Ð Lð!Mñ !Mð !Mñô ð ð ',�Oð ”}¨Ò.Ð.ð!ØSÑSÐSÐSÐSÐSØ1Ð1Ñ3Ô3Ð3Ð3øÝ(ð !ð !ð !Ø ˜Dð!øøøà×(Ò(Ñ)P°nÐ)PÑ)PÐ)PÑQÔQÐQÙøæ'ð ð ð Ù'ð 0Ù(×-Ò-¨bÑ1Ô1Ð1Ø+/Ñ(ØÔ-ð 3Ø×.Ò.¨rÑ2Ô2Ð2Þ"&¤)¡+¤+°Ñ">�KØ—L’L D¤OÐ!UÑ!UÐ!UÐ]a�LÑbÔbÐbØ×)Ò)¨(Ð4HÑIÔIÐIØ"&�KÙ%wÐ[fÐ%wÐ%wÑ%wÐ%w�NØ‘Eå ð Jñ Jð Já'ð 0Ù(×-Ò-Ñ.LÑMÔMÐMØ+/Ñ(ØÔ-ð 3Ø×.Ò.¨rÑ2Ô2Ð2õ " )Ö-?Ñ@Ô@ñ W%ÅWÈTÑSqÐstÑEuÔEuÑxyÒEyÑEyÝ#& y¡>¤>×#7Ò#7Ñ#9Ô#9˜Ù*3°xÐ*?Ð*VÁ7ÈhÐCV˜ñ (¨8Ð3ð OÙ )¨XÐ 5Ð M¸oÐ:Mð ,ö -JÈ(Ñ,SÔ,SÐ)Ý% lµDÑ9Ô9ð 9Þ<¸\ÑJÔJð 9Ø48Ð 1Ý% jµ$Ñ7Ô7ð 9Þ=¸jÑIÔIð 9Ø48Ð 1Ý%¥g¨dÑ4FÈÑ&MÔ&MÍtÑTÔTð 9Þ<¸TÔ=RÑSÔSð 9Ø48Ð 1ð -ð %Ð0Cð %Ø Ð=Ô=ÀÑBÐ=Ô=Ø0ð 	"Ø $§¢Ø'+¤ð  %Añ  %Að  %AØ*.ð !-ñ !"ô !"ð !"ð !"ð
 !%§¢Ø'+¤ð  %Iñ  %Ið  %IØ*.ð !-ñ !"ô !"ð !"ð %˜H˜H˜H™HØ*ñ f%Ø8<˜DÔ5ö 3OÈxÑ2XÔ2XÐ/Ý)¨,½Ñ=Ô=ð KÞ <¸\Ñ JÔ JÐ Jõ
  *¨*µdÑ;Ô;ð JÞ =¸jÑ IÔ IÐ IØ16Ð.Ý)­'°$Ñ8JÈDÑ*QÔ*QÕSWÑXÔXð iÞ5QÐRVÔRgÑ5hÔ5hÐ 2à/4Ð,Ý)­'°$¹ÀÑ*FÔ*FÍÑMÔMð YÞ3LÈTÌZÑ3XÔ3XÐ 0à05Ð-Ý)Ð*>ÅÑDÔDð =Þ4DÐEYÑ4ZÔ4ZÐ 1Ø#4Ð8LÒ#LÐ#LØ;LÐ$8ØAR DÔ$>Ø8<Ð$5Ý)­'°$Ñ8QÐSWÑ*XÔ*XÕZ]Ñ^Ô^ð =Þ7GÈÔHdÑ7eÔ7eÐ 4Ø#7¸4Ô;WÒ#WÐ#WØCW DÔ$@Ø8<Ð$5à16Ð.õ $.­g°dÑ<LÈdÑ.SÔ.SÕUYÑ#ZÔ#Zð!* Ô 3× 7Ò 7Ñ8IÑ JÔ JÐ Jà%)ð -õ
  *Ð*:½DÑAÔAð eÞ5RÐScÑ5dÔ5dÐ 2ð 5:Ð1Ý'.¨t°YÀÑ'EÔ'EÐ'KÈ˜HØ'ð &Þ-=¸hÑ-GÔ-G 
Ø#-°Ò#9Ð#9Ø3= D¤LÝ'1µ'¸$Ñ@PÐRVÑ2WÔ2WÕY]Ñ'^Ô'^ð %TØIS¨Ô(;¸IÑ(Fõ (/¨t°X¸tÑ'DÔ'DÐ'PÖU\Ð]aÔ]hÐjsÑUtÔUtÐ'PØ>H¨¬Ô(;Ø<@Ð$9Ø$(§L¢LØ+/¬?ð )[ñ )[ð )[ð /3ð	 %1ñ %&ô %&ð %&ð !Ð=Ô=ÀÑBÐ=Ô=à 3ð !9Ø#5ð!9à#3ð!9ð $5ð!9ð $6ð	!9ð
 $9ð +ð  .ð 	"Ø $§¢Ø'+¤ð  %]ñ  %]ð  %]Ø*.ð !-ñ !"ô !"ð !"ð !"ð
 !%§¢Ø'+¤ð  %Mñ  %Mð  %MØ*.ð !-ñ !"ô !"ð !"ð %˜H˜H˜H™Hå")¨)±]ÀDÑ"IÔ"I�KØ$(×$CÒ$CÀIÑ$NÔ$N�Mõ #*¨$Ñ0DÀdÑ"KÔ"K�KØQ\Ðh�w {Ñ4DÁfÑMÔMÐMÑbh�HÞ!3Ø!Ý!(¨©z¸2Ñ!>Ô!>Ð!DÀ"Ý% d¨G°RÑ8Ô8Ð>¸BØ&3Ø'/Ø:FÐ%M¥S¨Ñ%6Ô%6Ð%6ÈAñ"ñ "ô "�Jõ —L’LÙnØ"Ô)Ô/°Ô1GØ"Ô,¨jÔ.HØ"Ô;¸ZÔ=Wñ	ô ð ð <@×;]Ò;]Ø$/Ø(7Ø*4Ô*;Ø&3ñ	 <^ñ <ô <Ñ8Ð'¨ð +ð !Ø ˜˜˜™àœÐ):Ò:Ð:Ø œM©^Ò;Ð;Ø'©3Ò.Ð.Ø :ð /ð 6:Ð2Ø×EÒEÈDÐEÑQÔQð %Ø ŸLšL¨D¬OÐ)uÑ)uÐ)uÑvÔvÐvØ$˜H˜H˜H™HàœÑ);Ò;Ñ;Ø œM¨VÒ3Ñ3Ø'©3Ò.Ñ.Ø 9ñ /ð 59Ð1Ø×DÓDÈ4ÐDÑPÔPð %Þ! T¤_Ð"rÑ"rÐ"rÑsÔsÐsØ$˜H˜H˜H™Hð TÑSÑSÑSÐSÐSØ&˜w™yœy˜Ø%'˜
ð!Ý$+¨I±v¸tÑ$DÔ$DÐ$lÍÐPYÑ[eÐgkÑHlÔHl˜EØ$Ð0Ý-0°©Z¬Z¸¹¸Ô-= 
øøÝ(ð !ð !ð !Ø ˜Dð!øøøæ ¤ÐaÑaÐaÑbÔbÐbØ%ð QÞ! T¤_Ð"OÑ"OÀ:Ð"OÐ"OÑPÔPÐPÞ ¤ð  Fñ  Fð  Fñ  Gô  Gð  GÞ ¤ÐEÑEÐEÑFÔFÐFÞ ¤ÐhÑhÐhÑiÔiÐiÞ ¤ÐsÑsÐsÑtÔtÐtÞ ¤ÐfÑfÐVZÐfÑfÐfÑgÔgÐgÞ ¤Ð}Ñ}Ð}Ñ~Ô~Ð~àœ©Ò2Ð2Ø'©3Ò.Ð.Ø <ð /ð 8<Ð4Ø×GÓGÑIÔIð %Ø ŸLšL¨D¬OÐ)~Ñ)~Ð)~ÑÔÐØ$˜H˜H˜H™HàœÐ)=Ò=Ñ=Ø'©3Ò.Ñ.Þ# DÑ*>Ñ?Ô?ñ /à >ñ /ð :>Ð6ØKÑKÑKÑKÐKÐKØ×IÓIÑKÔKð %Þ! T¤_Ð"yÑ"yÐ"yÑzÔzÐzØ$˜H˜H˜H™Hà"Õ5˜ØFUÀoÐVYÑFZÔFZÐ&uÑ&BÐ&BÑ`u˜Þ ¤Ð_Ñ_Ð_Ñ`Ô`Ð`Þ ¤ÐOÑOÀ+ÐOÐOÑPÔPÐPÞÐTWð  ^Õ\_Ð`cÑ\dÔ\dÑgiÒ\iÐ\i ¤ÐPÑPÀ3ÀsÉÀsÄ8ÐPÐPÐPÐPÐrvô  sBð  p^ñ  p^ð  p^ñ  _ô  _ð  _Þ ¤ÐEÑEÐEÑFÔFÐFØSÑSÑSÑSÐSÐSØ&˜w™yœy˜Þ ¤ð  Fñ  FÐTXð  Fñ  Fð  Fñ  Gô  Gð  GÞ ¤ð  Fñ  FÐVZð  Fñ  Fð  Fñ  Gô  Gð  GÞ ¤Ð|Ñ|Ð|Ñ}Ô}Ð}Þ ¤ÐvÑvÐvÑwÔwÐwÞ ¤ÐqÑqÐqÑrÔrÐrÞ ¤ÐuÑuÐuÑvÔvÐvð #Ô)®^Õ-NÒNÐNØ <ð Oð 8<Ð4Ø"*ð Bð B˜BÝ)¨"­dÑ3Ô3ð BØ "§¢Ñ':¸DÑ AÔ AÐ AøØŸšØ#œð Iñ Ið Ià"&ð %ñ ô ð õ
  œñAà œO­S°©]¬]ñô ð ð
 !˜˜˜™à 1Ñ$�KÞ#'¤9¡;¤;°Ñ#?�LØ×(Ò(ÙS°{ÐSÐSÀ[ÐSÐSÐSñô ð ö "& i¡¤Ô!9�JÝ # I¡¤× 4Ò 4Ñ 6Ô 6‘IØ%)×%>Ó%>¸yÑ%IÔ%I�NÝ—N’NÙUØ#Ø#Ø"Ø×0Ò0Ñ2Ô2Ø&ñô ð õ !(¨©j¸)Ñ DÔ D�IÝ# D©*°iÑ@Ô@�EÝ$ T¨7°IÑ>Ô>�FØCNÐ'VÑ'?°Ð'?Ñ'?Ð'?Ð'?ÐTVÐ$Ø—L’L D¤Oð  "Sñ  "SÐVað  "Sð  "SÐdoð  "Sð  "SÐt~ð  "Sð  AQð  "Sð  "Sð  [_�Lñ  `ô  `ð  `Ø—L’L D¤OÐ!cÑ!cÀyÐ!cÑ!cÐ[aÐ!cÐ!cÐko�LÑpÔpÐpØ—L’L D¤OÐ!NÑ!NÀuÐ!NÐ!NÐVZ�LÑ[Ô[Ð[Ø—L’L D¤OÐ!TÑ!TÀNÐ!TÐ!TÐ\`�LÑaÔaÐaØ"ð k {±SÒ'8Ð'8Ý$+¨I±v¸tÑ$DÔ$D˜	Ø@IÐ(S­¨I©¬°t¹°tÔ(<Ð(<Èt˜Ø(ð kØ ŸLšL¨D¬OÐ)]Ñ)]ÈmÐ)]Ð)]Ðei˜LÑjÔjÐjØ—L’L D¤Oð  "[ñ  "[Èð  "[ð  "[ñ  "[ÕgjÐkwÑgxÔgxð  "[ñ  "[ð  CPð  "[ð  "[ð  "[ð  "[ñ  \ô  \ð  \ð ×/Ó/Ñ1Ô1ðá.±)Ð;Ð;àŸšØ#œð  Nñ  NÐTZð  Nñ  Nð  NØ"&ð %ñ ô ð ð  Õ1ð Ø ŸLšLØ#'¤?ð  !Jñ  !Jð  !JØ&*ð )ñ ô ð ð !ŸLšLØ#'¤?ð  !Nñ  !Nð  !NØ&*ð )ñ ô ð ð ŸšØ#œð  Añ  AÐx~ð  Að  AØ"&ð %ñ ô ð ð Ô0ð 
ØŸš¨¬Ð%xÑ%xÐ%xð  AE˜ñ  Fô  Fð  FØ×-Ò-¨hÐ8LÑMÔMÐMØ×,Ò,Ñ.Ô.Ð.ñ /XÐ\fð  /Xð  /XÐjn÷  kDò  kDõ  EHð  IRñ  ESô  ESñ  kTô  kTð  /Xð  /Xð  /XØ(0Ø)7Ø).Ø+/ð ð  ð ð ð ð ð ð õ #*¨)±]ÀDÑ"IÔ"I�Kð "Ô(®NÕ,LÒLÑLÙ'-˜Ø%)Ô%<˜
Ø",Ô";˜Ø" \Ò1Ð1Ø&×3Ó3Ø&*¤jØ/;Ø)-¬Ý(/°°iÀÑ(DÔ(DØ)-¬ñ 4ñ ô ð ö  ' zÐ3DÑEÔEð NØ=A 
Ô :ð
 IN 
Ô EØ ŸLšLØ#'¤?ð !Kñ !Kà#*Ð Jð!Kñ !Kà3?Ð Jð!Kð !Kð !Kð '+ð	 )ñ ô ð ð -°Ñ1Ð,Ø/Ð3KÒKÐKÝ+.¨x©=¬=˜LØ=A×=SÒ=SØ (¨.Ø.;Ø(9ð >Tñ >ô >Ñ:˜HÐ&:ð 48Ð0Ý" 8™}œ}¨|Ò;Ð;¸wÈÒ?UÐ?UØ $× 1Ò 1ñ%FÀ,Ð$Zð %Fñ %FØ,3Ð$Eð%Fñ %Fð %Fñ!"ô !"ð !"ö !%¤
©1¡¤ ØCGÐ @Ø %   ¡ð '1Ô&7Þ&Õ1Þ&Õ.ð<ð '�Oð 'ð )¨4Ô+?Å#ÀdÔFZÑB[ÔB[Ò+[Ð+[ö ,MØ Õ1ñ,ô ,Ð(ð  0ð )Ø ×-Ò-Ñ.iÑjÔjÐjØ#×:Ò:À*ÔBSÐ:ÑTÔTð )Ø./ Ø78Ð 4Ø=BÐ :Ø (   ¡ð. (ð(%à œM¨VÒ3Ð3Ø&Ô-¶Õ1JÒJÐJØ 3ð Kð 49Ð0ð!ðñ ð ñ ð ñ ð ð õ )0°	¹:ÀtÑ(LÔ(L˜Ið $-ð!7¥¨	±9¸dÑ CÔ CÐ CØ26ð &ð 8RÐ7QØ(1Ø15Õ1Gñ8ñ 8ô 8Ð4ð  8ð "Ø 6Ð 6Ø,5Ø2?ñ!"ñ !"ô !"ð !"ð !"õ
 !(¤ñ%=ñ!"ô !"ð !"øøõ  )ð !ð !ð !Ø ˜Dð!øøøà3ð %ð +6˜KØ$˜H˜H˜H™Hð #Ô)®^Õ-MÒMð )ð ,ñ .Ø,°Ñ1Ð,Ø/Ð2JÒJÐJØ ŸLšL¨D¬Oð  *\ñ  *\Ð[sð  *\ñ  *\ð  *\ð  dh˜Lñ  iô  ið  iØ ŸLšL¨D¬Oð  *Pñ  *Pð  *Pð  X\˜Lñ  ]ô  ]ð  ]Ý#œM¨T¬_Ð*Ñ*Ð[sÐ*Ñ*Ð*ñ  Aô  Að  AØ ×1Ò1°(Ð<PÑQÔQÐQà,4Ø-2Ø-;ñ *FÐayð  *Fñ  *Fð  *FØ+/Ø*.Ø9=ñ$ð $ð ð ð ð ð ð ð ×)Ò)ñ  +bð  nBð  +bð  +bð  E]ð  +bð  +bð  +bñ  cô  cð  cå'*¨8¡}¤}˜Ø9=×9OÒ9OØ$ nÀMØ$5ð :Pñ :ô :Ñ6˜Ð"6ð 04Ð,å˜x™=œ=¨<Ò7Ð7Ø ×-Ò-Ñ.|ÀLÐ.|Ñ.|ÕWZÐ[cÑWdÔWdÐ.|Ñ.|Ð.|Ñ}Ô}Ð}Þ œJ¡q™MœM˜MØ?CÐ<Ø!˜E˜E˜E™Eà ŸLšL¨D¬OÐ)oÑ)oÐ)oÐw{˜LÑ|Ô|Ð|Ø ŸLšL¨D¬Oð  *Pñ  *Pð  *Pð  X\˜Lñ  ]ô  ]ð  ]Ý#œM¨T¬_Ð*mÑ*mÐ*mÑnÔnÐnØ ×1Ò1°(Ð<PÑQÔQÐQà,4Ø-2Ø-;Ù)dØ+/Ø*.Ø9=ñ$ð $ð ð ð ð ð ð ð #Ô)®^Õ-LÒLð ,ð /ñ UØ%)Ô%<˜
Ø",Ô";˜ö )QÑQZÑ([Ô([˜Ø(Ð4ö (+¨1¨m¹bÑ.@Ñ'AÔ'A˜HØ@H˜DÕ=Ø ŸLšLØ#'¤?ð !qñ !qØ<DÐ Ið!qñ !qà5BÐ pð!qñ !qàdkÐ pð!qð !qð !qð '+ð	 )ñ ô ð ð 1°AÑ5Ð0Ø3Ð6NÒNÐNØ $§¢°´ð  .Dñ  .DÐ_wð  .Dñ  .Dð  .Dð  LP ñ  !Qô  !Qð  !QØ $§¢°´ð  .Tñ  .Tð  .Tð  \` ñ  !aô  !að  !aÝ '¤°´ð  /Hñ  /HÐc{ð  /Hñ  /Hð  /Hñ  !Iô  !Ið  !IØ $× 5Ò 5°hÐ@TÑ UÔ UÐ Uà08Ø16Ø1?ñ .HÐc{ð  .Hñ  .Hð  .HØ/3Ø.2Ø=Añ("ð ("ð !"ð !"ð !"ð !"ð !"ð !"ð @DÐ<Ø!˜E˜E˜E™Eö (FÁiÑ'PÔ'P˜Ý+2°4¹ÀRÑ+HÔ+HÐ+NÈB×*UÒ*UÑ*WÔ*W˜Ý'.¨t±ZÀÑ'DÔ'DÐ'JÈ×&RÓ&RÐSVÑ&WÔ&W×&]Ò&]Ñ&_Ô&_˜à+Ñ/HÐHð Ø*×5Ó5ñ 7ñ  ô  ð ,ð 0ð NØ ,°Ð 4ðNá @ÁIÐ Mð 4ð
 (ð C¨L¸7Ò,BÐ,BØ&2˜GØ ŸLšL¨D¬Oð  *Cñ  *CÐ^eð  *Cð  *Cñ  *CÐv}ð  *Cð  *Cð  *Cð  *Cð  KO˜Lñ  Pô  Pð  Pð  PØ8ð 	CØ&-˜GØ ŸLšLØ#'¤?ð !añ !aØ=DÐ `ð!añ !að !aà&*ð )ñ ô ð ð ö ':¸'Ñ&BÔ&B˜Gà"ð X w°Ò'8Ð'8Ø&×3Ó3Ø&*¤jØ/6Ø)-¬Ý(/°°iÀÑ(DÔ(DØ)-¬ñ 4ñ ô ð ö  ' zÐ3DÑEÔEð 	"Ø=A 
Ô :õ IMØ$0Ð$L°\ÀWÒ5LñI"ô I" 
Ô Eð !ŸLšL¨D¬Oð  *Sñ  *SÐpwð  *Sð  *Sñ  *Sð  AHð  *Sð  *Sð  *Sð  *Sð  [_˜Lñ  `ô  `ð  `ð  `à ŸLšL¨D¬Oð  *Kñ  *Kð  *Kð  SW˜Lñ  Xô  Xð  Xà,°Ñ1Ð,Ø/Ð2JÒJÐJØ ŸLšL¨D¬OÐ)Ñ)Ð[sÐ)Ñ)Ð)ð  HL˜Lñ  Mô  Mð  MØ ŸLšL¨D¬Oð  *Pñ  *Pð  *Pð  X\˜Lñ  ]ô  ]ð  ]Ý#œM¨T¬_ð  +Dñ  +DÐ_wð  +Dñ  +Dð  +Dñ  Eô  Eð  EØ ×1Ò1°(Ð<PÑQÔQÐQà,4Ø-2Ø-;ñ *DÐ_wð  *Dñ  *Dð  *DØ+/Ø*.Ø9=ñ$ð $ð ð ð ð ð ð ð ×)Ò)ñ  +jÈð  +jð  +jñ  +jð  uIð  +jð  +jð  Ldð  +jð  +jð  +jñ  kô  kð  kå'*¨8¡}¤}˜Ø9=×9OÒ9OØ$ nÀMØ$5ð :Pñ :ô :Ñ6˜Ð"6ð 04Ð,å˜x™=œ=¨<Ò7Ð7¸7Ð7ÀwÐQXÒGXÐGXÝ" 8™}œ}¨|Ò;Ð;Ø $× 1Ò 1ñ  3AÈð  3Añ  3AÕ[^Ð_gÑ[hÔ[hð  3Añ  3Að  3Añ  !Bô  !Bð  !BÞ œJ¡q™MœM˜MØ?CÐ<Ø!˜E˜E˜E™Eð !ŸLšL¨D¬OÐ)uÑ)uÐ)uð  ~B˜Lñ  Cô  Cð  CØ ŸLšL¨D¬Oð  *ñ  *ð  *ð  GK˜Lñ  Lô  Lð  LÝ#œM¨T¬_ð  +Jñ  +JÐWdð  +Jð  +Jñ  +Jð  +Jñ  Kô  Kð  KØ ×1Ò1°(Ð<PÑQÔQÐQà,4Ø-2Ø-;Ù)xÀ]Ð)xÐ)xÑ)xÐ)xØ+/Ø*.Ø9=ñ$ð $ð ð ð ð ð ð õ, # 9®z¾9Ð.EÑFÔFð DÝ *Ø%Ö(:½DÕ<PÐ'Qñ!ô !ð ðDõ !+¨9¶cµlÑ CÔ CÐCð .ð 2ð à *Ô 4Ð4ð 
Ø$.Ô$>Ð >ð
à *Ô 1Þ .Õ 9Þ .Õ 6Þ .Õ 9Þ .Õ ?Þ .Õ @Þ .Õ @Þ .Õ Að:ð !ð'6ð 6Ð5ð $ð" 'ñ 8ð ×)Ò)Ñ*sÈkÐ*sÑ*sÐ*sÑtÔtÐtØ×6Ò6Ñ8Ô8ð %Ø*+˜KØ34Ð0Ø9>Ð6Ø$˜H˜H˜H™HØ%Ð1Ø ×8Ò8Ø *Ñ3OÐW`ñ 9ñ ô ð ð ×)Ò)ñF¸[ð Fð FØ#×8Ó8¸ÑCÔCðFð Fñô ð ð Ÿš¨¬Ð%wÑ%wÐ^iÐ%wÑ%wÐ%wð  @D˜ñ  Eô  Eð  EØŸš¨¬Ð%gÑ%gÈ9Ð%gÑ%gÐ_eÐ%gÐ%gÐos˜ÑtÔtÐtØŸš¨¬Ð%RÑ%RÈ5Ð%RÐ%RÐZ^˜Ñ_Ô_Ð_à%Õ-ð A°Ô1BÆnÕF\Ò1\Ñ1\Ø(©NÒ:Ð:¸{ÉcÒ?QÐ?QØ $§¢°´ð  .Mñ  .Mð  .Mð  UY ñ  !Zô  !Zð  !ZØ $§¢°´ð  .Añ  .Að  .Að  IM ñ  !Nô  !Nð  !NØ $§¢°´ð  .Añ  .Að  .Að  IM ñ  !Nô  !Nð  !NØ $§¢°´Ð-tÑ-tÐ-tð  }A ñ  !Bô  !Bð  !Bð  !Bà $§¢°´Ð-zÑ-zÐ-zð  CG ñ  !Hô  !Hð  !HØ $§¢°´Ð-nÑ-nÐ-nÐvz Ñ {Ô {Ð {Ø $§¢°´Ð-uÑ-uÐlrÐ-uÐ-uÐ-uð  ~B ñ  !Cô  !Cð  !CÞ#8½¸U¹¼Á_Ñ#UÔ#Uð !RØ$(§L¢L°D´Oð  2Eñ  2Eð  2Eð  MQ Lñ  %Rô  %Rð  %Røà ŸLšL¨D¬OÐ)sÑ)sÐ)sÐ{˜Lñ  Aô  Að  AÝœ¨¬Ð&aÑ&aÐV_Ð&aÐ&aÑbÔbÐbð '©#Ò-Ð-°=Á5Ò3HÐ3HÍCÐP\ÑL]ÔL]Ð`bÒLbÐLbØ ŸLšLØ#'¤?ð !Tñ !Tð !Tà&*ð )ñ ô ð ð ð !×1Ò1°(Ð<PÑQÔQÐQà.2Ø(0Ø)7Ø).Ø&*Ý%(¨¡^¤^ð ð  ð ð ð ð ð ð ð # kÒ1Ñ1ð
  :ð %¸d×>aÓ>aØ%°;ÈKñ ?bñ ?ô ?ð %ð :>Ð6Ø*+˜KØ$˜H˜H˜H™Hà×)Ò)Ð*pÀÐ*pÑ*pÐ*pÑqÔqÐqØ×6Ò6Ñ8Ô8ð %Ø*+˜KØ34Ð0Ø9>Ð6Ø$˜H˜H˜H™HØ)-×)BÓ)BÀ9Ñ)MÔ)M˜Ø*ð rØ ×-Ò-Ñ.rÈÐ.rÑ.rÐbpÐ.rÐ.rÑsÔsÐsÐsà ×-Ò-Ñ.pÀkÐ.pÑ.pÐ`nÐ.pÐ.pÑqÔqÐqØŸš¨¬Ð%^Ñ%^ÈnÐ%^Ð%^Ðfj˜ÑkÔkÐkõ !(¨	±=À$Ñ GÔ GÐGð Þ #ñ $ð $ñ $ð $ñ =ð $ñ $ô $ñ !ô !ð (ð +ð Ø ŸLšLØ#'¤?ð !?ñ !?ð !?ð '+ð )ñ ô ð ð !ŸLšLØ#'¤?ð !-ñ !-ð !-ð '+ð )ñ ô ð õ  œÙnØ œO¨[¸.Ø% v­s°<Ñ/@Ô/@À]ÐBVÐBVñô ð ð
 &Ð1Ø ×8Ò8Ø *Ñ3JÐR[ñ 9ñ ô ð ð ×-Ò-¨hÐ8LÑMÔMÐMÙ*jÀ;Ð*jÐ*jÐZhÐ*jÐ*j˜Ø*ð Ø+ñ!Jñ˜Oð />Ø(0Ø)7Ø).Ø&*Ø%3ð ð  ð ð ð ð ð ð ð $(�LØ&ð )Ý(/µ¸	Á:ÈtÑ0TÔ0TÑV_ÐaeÑ(fÔ(f˜Ø(ð )®W°]ÁEÑ-JÔ-Jð )Ø&3×&7Ò&7¹Ñ&FÔ&FÐ&jÈ-×J[ÒJ[Ñ\iÑJjÔJj˜GØ&ð )ð!)Þ36¶s¸7±|´|ÁSÑ3IÔ3I L LøÞ(1¶:Ð'>ð !)ð !)ð !)Ø$( Dð!)øøøà0<Ð   ÖBRÐS^ÑknÑz~ÐBÑBÔB�IØ&ð xØ×)Ò)ñ  +HÈ)ð  +Hð  +Hñ  +HÐdoÐrsÑdsð  +Hð  +Hð  wBð  +Hð  +Hð  +Hñ  Iô  Ið  Ið  Ià×)Ò)Ð*v¸YÐ*vÐ*vÑ*vÐWbÐ*vÐ*vÐepÐ*vÐ*vÐ*vÑwÔwÐwÝ—N’NÙNØ!Ø#Ø#Ø×0Ò0Ñ2Ô2Ø!ñô ð ö !%¤	¡¤¨iÑ 7�IØ-.Ð*Þœ)™+œ+¨	Ò1Ð1ØÔ4ð 
Ø ŸLšL¨D¬OÐ)pÐ)pÐ)pÐx|˜LÑ}Ô}Ð}Ø ×1Ò1°(Ð<PÑQÔQÐQØ ×0Ò0Ñ2Ô2Ð2ñ 3OÐq|ð  3Oð  3Oð  @Kð  3Oð  3Oð  3OØ,4Ø-;Ø-2Ø/3ð$ð $ð ð ð ð ð ð ö œ
 3™œ˜ð /°!Ñ3Ð.Ø1°CÑ7¸1Ò<Ð<Ø ×0Ò0ñ!M¸ð !Mð !MÀkð !Mð !MÞ#& y¶4´9±;´;Ñ'>Ñ#?Ô#?ð!Mð !Mð !Mñô ð ö# œ)™+œ+¨	Ò1Ð1øøøøøøøøøðmJøøøðQ  Ò+Ñ+ðj4 ð Ù$AÐ!Ùà/ð Ø !Ñ#�ØÔ%×,Ó,Ñ.Ô.Ð.ð ˜qÑ �Ø38Ð0Ùà/ð ð 26´ÐJ˜dœo˜oÁd�Ø$Ð(?À!Ñ(CÑD�Þ47¸ÁÑ4FÔ4F�Õ1Ùð
 ÐÙ$GÐ!Þ˜œÐdÑdÐdÑeÔeÐeØ×%Ò% hÐ0DÑEÔEÐEÙðxØ!×0Ò0Ñ2Ô2�
Ø$&Ð!Ø”=Ð$8Ò8Ð8Ø=AÔ=UÐ%Ñ&9Ñ:Ø:˜ZÔ:¸8ÐYÐYÐGXÐYÐY�
Ø$.Ð!Ø *Ô 8�ð
 %Ô,Ñ8ÅÐL]ÔLeÕgjÑAkÔAkÑ8Ø+Ô3�CÝ! #¥tÑ,Ô,ð =Ø47·G²G¸FÀBÑ4GÔ4GÐ4tÈ3Ï7Ê7ÐS\Ð^`ÑKaÔKaÐ4tÕeiÔeoÐpsÑetÔetÐ)Ô1Ñ1Ý# C­Ñ.Ô.ð =à "˜Ø$'ð @ð @˜DÝ)¨$µÑ4Ô4ð @Ø %§¢¨TÑ 2Ô 2Ð 2Ð 2Ý!+¨Dµ$Ñ!7Ô!7ð @¸D¿HºHÁVÑ<LÔ<LÐPVÒ<VÐ<VØ %§¢¨T¯XªX°f¸bÑ-AÔ-AÑ BÔ BÐ BÐ BÝ!+¨Dµ$Ñ!7Ô!7ð @¸FÀd¸N¸NØ %§¢­S°°f´Ñ->Ô->Ñ ?Ô ?Ð ?øØ48·I²I¸eÑ4DÔ4DÐ)Ô1Ð1å47¸±H´HÐ)Ô1ðØNÐNÐNÐNÐNÐNÝ,3Ð4EÀ|ÐUYÑ,ZÔ,ZÐ,`Ð^`Ð)Ø&7Ô&?Ð&EÀ2�OØ �LØ*ñà 1Ø#'¤?Ð#8°bØ!%¤Ð!4°"Ø"œjØ!%¤Ø!%¤Ø!%¤Ø'5Ø%1Ø&3Ý&)¨,Ñ&7Ô&7Ý'.¨x¸À$Ñ'GÔ'GØ"×FÓFÀxÑPÔPÝ03°OÑ0DÔ0DÝ25Ð6KÑ2LÔ2Lñ!ð ð ð ð øõ$ !ð ð ð Ø�Dðøøøð %Ô,ð c°T´_ð cØÔ+ð cØŸš¨¬Ð%dÑ%dÐIZÔIbÐ%dÐ%dÑeÔeÐeÐeàŸš¨¬ð  &bñ  &bÐIZÔIbÐcgÐdgÐcgÔIhð  &bÕsvð  xIô  xQñ  tRô  tRð  UXò  tXð  tXÐjoÐjoð  ^`ð  &bð  &bñ  cô  cð  cð &Ô-ð !°$Õ2Mð !Ø"3Ô";×"AÒ"AÑ"CÔ"C�Kæ"$¥&ÙGÈÈ[ñ#ô #ç’e‘g”gð  ð
 EPÐ!W ×!2Ó!2°4Ñ!8Ô!8¸Ô!;¸C¸R¸CÔ!@Ð!@ÐUW�JØ!ð 	!¥g¨dÑ4EÀqÑ&IÔ&IÈAÒ&MÐ&Mð!Ø ×7Ó7¹ÀZÑPÔPÐPÐPøÝ(ð !ð !ð !Ø ˜Dð!øøøà$ð !ð!Ø ×7Ó7Ñ8MÉ{Ð\gÐhlÑilÐhlÔ\mÐosÑtÔtÐtÐtøÝ(ð !ð !ð !Ø ˜Dð!øøøö
 -Ð->Ô-FÐ-LÈ"ÑMÔMð ØÐ7Ô7¸1Ñ<Ð7Ô7à—L’L D¤Oð  "Bñ  "Bð  "Bñ  Cô  Cð  CàÔ:¹aÒ?Ð?ØŸš¨¬Ð%|Ñ%|ÐQUÔQtÐ%|Ñ%|Ð%|Ñ}Ô}Ð}á ð Ÿš¨¬Ð%zÑ%zÐ%zð  CG˜ñ  Hô  Hð  HØ>?˜Ô;à/3×/VÒ/VÐW_Ñ/`Ô/`Ð,Ø×4Ò4Ð5FÑGÔGÐGØ×-Ò-¨hÐ8LÑMÔMÐMð /3Ø(<Ø)7Ø).Ø'+Ù%Vð ð  ð ð 78�Ô3à”=Ð$5Ò5Ñ5¸-È<Ò:WÑ:WØÐ2Ô2°aÑ7Ð2Ô2à"&×"?Ò"?Ð@QÐS`Ñ"aÔ"a�KÝ*.°·²À	Ñ0JÔ0JÐ0PÈb×/WÒ/WÑ/YÔ/YÑ*ZÔ*ZÐ'Ý^hÐit×ixÒixð  zEñ  jFô  jFõ  HKñ  _Lô  _Lð  -W­D°·²ÀÈbÑ1QÔ1Q×1WÒ1WÑ1YÔ1YÑ,ZÔ,ZÐ,Zð  RWÐ)Ý26°{·²ÑG^Ñ7_Ô7_Ñ2`Ô2`Ð/Ý6:¸;¿?º?ÑK`Ñ;aÔ;aÑ6bÔ6bÐ3ð ,ðNà0ðNð 7ðNð ;ñ	Nð 4<Ð#E 8¨B¤< <À˜õ U_Ð_gÕimÑTnÔTnÐ+x¨8¯<ª<Ñ8OÑ+PÔ+PÐ+PÐtxÐ(Ø.9¯oªoÑ>UÑ.VÔ.VÐ+ÝZdÐemÕosÑZtÔZtÐ3~°8·<²<Ñ@UÑ3VÔ3VÐ3VÐz~Ð0Ø6A·o²oÑF[Ñ6\Ô6\Ð3å& xµÑ6Ô6ð XØ (§¢¨VÑ 4Ô 4¸Ò CðXà (§¢¨_Ñ =Ô =ÀÒ MðXð "*§¢¨iÑ!8Ô!8Ð!>¸BÀKÇOÂOÐT]ÑD^ÔD^ÐDdÐbdÒ eðXð "*§¢¨kÑ!:Ô!:Ð!@¸bÀkÇoÂoÐVaÑFbÔFbÐFhÐfhÒ ið	Xð
 !1Ð4GÒ GðXð !9Ð<WÒ Wð *ð  1ð NØ$ŸOšO¨KÑ8Ô8Ð8Ø ×@Ó@ÀÑMÔMÐMàÔ5¸Ò9Ð9Ø#œð RØ ŸLšL¨D¬Oð  *Qñ  *QÐmqô  nLð  *Qñ  *Qð  *Qñ  Rô  Rð  RØ19˜Ô.Ø×.Ò.¨xÑ8Ô8Ð8Ù à56�DÔ2Ø×)Ò)¨(Ð4HÑIÔIÐIà*.Ø$,Ø%3Ø%*Ø#'Ù!cðð ð ö ˜TÑ#>Ñ?Ô?ð 7Ø56�DÔ2ð %Õ/ñ U	Øœ?ð ~ØŸš¨¬Ð%|Ñ%|ÍÐM^ÕMiÑIjÔIjÐ%|Ñ%|Ð%|Ñ}Ô}Ð}àÔ+ð xØ"3Õ">ð xð x™BÝ#œMÑ*v¹½Õ8HÐ*vÑ*vÑVXÕVaÕVkÐlpÑmpÐlpÔVqÐ*vÐ*vÐ*vÑwÔwÐwÐwð 0Õ:ð <ð <™Ù�;Õ+°4Ô3HÐHÐHØ'+×'=Ó'=¹b½kÕ>NÑ'OÔ'O˜HØ'ð <Þ %¨¬Ð&|Ñ&|ÑY[ÕYdÕYiÐ&|Ñ&|ÐqyÐ&|Ð&|Ð&|Ñ }Ô }Ð }Ø3;¡¥Õ 0øð*ð *ñ *ð *Ø3DÕ3Oð*ñ *ô *Ð&ð *ñ #!àÐ2Ô2°aÑ7Ð2Ô2ð %)§I¢I®f°TÔ5JÑ.KÔ.KÑ$LÔ$L˜	Ø'9¸!Ô'<˜ÝGJÈ<ÑGXÔGXÐ[]ÒG]ÐG]¨,°s¸°sÔ*;¸eÑ*CÐ*CÐco˜ØŸš¨¬ð  &rñ  &rÈð  &rñ  &rð  SWô  Smð  &rñ  &rð  &rñ  sô  sð  sàÔ5¸Ò:Ð:Ø ŸLšL¨D¬Oð  *Gñ  *Gð  *Gð  OS˜Lñ  Tô  Tð  TØ9:˜DÔ6Ø ×1Ò1°(Ð<PÑQÔQÐQà26Ø,4Ø-;Ø-2Ø+/Ù)`ÈÐ)`Ð)`ð$ð $ð ð )-×(EÒ(EÐFWÐYfÑ(gÔ(g˜Ø Ÿš¨Ñ6Ô6Ð6Ø"3Õ">ð 	ð 	™BÙ!�{Õ/°tÔ7LÐLÐLÙ*s±2µ;Õ3CÐ*sÑ*sÐhqÐ*sÐ*s¡ ñ +G¡Ø$ŸOšOØ(.Ù02µÙ+2ñ-ð -ñ ô ð ð ñ
 !à12�DÔ.ð )+Ñ%Ø/Õ:ð Qñ Q™Ù!�{Õ4™Ý%¡d­Tµ4¨LÑ9Ô9ð %Ý48´J¹tÑ4DÔ4D™B�KÕ1Ø$ÙÐ+µJ¹tÅSÑ4IÔ4IÐ+Ý47¹±I´I™B�KÕ1Ù#%¥;Õ#8™Dá#ð %©4¯:ª:©<¬<ð %Ù48™B�KÕ1Ø$ðQÝ œJ¡tÑ,Ô,Ð,Ð,øÝ#Õ3ð Qð Qð QÙ-×4Ò4±bµkÕ6FÍÈAÉÌÐ5OÑPÔPÐPÐPÐPÐPÐPÑPøøøøðQøøøñ )ñ C%ö &)ñ )ð )ñ )ð )à&7Õ&Bð)ñ )ô )ñ &ô &™
ñ
 &ð Ø ŸLšLØ#'¤?ð !^ñ !^Ø2?ð!^ñ !^ð !^à&*ð )ñ ô ð ð
 :;˜DÔ6Ø ×8Ò8Ð9JÑKÔKÐKØ ×1Ò1°(Ð<PÑQÔQÐQà26Ø,4Ø-;Ø-2Ø+/Ø)Xð$ð $ð ð Ð2Ô2°aÑ7Ð2Ô2á/@ÀÔ/CÑ,™	¡9ØŸš¨¬ð  &Dñ  &DÑjsð  &Dñ  &Dñ  yBð  &Dð  &Dñ  Eô  Eð  EàÔ5¸Ò9Ð9Ø ŸLšL¨D¬OÐ)wÑ)wÐUYÔUoÐ)wÐ)wÐ)wÑxÔxÐxá$ð !ŸLšL¨D¬OÐ)xÑ)xÐ)xÑyÔyÐyØ9:˜DÔ6ð 26×1NÒ1NÐO`ÐboÑ1pÔ1pÑ.Ø$ŸOšOÑ,>Ñ?Ô?Ð?ñ -TÐ,SÑARÐ,SÑ,SÔ,S™MØ&7Õ&Bð #ð #¡Ù#%¥;Õ#3±}Ð#DÐ#DÞ*.Ñ.hÐ.hÑ.hÐ.hÑ=NÐ.hÑ.hÔ.hÑ*hÔ*h¡Cñ)IÉ#ð )Iñ )Ið )Iñ %0 Kñ 3p¡KØ (§¢Ø,2Ù46µEÙ/:ñ1"ð 1"ñ !#ô !#ð !#ð !#ñ
 %ð 23�DÔ.ð 48×3PÓ3PØ)Õ4ñ4ô 4Ð%Õ0ð 48×3OÓ3OØ)Õ4ñ4ô 4Ð%Õ0ð %)×$AÒ$AÐBSÐUbÑ$cÔ$c�Mð $5Ô#<Ð#BÀ‘LÙ#ð D¨×(KÒ(KÉLÑ(YÔ(Yð DÙ8D˜Ô5ö /8ð 9ñ 9ð 9ñ /ô /Ñ+ö -0ñ 0ð 0ñ 0ð 0à&7Õ&Bð0ñ 0ô 0ñ -ô -Ñ)ñ EV˜ÔAÙ,ð D°×1KÒ1KÑ1MÔ1Mð DØ7;˜DÔ4Ð4Ø!×BÓBÑDÔDð DØ$(×$<Ò$<¹\Ñ$JÔ$J×$PÒ$PÑ$RÔ$R™EÙ$ð DØ $§¢Ñ-B¹5Ð-BÐ-BÑ CÔ CÐ Cð $)‘Là ð,å& x°¤|µTÑ:Ô:ð,ð % RœL×,Ò,Ð-@ÑAÔAð,ð
 !Ÿš™œ˜Ø'+™ð !ð,å& x°¤|µTÑ:Ô:ð,ð % RœL×,Ò,Ð-@ÑAÔAð,ñ $ð 8Ø9:˜Ô6Ø67˜Ô3ð 5:�DÔ1à—O’O MÑ2Ô2Ð2Ø×8Ó8¸ÑGÔGÐGð Õ1ð !ð!Ø ×6Ó6°tÑ<Ô<Ð<Ð<øÝ(ð !ð !ð !Ø ˜Dð!øøøð ×,Ó,Ð->ÀÐJ[Ð]kÑlÔlÐlð
 34Ð/ð 04�DÕ,ñ
 !ZÐ YÐ<MÕ<XÐ YÑ YÔ Y‘IÙ ¡^Ð$4Ò4Ð4ØÔ-×4Ó4Ñ6Ô6Ð6ð  #'Ô"9�KØ"Õ5¸Ò9Ð9ð (3Õ'E™˜æ'EÀhÑ'OÔ'O™àÔ/ð 
4°K×4OÒ4OÑP\Ñ4]Ô4]ð 
4Ø×(Ò(Ñ)FÑGÔGÐGØ9=×9OÒ9OØ$ nØ*.Ô*AÕ*TØ$5ð :Pñ :ô :Ñ6˜Ð"6ð 04Ð,ð .6�DÔ*Ø×*Ò*¨8Ñ4Ô4Ð4ñ ð &7Ô%>Ð%DÀ"�Nð 05�DÔ,ð  ×>Ò>¸~ÑNÔNñ eõ $ DÑ*LÈbÑQÔQÐWÐUWñ *ð  ×>Ò>Ñ?PÑQÔQð "Ù0IÐ-Ø)-×)AÒ)AÑBSÑ)TÔ)T×)ZÒ)ZÑ)\Ô)\™JÝ"ŸKšKñ!>å #¡J¡¤ñô ð ð
 !×-Ò-ñ!4ñô ð ñ .8˜NØ;?˜DÕ8Ù!õ $+¨4Ñ1KÈTÑ#RÔ#R™Ù#ð "­°Ñ6\Ð^cÑ(dÔ(dð "Ù0MÐ-Ý"ŸKšKÑ(yÑzÔzÐzØ ×-Ò-Ñ.}Ñ~Ô~Ð~Ø<@˜DÔ9ØHM˜DÔEØ:;˜DÔ7ð
 .2×-EÒ-EÁhÑ-OÔ-O×-UÒ-UÑ-WÔ-W˜NØ;?˜DÕ8Ù!ö +.ñ .ð .à%-©b¨c¨c¤]ð.ñ .ô .ñ +ô +™ñ
 ,ð!%å$+¨DÑ2LÈeÑ$TÔ$Tð!%ð =A˜DÔ9ð =A˜DÔ9ØHM˜DÔEÝ"ŸKšKñ!9ñô ð ð !×-Ò-ñ!6ñô ð ð *.×)FÒ)FÐGXÐZgÑ)hÔ)h™JÙ4=™J yÑ1Ø$ŸOšO©JÑ7Ô7Ð7Ø$ŸOšOØ(.ñ%Pð-ð -ñ ô ð ñ %õ +/Ý#Ð$5°{ÀDÑIÔIð UÝ&Ð'8Ñ:MÈtÑTÔTðUå&Ð'8Ñ:MÈtÑTÔTñ+ô +™ñ
 +ð %¨tÔ/MÑPQÒ/QÐ/QØ Ð:Ô:¸aÑ?Ð:Ô:Ý"ŸKšKñ!@à $Ô >ñô ð ð
 !×-Ò-ñ!HØ$(Ô$Bð!Hñ !Hð !Hñô ð ð +/×*GÒ*GØ 1°<ñ+ô +˜Kð @D˜KÐ(;Ñ<Ø$ŸOšO¨KÑ8Ô8Ð8Ø5=˜DÔ2Ø ×2Ò2°8Ñ<Ô<Ð<Ù$ð ,0×+CÒ+CØ*ñ,ô ,çš%™'œ'ð("™ñ ,ð DØ $Ô >Á!Ò Cñ +ñ (ð %±ð %ÑDVð %Ð\`Ô\wÐz{Ò\{Ð\{Ø Ð7Ô7¸1Ñ<Ð7Ô7Ý"ŸNšNñ!8à $Ô ;¸T¼Zñô ð ð
 !×-Ò-ñ!EØ$(Ô$?ð!Eñ !Eð !Eñô ð ñ %ñ (ð )¨DÔ,@ð )Ý"ŸNšNñ!Nà $Ô ;¸T¼ZØ $¤ñ	ô ð ð !×-Ò-ñ!Dñô ð ð  $×:Ò:Ñ<Ô<ð )Ø>? Ô ;Ø $× 1Ò 1ñ%9ÀÄð %9ð %9Ø(,¬ð%9ð %9ð %9ñ!"ô !"ð !"õ !'§¢ñ%9à$(¤J°´ñ!"ô !"ð !"ñ
 !)ñ
 -GÐ)Ø)-×)@Ó)@ÐARÑ)SÔ)S™Ø(,×(EÒ(EÐFWÐYfÑ(gÔ(g˜Ù3<˜ iÑ0Ø Ÿš¨Ñ6Ô6Ð6á)ð ÝPSÑTbÑPcÔPcÑfiÒPiÐPi±¸tÁ¸tÔ0DÀuÑ0LÐ0LÑo}Ñ-Ý"ŸNšNñ!0á1Bñô ð ð
 !×-Ò-ñ!Oñô ð ð õ
 #ŸNšNñ!7ð !%Ô ;¸T¼ZØ $¤ñô ð ð !×-Ò-Ù QØ@DÔ@Tð $IÑ#<Ð#<Ù#Hñ!Jñô ð ñ *3˜Ùð 34�DÔ/Ø56�DÔ2ð œÐ):Ò:Ð:Ø Ô1ð ;à3±aÒ7Ð7Ø ×CÓCØ)5Ø.<Ø%-ñ Dñ ô ð 8ð 0°1Ñ4Ð/Ø&*×&CÒ&CÐDUÐWcÑ&dÔ&d˜Ø Ÿš¨Ñ4Ô4Ð4Ø×<Ó<¸[ÑIÔIÐIð %+ñ!Uð(ð (˜ð !Ÿš¨Ñ5Ô5Ð5Ø19˜Ô.Ø×.Ò.¨xÑ8Ô8Ð8Ù à./Ð+à0ð 4Ø)BÀ^Ñ)S˜Ø46Ð1Ø23Ð/ð &*×%=Ò%=¸nÑ%MÔ%M×%SÒ%SÑ%UÔ%U�Nà $× =Ò =Ð>OÐQ^Ñ _Ô _‘Ið !ð'å& x°¤|µTÑ:Ô:ð'ð % RœL×,Ò,Ð-@ÑAÔAð'ð
 !Ÿš™œ˜ð	 !ð'å& x°¤|µTÑ:Ô:ð'ð % RœL×,Ò,Ð-@ÑAÔAð'ð —O’O¡IÑ.Ô.Ð.á(WÀ}Ð(WÐ(WÐ(WÐ%Øœ?ð ~Ø×(Ò(Ñ)|ÈnÐ)|Ñ)|Ð)|Ñ}Ô}Ð}Ùøåð 0ñ 0ð 0ÙbÈÐbÐbÕZ]Ð^_ÑZ`ÔZ`ÐbÐb‘	ð,ÞÑ,¡Ð,Ð,Ñ-Ô-Ð-Ð-øÞ¦Ð,ð ,ð ,ð ,Ý—L’L¡Ñ+Ô+Ð+Ð+Ð+ð,øøøõ —’Ñ?ÀÐZ^‘Ñ_Ô_Ð_õ
 !¥ X¡¤°Ñ!2°B¸Ñ;Ô;ð ð �CØ" 3œ-�CÝ% c­4Ñ0Ô0ð Ø˜Ø—w’w˜v‘”¨&Ò0Ð0Ø Ø—w’w˜v‘”¨+Ò5Ð5¸#¿'º'À,Ñ:OÔ:OÐ5ñ(ð (à%-¨c°A©g¨h¨hÔ%7ð(ñ (ô (™ð
 #& lÔ"3ð 9ð 9™BÙ#%ÐK­Z¹½DÑ-AÔ-AÐKÀ8Ù!¡$œx©|Ð;Ð;à,2Ù46±t´HÙ/SÉ	Ð/SÐ/Sñ+"ð +"¡ð
 !)§¢±Ñ 8Ô 8Ð 8øØð " TÔ%8¸1Ñ%<Ò<Ð<Ù(VÁYÈsÐPRÈsÄ^Ð(VÐ(VÐ(VÐ%Ù%cÑXaÐ%cÐ%c�Nð —O’O¨[À^Ð$TÐ$TÑUÔUÐUØ�E�E�E�Eð =Ð<Ð<Ð<Ð<øøøøðU0øøøð[W  Ô 3Ò3Ð3¸Ô8MÔ8WÐZ[Ò8[Ñ8[Ð`dÔ`wÑ8[ð~X Ð!Ø˜dÔ1Ò1Ð1ØÔ$Ô.°!Ò3Ð3ñ
 !b¸.Ð aÐ aÈ4ÔK^Ð aÐ aÐ aÐØ×Òñ0°nð 0ð 0ÀtÔGZð 0ñ 0ð 0ñô ð ð ”?ð Ø× Ò ð0¸^ð 0ð 0ÈdÔNað 0ñ 0ð 0ñô ð ð "×8Ó8¸À>ÑRÔRˆNð #¨$Ð.ÐW°>ÀDÔDWÒ3W‰	ð 	×Ó˜hÕ(GÈÑ(UÔ(UÑW`ÑaÔaÐað 	×$Ò$Ð%6Ñ7Ô7Ð7ð 	×Ò˜hÐ(<Ñ=Ô=Ð=ð 6>ÐG˜ "œ×)Ò)¨&Ñ1Ô1Ð1À4‰Ø‰Ù˜VÒ#Ð#å˜xÑ(Ô(ð ð �Ø—6’6˜&‘>”> [Ò0Ð0°R·V²V¸LÑ5IÔ5IÐ0Ø˜lÔ+‘DÙð S¥
©4°¬7µDÑ 9Ô 9ð SÙ*.¨r¬(¯,ª,°zÀ2Ñ*FÔ*F×*JÒ*JÈ6Ñ*RÔ*R™Ø�Eøæñ 
ð 
Øð
ñ 
ô 
ñ 
ô 
Ñð ,:Ð@•C˜Ñ'Ô'Ð'¸q‰	Ø59Ô5JÐQ�tÔ,Ô1Ð1ÐPQ‰Ø9=Ô9NÐU�dÔ+Ô5Ð5ÐTU‰ñHñ 	ð
 ˜tœz¨>¸4Ô;NÙ™+Ù™n©iØŒOÐ%˜vð	
‰
ñ ˜VÒ#Ð#¨KÐ#åŒNÙPÙñÙ-ñ.ðñ ðñ -ðð ð ð ð õ ŒK™	Ð/¡JÐ/Ð/Ð/Ð/ð ð 	E +ð 	EðEØJÐJÐJÐJÐJÐJØ�Ù#Ø#œØ!6Ø'5Ý)-¨h©¬Øœ*Ý$ T¨:°tÑ<Ô<ÐBÀññ ô ð ð øõ ð Eð Eð EÝ—’Ñ>ÀÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøð ‰Ý˜HÑ%Ô%ð 	ð 	ˆCØ�wŠw�v‰Œ +Ò-Ð-°#·'²'¸+Ñ2FÔ2FÐ-Ø!$ [Ô!1‘Ø�øð
Ù˜nð
á™nð
ñ ˜ð
ñ ˜ð	
ñ
 ™ð
ñ �uð
ñ ˜;ð
ñ !¥'¨$Ñ0IÈ5Ñ"QÔ"Qð
ð �T”Zð
ñ ˜œð
ñ ˜œð
ñ ˜DÔ5ð
ñ ˜TÔ7ð
ñ   Ô!?ð
ñ ! $Ô"Að
ñ   Ô =ð!
ð" ˜TÔ7ð#
ð$ "&Ô!?Ø Ô5Ý")¨$Ô*AÑCWÐYZÑ"[Ô"[Ð"`Ð_`Ø"&Ô"AØÔ3ØÔ3ñ/
ð 
ð 
‰ð8 ×3Ò3Ñ5Ô5‰Ùð 	6Ù&5‰F‘?Ñ#Ø',ˆÕ$ð ð 	B˜4Ô2ð 	BØ*.Ô*A‰FÑ&Ñ'ð 	×ÒÑÔÐð !%ˆÔð !&ÑØÔ&¨Ò*Ð*ØÔ+¨tÔ/IÒIÐIØ" dÔ&;Ð;Ð;Ø$(Ñ!Ø&'ˆDÔ#ð 	×+Ó+Ø"7Ø)Ø#ñ 	,ñ 	
ô 	
ð 	
ð ð 	 +ð 	Ð3Hð 	ÑLað 	ðØ×-Ó-Ý&*¨8¡n¤nØ"7Ù"7ñ .ñ ô ð ð øõ
 ð ð ð Ø�ðøøøð	BØFÐFÐFÐFÐFÐFØˆLÙ Øœ?Ù#Ø'Ø”jÝ   z°4Ñ8Ô8Ð>¸Bññ ô ð ð øõ ð 	Bð 	Bð 	BÝ�NŠNÑ;¸SÑAÔAÐAÐAÐAÐAÐAÐAøøøøð	Bøøøñ ˆsq  Å-)F Æ
F$Æ#F$Î&8O Ï
O,Ï+O,Ð0Q Ñ
Q4ÑQ/Ñ/Q4Ñ?%R% Ò%
SÒ/SÓSÙD]# Ý#
^Ý-^Þ^à9a á
aáaá'5b â
b*â)b*æ"C-j ê
k êj;ê;k î0oï
oïoð"p9ð9p=ñ p=þAÿAA@,Á@+A@,ÁK(A=AN
 ÁM&"AN
 ÁN
AN#ÁN	AN#ÁN"AN#ÁN'A4B` ÁPA'AR ÁRB` ÁR
ARÁRB` ÁRARÁRU?B` ÁhFB` ÁnAn0 Án/B` Án0AoÁoB` ÁoAoÁoEB` Át&AB` ÁvC>B` ÁzA=B` Á| J9B` ÂF:B0B` ÂI,AB` ÂK	9B` ÂLAB` ÂMA8B` ÂO=B` ÂPJB` ÂZBB\$ Â\#B` Â\$
B\1Â\.B` Â\0B\1Â\1B,B` Â_B_0 Â_/B` Â_0
B_=Â_:B` Â_<B_=Â_=B` Â`BD^Âb;
D^ÂcFD^ÂiK"D^ÂuDD^ÂyAD^Âz*AD^Â|D^Â|>B}Â}D^Â}
B}(Â}%D^Â}'B}(Â}(DD^ÃBA#D^ÃC4G2D^ÃK,M	D^ÃX5D^ÃX;ED^Ã^BD^Ã`%(D^ÃaA-Cb<Ãb;D^Ãb<
Cc	ÃcD^ÃcCc	Ãc	D^ÃcB0D^ÃfD^ÃfB!D^Ãh3A>D^Ãj1D^Ãj7DD^ÃoD^ÃoD^Ão!ID^Ãx<D^ÃyCD^Ã|	B	D^Ã~D^Ã~DD^ÄB.J6D^ÄM$D^ÄM*'D^ÄN4D^ÄOE$D^ÄT5D^ÄT;A(D^ÄV$ DWÄWD^ÄWDWÄWD^ÄWDWÄWD'D^Ä\D^Ä\A>D^Ä^D^Ä`7GFB. ÄhB'Dj9 Äj8FB. Äj9
DkÄkFB. ÄkDkÄkDFB. Äo!Do: Äo9FB. Äo:
DpÄpFB. ÄpDpÄpFB. Äp$Dp2 Äp1FB. Äp2
Dp?Äp<FB. Äp>Dp?Äp?A;FB. Är<A0FB. Ät-K+FB. Å@&FB. ÅAH-FB. ÅI/BFB. ÅK=CFB. ÅOEO)ÅO(FB. ÅO)EP6ÅO92EP1ÅP+FB. ÅP1EP6ÅP6BFB. ÅSA5FB. ÅT;CFB. ÅXHFB. Å`*Ea Åa FB. Åa
EaÅaFB. ÅaEaÅaDFB. ÅeCFB. ÅhB!FB. Åk CFB. ÅnC/FB. År B$FB. Åt&B6FB. ÅwC>FB. Å{B>FB. Å~DFB. ÆB.FJÆB9FJÆCFC'ÆC&FJÆC'.FDÆDFJÆDFDÆDE!FJÆJFJÆT)AFU, ÆU,
FVÆU6FVÆVFVÆ](F^ Æ^
F^Æ^F^Æ^5F_ Æ_
F_8Æ_F_3Æ_3F_8c                 ó@   — |                       ||¬¦  «        }|d         S )a  
        Simple chat interface that returns just the final response.

        Args:
            message (str): User message
            stream_callback: Optional callback invoked with each text delta during streaming.

        Returns:
            str: Final assistant response
        )rŒ	  rO  )rv  )rX   r�  rŒ	  rÊ  s       rZ   rÄ  zAIAgent.chatI1  s(   € ð ×&Ò& wÀÐ&ÑPÔPˆØÐ&Ô'Ð'r\   )<NNNNNNNNr€   rx  ry  NNFFFNrz  r€   NNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNFr3  F)r€   r€   r€   r«   rg   rã  rò  )r€   )NN)rØ  )NNNNN)°rr   rs   rt   ru   rw  r®   rc   rˆ   Úsetterr  r¬   r  r   r­   rð  r   r   r[   ry  r  r‘  r—  rš  rœ  r¤  r¨  ÚBaseExceptionr°  r²  r   rÀ  rŽ  r�  rÉ  ÚtuplerÎ  rÚ   rÛ  r’  r   r¦  Ústaticmethodrô  r�  rû  rÿ  rý  r  r  r  rC  rQ  rU  r�  r‚  r€  ri  rƒ  r‰  rŒ  r�  r�  rŸ  r©  r¼  r¿  r�   r­  rÍ  rÒ  râ  rí  r   r  r  rŽ  r  r"  r$  r&  r1  r4  r:  r<  rG  rx  rM  rT  rW  ry  rf  ri  rœ  rž  r
  r¦  r­  r·  r»  rÒ  rÔ  rB   rC   rA   rã  ræ  rž   r›  ré  ró  r  rÑ  r$  rX  r*  r-  r6  r:  r<  ri  rX  r{  r‡  r�  r’  rŒ  rž  r#   r®  r°  r´  rÜ  rÞ  rà  râ  ræ  rí  rQ  rR  rõ  r–  rƒ  r�  r¢  rª  r®  r²  rÂ  rÕ  rÞ  r‹  rè  rï  rñ  r÷  rù  r:  r(  r'  r_  rc  rN  rk  rp  r�  rƒ  r   r¥  r¬  r×  rë  r¤  r£  r‹	  rv  rÄ  rw   r\   rZ   rp  rp  *  s›  € € € € € ðð ð	Oð +ð
 ð˜#ð ð ð ñ „Xðð „_ð;˜cð ; dð ;ð ;ð ;ñ „_ð;ð ØØØØØ%)ØØ!%ØØ ØØ&*Ø'+Ø"'Ø %Ø Ø'+Ø #ØØ'+Ø'+Ø%)Ø!Ø,1Ø(,ØØ+/Ø(,Ø+/Ø&*Ø'+Ø%)Ø"&Ø*.Ø/3Ø&*Ø$(ØØ+/Ø Ø,0Ø15ØØØØØØØØ#'Ø#(Ø!ØØ!%Ø.2Ø)-ØØ$)Ø(*Ø %ñ{|ð |àð|ð ð|ð ð	|ð
 ð|ð ð|ð �s”)˜dÑ"ð|ð ð|ð �3Œi˜$Ñð|ð ð|ð ð|ð ð|ð ˜sœ)ð|ð   œ9ð|ð  ð|ð  ð!|ð" ð#|ð$ "%ð%|ð& ð'|ð( ð)|ð*   œ9ð+|ð,   œ9ð-|ð. ˜cœð/|ð0 ð1|ð2 &*ð3|ð4 #&ð5|ð6 ð7|ð8 !)ð9|ð: &ð;|ð< !)ð=|ð> $ð?|ð@ %ðA|ðB #ðC|ðD  ðE|ðF  (ðG|ðH %-ðI|ðJ $ðK|ðL "ðM|ðN ðO|ðP ˜s C˜xœ.ðQ|ðR ðS|ðT    S œ>ðU|ðV ˜t C¨ Hœ~Ô.ðW|ðX ðY|ðZ ð[|ð\ ð]|ð^ ð_|ð` ða|ðb ðc|ðd ðe|ðf !ðg|ðh !ði|ðj ðk|ðn ðo|ðp ,ðq|ðr ˜S #˜Xœðs|ðv "ðw|ðx #&ðy|ðz ð{|ð |ð |ð |ð|%%7ð %7ð %7ñNr
ð r
ð r
ð r
ðhð ð ð$ ,1ð *ð *ð * Dð *ð *ð *ð *ð6¨Tð ð ð ð ð&
°$ð 
ð 
ð 
ð 
ðU Cð U¨Dð Uð Uð Uð Uð(V Sð V¨Tð Vð Vð Vð Vð"	E¨Cð 	E°mð 	EÈð 	Eð 	Eð 	Eð 	Eð
 t¨C°¨H¤~ð 
ð 
ð 
ð 
ñð ð ð ñBð ð ð ñ",ð ,¨cð ,¸Tð ,ð ,ð ,ð ,ñ)ð )¨Sð )¸Dð )ð )ð )ð )ð >¨Eð >ð >ð >ð >ð(°u¸UÀD¸[Ô7Ið ð ð ð ð0¸$¸tÀCÈÀH¼~Ô:Nð ÐSXð ð ð ð ðL Dð Lð Lð Lð Lð #'Ø"&Ø"&Ø#ðHð Hð Hð ˜3”-ðHð ˜3”-ð	Hð
 ˜3”-ðHð ˜Œ}ðHð 
ˆt�TˆzÔ	ðHð Hð Hð HðT ð%¨Sð %°Tð %ð %ð %ñ „\ð%ð ð #'ð<ð <ð <Øð<ð ˜3”-ð<ð 
ð	<ð <ð <ñ „\ð<ð"% sð %¨tð %ð %ð %ð %ð%°cð %¸dð %ð %ð %ð %ð.\¨3ð \°3ð \ð \ð \ð \ð| ð	G¨cð 	G°dð 	Gð 	Gð 	Gñ „\ð	GðH¨ð Hð Hð Hð Hð $(ñ	Cð CàðCð ˜4”.ð	Cð
 
ðCð Cð Cð Cð>EeàðEeð ðEeð �t˜C ˜H”~Ô&ð	Eeð
 
ðEeð Eeð Eeð EeðPA°xÀ´}ð Að Að Að AðFV¨sð V°tð Vð Vð Vð VðD	Lð ð	Gð ð4	Gð ð* ð<Ø˜dœð<à˜Tœ
ð<ð 
ˆcŒð<ð <ð <ñ „\ð<ðB $Ø#ñ	lð là œ:ðlð ðlð ð	lð
 
ðlð lð lð lðb '+Ø+/Ø!%Ø&*ðJð Jð Jð ˜s”mðJð $ Cœ=ð	Jð
 ˜#”ðJð ˜s”mðJð 
ˆc�3ˆhŒðJð Jð Jð Jð4*¸TÀ$¼Zð *ÈDð *ð *ð *ð *ñ$Kð K¨¨d¬ð KÈ4ÐPTÌ:ð Kð Kð Kð Kñ0Fð 0F°d¸4´jð 0FÐX\Ð]aÔXbð 0Fð 0Fð 0Fð 0Fðd-¸4À¼:ð -È$ÈtÌ*ð -ð -ð -ð -ð>?°#ð ?ð ?ð ?ð ?ð0c°d¸4ÀÀSÀ¼>Ô6Jð cÐX[ð cÐhlð cÐquÐvzÐ{~ð  ADð  |Dô  wEô  rFð cð cð cð cðJD¨¨d°3¸°8¬nÔ)=ð DÈ3ð DÐ[_ð Dð Dð Dð Dð ð%& Ið %&°#ð %&ð %&ð %&ñ „\ð%&ðN)¨(°3¬-ð )¸HÀS¼Mð )ð )ð )ð )ð¨cð °cð ð ð ð ð4 ð>¨)ð >¸¸SÀ#¸X¼ð >ð >ð >ñ „\ð>ð@¸Cð ÀHÈTÐRUÐWZÐRZÌ^ÔD\ð ð ð ð ð* &*ðPð Pð Pà˜˜c˜”NðPð ð	Pð
 ˜	Ô"ðPð 
�$ŒðPð Pð Pð Pðd ð¨ð °ð ð ð ñ „\ðñ@Dð @D¨$¨t°C¸°H¬~Ô*>ð @Dð @Dð @Dð @DñDBVð BV ð BV°ð BVð BVð BVð BVñH+ð +ð +ð +ðB"˜#ð " $ð "ð "ð "ð "ðH h¨s¤mð ð ð ð ð =
¸Tð =
ÐRUð =
ÐZ^ð =
ð =
ð =
ð =
ð~( Cð (¨Dð (ð (ð (ð (ð
°#ð ¸$ð ð ð ð ð&&ð &ð &ð
 dð 
ð 
ð 
ð 
ñ$ð °ð Àð ð ð ð ñ6
ð 
¨dð 
¸dð 
ð 
ð 
ð 
ð)ð  #ð)ð ð	)ð
 ð)ð 
ð)ð )ð )ð )ñV-ð -ð -ð -ñ^6ð 6ð 6ð 6ðp¨4°°S¸#°X´Ô+?ð ÀDð ð ð ð ð@ ð) ð )ð )ð )ñ „Xð)ñeIð eI°3ð eIÀ#ð eIð eIð eIð eIðV ð+¨ð +ð +ð +ñ „\ð+ð !�yÐ!aÐ!aÐ!aÑbÔbÐàðC¨¨d°3¸°8¬nÔ)=ð CÀ$ÀtÈCÐQTÈHÄ~ÔBVð Cð Cð Cñ „\ðCðJ ð¨Tð °dð ð ð ñ „\ðð< ðG¨Dð G°Tð Gð Gð Gñ „\ðGð"F¨3ð F°3¸±:ð Fð Fð Fð FðP	0ð 	0ð 	0ð ñGð G¨ð G¸ð GÀCð GÐPSð Gð Gð Gñ „\ðGð ð6¨ð 6°°xÀ´}ÀhÈsÄmÐ7SÔ1Tð 6ð 6ð 6ñ „\ð6ð +/ñSð SàðSð # 3œ-ðSð 
ð	Sð Sð Sð Sð/ #ð /ð /ð /ð /ð
 Sð 
ð 
ð 
ð 
ð Y¤_ð ð ð ð ð ð¨ð °ð ð ð ñ „\ðð: ñð ¨sð ¸Cð ð ð ñ „\ðð0Y°4ð YÀCð YÐQUð YÐZ]ð Yð Yð Yð Yðv ð8¨ð 8°ð 8ð 8ð 8ñ „\ð8ðt¨3ð ¸3ð Èð ÐQUð ð ð ð ð0¸ð Àð ð ð ð ð"°sð ¸sð ð ð ð ð D¨4ð Dð Dð Dð DðLW°sð W¸sð Wð Wð Wð WðG°3ð GÀ3ð GÈ4ð Gð Gð Gð Gñ{ð {¨Dð {¸#ð {ÐV^ð {ð {ð {ð {ñzLgð Lg¸Dð LgÈ#ð Lgð Lgð Lgð Lgð\ FJð ð ð ¸dð Èdð ð ð ð ð: EIð !ð !ð !¸Tð !ÈTð !ð !ð !ð !ðF!¸ð !ð !ð !ð !ðF1¸4ð 1ð 1ð 1ð 1ðf=¸3ð =À4ð =ð =ð =ð =ñ2Jð Jð Jð JðF 7;Ø26ðR&ð R&ð R&ð ˜c”]ðR&ð ð	R&ð
 $ NÔ3ðR&ð    S¨# X¤Ô/ðR&ð 
ˆt�TˆzÔ	ðR&ð R&ð R&ð R&ðhD°Tð Dð Dð Dð Dñ
ð ð ð ð(P"°$ð P"ð P"ð P"ð P"ñh3ð 3ð 3ð 3ð°Cð ¸Dð ð ð ð ð ð1¨cð 1°cð 1ð 1ð 1ñ „\ð1ð
	>°Sð 	>¸Tð 	>ð 	>ð 	>ð 	>ðL¸TÀ#ÀsÀ(¼^ð LÐPTð Lð Lð Lð Lð7 sð 7¨tð 7ð 7ð 7ð 7ð(¨#ð °$ð ð ð ð ð°ð ¸ð ð ð ð ð
 tð 
ð 
ð 
ð 
ð ?CðF"ð F"ð F"ØðF"Ø3;ðF"ð F"ð F"ð F"ñT1ð 1Ð-Dð 1ÐPTð 1ð 1ð 1ð 1ðFK¨$ð Kð Kð Kð Kð^ #, )ð -ð -ð -ñ #ô #ÐðNØ"ðNØ47ðNØFIðNà	ðNñ Nð Nð Nðd ð¨#ð °$ð ñ ð ñ „\ðð ñ°Cð ¸EÀ#ÀxÐPTÄ~ÐBUÔ<Vð ñ ð ñ „\ðñ(1Àñ 1È3ð 1ÐSVð 1ñ 1ð 1ð 1ðf*[°Sñ *[Àð *[Èð *[ñ *[ð *[ð *[ñXð  sð ñ ð ð ñ$Àð Èð ñ ð ð ð"
¨$ð 
ñ 
ð 
ð 
ð>M ð Mñ Mð Mð Mñ¸ð Àð ñ ð ð ðB¸Dð ÀTð ñ ð ð ñ8b
¨dð b
°tð b
ñ b
ð b
ð b
ðH#T°ð #Tñ #Tð #Tð #TðJ,°T¸D±[ð ,ñ ,ð ,ð ,ð@[Èð [ÐQUð [ñ [ð [ð [ðz
¨Dð 
ñ 
ð 
ð 
ð
°ð 
ñ 
ð 
ð 
ñ3/¸$ñ 3/Èð 3/ÐRVð 3/ñ 3/ð 3/ð 3/ðj ñ°Tð ¸dð ñ ð ñ „\ðð6 ð Øñ	jð jð jØðjð ð	jð
 
ðjñ jð jñ „\ðjðX2¨Tð 2ñ 2ð 2ð 2ð ^bÑr{ð  QUñ p-ð p-ð p-¨$ð p-Àñ p-ÐWZð p-Ðloñ p-ð  KNð p-ð  Z_ð p-ñ p-ð p-ð p-ñd*ð *¸tñ *ÐX[ñ *Ðmpð *Ðy}ð *ñ *ð *ð *ñ.
°Tð 
¸cð 
ñ 
ð 
ð 
ð( KOñQñ Q¨#ñ Q¸dñ QÐWZð QØ#+¨C¤=ðQØCGðQØSVðQñ Qð Qð Qðf ñ(ñ (˜Sð (¨ñ (°Sð (Àsð (ñ (ð (ñ „\ð(ñ0mKð mKÈ$ñ mKÐcfñ mKÐx{ð mKð  EIð mKñ mKð mKð mKñ^	AOð AOÈ$ñ AOÐcfñ AOÐx{ð AOð  EIð AOñ AOð AOð AOðJb¨tñ bÀSð bÈSð bñ bð bð bðN #Ø59ØØ.2Ø.2ñT5ð T5àðT5ð ðT5ð # 4¨¨S¨¤>Ô2ð	T5ð
 ñT5ð " (Ô+ñT5ð ' sœmðT5ð 
ˆc�3ˆhŒðT5ñ T5ð T5ð T5ñlj(ð (˜Cñ (°(¸8Ô2Dð (ÐPSð (ñ (ð (ð (ð (ð (r\   rp  r€   r1  Fr  rð  r‚  r{  Ú	max_turnsr…  r†  Ú
list_toolsr‡  Úsave_sampleÚverboser‹  c                 óØ  — t          d¦  «         t          d¦  «         |�rÌddlm}m} ddlm}m} t          d¦  «         t          d¦  «         t          d¦  «         t          d	¦  «          |¦   «         }g }g }g }|                     ¦   «         D ]_\  }} ||¦  «        }|rM||f}|d
v r|                     |¦  «         Œ0|dv r|                     |¦  «         ŒJ|                     |¦  «         Œ`t          d¦  «         |D ]X\  }}|d         rd 	                    |d         ¦  «        nd}t          d|d›d|d         › �¦  «         t          d|› �¦  «         ŒYt          d¦  «         |D ]p\  }}|d         rd 	                    |d         ¦  «        nd}t          d|d›d|d         › �¦  «         t          d|› �¦  «         t          d|d         › �¦  «         Œqt          d¦  «         |D ]9\  }}t          d|d›d|d         › �¦  «         t          d|d         › �¦  «         Œ:t          d¦  «          |¦   «         }|                     ¦   «         D ]b\  }}|d         rdnd}t          d |› d!|› d"|d         › �¦  «         |d         s+t          d#d 	                    |d$         ¦  «        › �¦  «         Œc |¦   «         }t          d%t          |¦  «        › d&�¦  «         t          |¦  «        D ]'}t          |¦  «        }t          d'|› d(|› d)�¦  «         Œ(t          d*¦  «         t          d+¦  «         t          d,¦  «         t          d-¦  «         t          d.¦  «         t          d ¦  «         t          d/¦  «         t          d0¦  «         t          d ¦  «         t          d1¦  «         t          d2¦  «         t          d ¦  «         t          d3¦  «         t          d4¦  «         d5S d5}d5}|r1d6„ |                     d7¦  «        D ¦   «         }t          d8|› �¦  «         |r1d9„ |                     d7¦  «        D ¦   «         }t          d:|› �¦  «         |r-t          d;¦  «         t          d<¦  «         t          d=¦  «         	 t          ||||||||
|¬>¦	  «	        } n*# t          $ r}!t          d?|!› �¦  «         Y d5}!~!d5S d5}!~!ww xY w| €d@}"n| }"t          dA|"› �¦  «         t          dB¦  «         |                      |"¦  «        }#t          dB¦  «         t          dC¦  «         t          d¦  «         t          dD|#dE         › �¦  «         t          dF|#dG         › �¦  «         t          dHt          |#dI         ¦  «        › �¦  «         |#dJ         r3t          dK¦  «         t          dL¦  «         t          |#dJ         ¦  «         |	�rt#          t%          j        ¦   «         ¦  «        d5dM…         }$dN|$› dO�}%|                      |#dI         |"|#dE         ¦  «        }&|&t+          j        ¦   «                              ¦   «         ||#dE         |"dPœ}	 t1          |%dQdR¬S¦  «        5 }'|'                     t5          j        |dTdU¬V¦  «        ¦  «         d5d5d5¦  «         n# 1 swxY w Y   t          dW|%› �¦  «         n)# t8          $ r}!t          dX|!› �¦  «         Y d5}!~!nd5}!~!ww xY wt          dY¦  «         d5S )Zaå  
    Main function for running the agent directly.

    Args:
        query (str): Natural language query for the agent. Defaults to Python 3.13 example.
        model (str): Model name to use (OpenRouter format: provider/model). Defaults to anthropic/claude-sonnet-4.6.
        api_key (str): API key for authentication. Uses OPENROUTER_API_KEY env var if not provided.
        base_url (str): Base URL for the model API. Defaults to https://openrouter.ai/api/v1
        max_turns (int): Maximum number of API call iterations. Defaults to 10.
        enabled_toolsets (str): Comma-separated list of toolsets to enable. Supports predefined
                              toolsets (e.g., "research", "development", "safe").
                              Multiple toolsets can be combined: "web,vision"
        disabled_toolsets (str): Comma-separated list of toolsets to disable (e.g., "terminal")
        list_tools (bool): Just list available tools and exit
        save_trajectories (bool): Save conversation trajectories to JSONL files (appends to trajectory_samples.jsonl). Defaults to False.
        save_sample (bool): Save a single trajectory sample to a UUID-named JSONL file for inspection. Defaults to False.
        verbose (bool): Enable verbose logging for debugging. Defaults to False.
        log_prefix_chars (int): Number of characters to show in log previews for tool calls/responses. Defaults to 20.

    Toolset Examples:
        - "research": Web search, extract, crawl + vision tools
    u   ðŸ¤– AI Agent with Tool Callingz2==================================================r   )Úget_all_tool_namesÚget_available_toolsets)Úget_all_toolsetsÚget_toolset_infou    ðŸ“‹ Available Tools & Toolsets:z2--------------------------------------------------u'   
ðŸŽ¯ Predefined Toolsets (New System):z(----------------------------------------)Úwebró  ÚvisionÚcreativerE  )ÚresearchÚdevelopmentrÆ  Úcontent_creationÚ
full_stacku   
ðŸ“Œ Basic Toolsets:Úresolved_toolsr  r  u     â€¢ r‚  z - r¡  z    Tools: u5   
ðŸ“‚ Composite Toolsets (built from other toolsets):Úincludesz    Includes: z    Total tools: r¦	  u!   
ðŸŽ­ Scenario-Specific Toolsets:Ú20u3   
ðŸ“¦ Legacy Toolsets (for backward compatibility):r  u   âœ…u   â�Œr$	  r´  rT  z    Requirements: rC  u   
ðŸ”§ Individual Tools (z available):u     ðŸ“Œ z (from re  u   
ðŸ’¡ Usage Examples:z  # Use predefined toolsetszR  python run_agent.py --enabled_toolsets=research --query='search for Python news'zN  python run_agent.py --enabled_toolsets=development --query='debug this code'zP  python run_agent.py --enabled_toolsets=safe --query='analyze without terminal'z  # Combine multiple toolsetszM  python run_agent.py --enabled_toolsets=web,vision --query='analyze website'z  # Disable toolsetszQ  python run_agent.py --disabled_toolsets=terminal --query='no command execution'z&  # Run with trajectory saving enabledzF  python run_agent.py --save_trajectories --query='your question here'Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS rw   r‚  rC  s     rZ   rË   zmain.<locals>.<listcomp>×1  s    € Ð PÐ PÐ P¨q §¢¡¤Ð PÐ PÐ Pr\   r,  u   ðŸŽ¯ Enabled toolsets: c                 ó6   — g | ]}|                      ¦   «         ‘ŒS rw   r‚  rC  s     rZ   rË   zmain.<locals>.<listcomp>Û1  s    € Ð!RÐ!RÐ!R° !§'¢'¡)¤)Ð!RÐ!RÐ!Rr\   u   ðŸš« Disabled toolsets: u   ðŸ’¾ Trajectory saving: ENABLEDu:      - Successful conversations â†’ trajectory_samples.jsonlu7      - Failed conversations â†’ failed_trajectories.jsonl)	rˆ   r‚  r{  rƒ  r…  r†  r‡  rˆ  r‹  u    â�Œ Failed to initialize agent: zžTell me about the latest developments in Python 3.13 and what new features developers should know about. Please search for current information and try it out.u   
ðŸ“� User Query: z3
==================================================u   ðŸ“‹ CONVERSATION SUMMARYu   âœ… Completed: r«  u   ðŸ“ž API Calls: r£	  u   ðŸ’¬ Messages: r
  rO  u   
ðŸŽ¯ FINAL RESPONSE:z------------------------------r½   Úsample_r&  )Úconversationsrô  r‚  r«  rð  ro  rü  rý  Fr  )r¥  rú  u"   
ðŸ’¾ Sample trajectory saved to: u   
âš ï¸� Failed to save sample: u    
ðŸ‘‹ Agent execution completed!)rÈ  Úmodel_toolsr  r  r¨  r  r  r  rÞ   r  rd   r×  r   rÑ  rp  rÐ  rv  rc   rÛ  rÜ  r¼  r   rØ  r  r'  r_   rÕ   r8  r�   )(rð  r‚  r{  rˆ   rþ
  r…  r†  rÿ
  r‡  r   r  r‹  r  r  r  r  Úall_toolsetsÚbasic_toolsetsÚcomposite_toolsetsÚscenario_toolsetsrp   r|  rµ  r‚  Ú	tools_strÚincludes_strÚlegacy_toolsetsrG  Ú	all_toolsrä   Úenabled_toolsets_listÚdisabled_toolsets_listrG  rA  rª  rÊ  Ú	sample_idÚsample_filenamer²  r  s(                                           rZ   Úmainr"  X1  së  € õH 
Ð
+Ñ,Ô,Ð,Ý	ˆ(�O„O€Oð ñ PØJÐJÐJÐJÐJÐJÐJÐJØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?åÐ0Ñ1Ô1Ð1Ýˆh‰Œˆõ 	Ð8Ñ9Ô9Ð9Ýˆh‰ŒˆØ'Ð'Ñ)Ô)ˆð ˆØÐØÐà)×/Ò/Ñ1Ô1ð 		4ð 		4‰MˆD�'Ø#Ð# DÑ)Ô)ˆDØð 4Ø˜t˜�ØÐQÐQÐQØ"×)Ò)¨%Ñ0Ô0Ð0Ð0ØÐfÐfÐfØ&×-Ò-¨eÑ4Ô4Ð4Ð4à%×,Ò,¨UÑ3Ô3Ð3øõ 	Ð&Ñ'Ô'Ð'Ø(ð 	-ð 	-‰JˆD�$Ø=AÐBRÔ=SÐ_˜Ÿ	š	 $Ð'7Ô"8Ñ9Ô9Ð9ÐY_ˆIÝÐ<˜4Ð<Ð<Ð< t¨MÔ':Ð<Ð<Ñ=Ô=Ð=ÝÐ+ 	Ð+Ð+Ñ,Ô,Ð,Ð,õ 	ÐFÑGÔGÐGØ,ð 	<ð 	<‰JˆD�$Ø:>¸zÔ:JÐV˜4Ÿ9š9 T¨*Ô%5Ñ6Ô6Ð6ÐPVˆLÝÐ<˜4Ð<Ð<Ð< t¨MÔ':Ð<Ð<Ñ=Ô=Ð=ÝÐ1 <Ð1Ð1Ñ2Ô2Ð2ÝÐ: d¨<Ô&8Ð:Ð:Ñ;Ô;Ð;Ð;õ 	Ð2Ñ3Ô3Ð3Ø+ð 	<ð 	<‰JˆD�$ÝÐ<˜4Ð<Ð<Ð< t¨MÔ':Ð<Ð<Ñ=Ô=Ð=ÝÐ: d¨<Ô&8Ð:Ð:Ñ;Ô;Ð;Ð;õ 	ÐDÑEÔEÐEØ0Ð0Ñ2Ô2ˆØ)×/Ò/Ñ1Ô1ð 	Nð 	N‰JˆD�$Ø" ;Ô/Ð:�U�U°UˆFÝÐ=�vÐ=Ð= Ð=Ð=¨¨]Ô(;Ð=Ð=Ñ>Ô>Ð>Ø˜Ô$ð NÝÐL¨4¯9ª9°T¸.Ô5IÑ+JÔ+JÐLÐLÑMÔMÐMøð 'Ð&Ñ(Ô(ˆ	ÝÐF­#¨i©.¬.ÐFÐFÐFÑGÔGÐGÝ 	Ñ*Ô*ð 	:ð 	:ˆIÝ*¨9Ñ5Ô5ˆGÝÐ8˜IÐ8Ð8¨gÐ8Ð8Ð8Ñ9Ô9Ð9Ð9åÐ&Ñ'Ô'Ð'ÝÐ+Ñ,Ô,Ð,ÝÐbÑcÔcÐcÝÐ^Ñ_Ô_Ð_ÝÐ`ÑaÔaÐaÝˆd‰ŒˆÝÐ-Ñ.Ô.Ð.ÝÐ]Ñ^Ô^Ð^Ýˆd‰ŒˆÝÐ$Ñ%Ô%Ð%ÝÐaÑbÔbÐbÝˆd‰ŒˆÝÐ6Ñ7Ô7Ð7ÝÐVÑWÔWÐWØˆð !ÐØ!Ðàð AØ PÐ PÐ4D×4JÒ4JÈ3Ñ4OÔ4OÐ PÑ PÔ PÐÝÐ?Ð(=Ð?Ð?Ñ@Ô@Ð@àð CØ!RÐ!RÐ5F×5LÒ5LÈSÑ5QÔ5QÐ!RÑ!RÔ!RÐÝÐAÐ)?ÐAÐAÑBÔBÐBàð IÝÐ/Ñ0Ô0Ð0ÝÐJÑKÔKÐKÝÐGÑHÔHÐHðÝØØØØ$Ø2Ø4Ø/Ø#Ø-ð

ñ 

ô 

ˆˆøõ ð ð ð ÝÐ4°Ð4Ð4Ñ5Ô5Ð5Øˆˆˆˆˆøøøøðøøøð
 €}ðbð 	ˆ
ð
 ˆ
å	Ð
, 
Ð
,Ð
,Ñ-Ô-Ð-Ý	ˆ/ÑÔÐð ×#Ò# JÑ/Ô/€Få	ˆ/ÑÔÐÝ	Ð
%Ñ&Ô&Ð&Ý	ˆ(�O„O€OÝ	Ð
1˜F ;Ô/Ð
1Ð
1Ñ2Ô2Ð2Ý	Ð
2˜V KÔ0Ð
2Ð
2Ñ3Ô3Ð3Ý	Ð
5�C  zÔ 2Ñ3Ô3Ð
5Ð
5Ñ6Ô6Ð6àÐÔð (ÝÐ&Ñ'Ô'Ð'Ýˆh‰ŒˆÝˆfÐ%Ô&Ñ'Ô'Ð'ð ñ :Ý�œ
™œÑ%Ô% b q bÔ)ˆ	Ø4 IÐ4Ð4Ð4ˆð ×8Ò8Ø�:ÔØØ�;Ôñ
ô 
ˆ
ð (Ý!œ™œ×1Ò1Ñ3Ô3ØØ Ô,Øð
ð 
ˆð	:Ý�o s°WÐ=Ñ=Ô=ð IÀà—’�œ
 5°uÀQÐGÑGÔGÑHÔHÐHðIð Ið Iñ Iô Ið Ið Ið Ið Ið Ið Iøøøð Ið Ið Ið Iõ ÐI¸ÐIÐIÑJÔJÐJÐJøÝð 	:ð 	:ð 	:ÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð	:øøøõ 
Ð
-Ñ.Ô.Ð.Ð.Ð.sT   ÒR! Ò!
SÒ+SÓSÙZ2 Ù+ZÚZ2 ÚZÚZ2 ÚZÚZ2 Ú2
[Ú<[Û[Ú__main__r«   )r%  )Nr€   Nr€   r1  NNFFFFr  )¶ru   rË  r¼  Úconcurrent.futuresr7	  r�  rÇ  rÕ   rØ   r¶  rr   r6  r�   r3	  r;  r
  r”   rº  r­  rž   Útypesr   Úurllib.requestrŠ   rÛ  Útypingr   r   r   r   Úurllib.parser   r	   r
   r_  r   Úfirer   Úpathlibr   r
  r   Úhermes_cli.env_loaderr   Úhermes_cli.timeoutsr   r   r´  Ú__file__ÚparentÚ_project_envÚ_loaded_env_pathsÚ	_env_pathrµ  r  r   r   r   r   Útools.terminal_toolr   r   r   Útools.tool_result_storager   r   Útools.interruptr   r  Útools.browser_toolr   r÷  r   r    Úagent.retry_utilsr!   Úagent.error_classifierr"   r#   Úagent.prompt_builderr$   r%   r&   r'   r(   r)   r  r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   Úagent.context_compressorr4   Úagent.subdirectory_hintsr5   Úagent.prompt_cachingr6   r7   r8   r9   r:   r;   r<   r=   r>   Úagent.usage_pricingr?   r@   Úagent.codex_responses_adapterrA   rÞ  rB   r×  rC   rÚ  rD   Úagent.displayrE   rF   r2	  rG   r<	  rH   rI   rW	  Úagent.trajectoryrJ   rK   rL   r¾  ÚutilsrM   rN   rO   rP   rQ   rS   rc   r‡   r�   r˜   rš   r
  rÍ   rß   rÜ   r6	  ÚcompileÚVERBOSErÀ   rÂ   r­   rÃ   ræ   rÚ   rÝ   rÑ   rú   rý   r	  r  r  r$  rG  rN  rQ  rU  rT  rh  r]  rb  rn  rp  r¬   r"  ÚFirerw   r\   rZ   ú<module>rD     s;
  ððð ð* €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø	ˆÔ	˜8Ñ	$Ô	$€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à ,Ð ,Ð ,Ð ,Ð ,Ð ,ð 5Ð 4Ð 4Ð 4Ð 4Ð 4ðð ð ð ð ð ð ð ð
 ˆÑ Ô €Øˆt�H‰~Œ~Ô$ vÑ-€Ø&Ð&°<È\ÐZÑZÔZÐ Øð KØ&ð Gð Gˆ	Ø�ŠÐ:¸IÑFÔFÐFÐFðGð ‡K‚KÐIÑJÔJÐJðð ð ð ð ð ð ð ð ð ð ð ð NÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø .Ð .Ð .Ð .Ð .Ð .ð NÐ MÐ MÐ MÐ MÐ MÐ MÐ MØ .Ð .Ð .Ð .Ð .Ð .Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø <Ð <Ð <Ð <Ð <Ð <Ø >Ð >Ð >Ð >Ð >Ð >ð ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð tÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sÐ sð.*ð .*ð .*ð .*ð .*ñ .*ô .*ð .*ðb˜X cœ]ð ð ð ð ð h¨s¤mð ¸À¼ð ð ð ð ð&;ð ;ð ;ð ;ð)7ð )7ð )7ð )7ð )7ñ )7ô )7ð )7ð\ "˜	 9 +Ñ.Ô.Ð ð !�yð "ð "ð "ñ ô Ð ð �YÐCÐCÐCÑDÔDÐ ð Ð ð #˜œ
ð		ð „Jñô Ð ð !�b”jÐ!4Ñ5Ô5Ð ð ð ¨ð ð ð ð ð)°$ð )ð )ð )ð )ðX=¨Cð =Àð =ÈÐPTÉð =ð =ð =ð =ð"?˜ð ? dð ?¨tð ?ð ?ð ?ð ?ð �”
Ð-Ñ.Ô.€ð
˜sð  sð ð ð ð ð¨Cð °Dð ð ð ð ðBA¨Dð A°Tð Að Að Að AðH'¨sð '°sð 'ð 'ð 'ð 'ðT^ð ^¨#ð ^¸#ð ^Èð ^ð ^ð ^ð ^ðBA˜3ð A 3ð Að Að Að Að8¨4ð 8°Dð 8ð 8ð 8ð 8ðv0 Tð 0¨dð 0ð 0ð 0ð 0ð
¨3ð °4ð ð ð ð ðT Ð ð˜Tð ð ð ð ð#¨tð #ð #ð #ð #ð2
˜dð 
ð 
ð 
ð 
ðkx(ð kx(ð kx(ð kx(ð kx(ñ kx(ô kx(ð kx(ð^q ØØØØØ Ø!ØØ#ØØØðS/ð S/ØðS/àðS/ð ðS/ð ð	S/ð
 ðS/ð ðS/ð ðS/ð ðS/ð ðS/ð ðS/ð ðS/ð ðS/ð S/ð S/ð S/ðl ˆzÒÐØ€D„Iˆd�O„O€O€O€Oð Ðr\   