§
    ¦¨îiZ ã            	       óN  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZmZ d	Zd
Zd¤d„Z e¦   «          ej                              d e! ee"¦  «        j#        j#        ¦  «        ¦  «         ddl$m%Z% ddl&m'Z'm(Z(m)Z)  e%¦   «         Z*ddl+m,Z, ddl-m.Z. e*dz  Z/ e.e* ee"¦  «         0                    ¦   «         j1        d         dz  ¬¦  «          ej2        d¦  «        Z3ddhZ4e*dz  Z5e5 6                    ¦   «         �rÆ	 ddl7Z8 e9e5d¬¦  «        5 Z: e8j;        e:¦  «        pi Z<ddd¦  «         n# 1 swxY w Y   ddl=m>Z>  e>e<¦  «        Z<e< ?                    ¦   «         D ]1\  Z@ZA eBeAe!eCeDeEf¦  «        re@ejF        vr e!eA¦  «        ejF        e@<   Œ2e< G                    di ¦  «        ZHeHr¹ eBeHeI¦  «        r­i dd“dd“d d!“d"d#“d$d%“d&d'“d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d7“d8d9“d:d;“d<d=“d>d?d@dAœ¥ZJeJ ?                    ¦   «         D ]]\  ZKZLeKeHv rTeHeK         ZAeKdk    r e!eA¦  «        dBv rŒ% eBeAeM¦  «        r ejN        eA¦  «        ejF        eL<   ŒJ e!eA¦  «        ejF        eL<   Œ^e< G                    dCi ¦  «        ZOeO�rs eBeOeI¦  «        �rfdDdEdFdGdHœdIdJdKdLdHœdMdNdOdPdHœdQœZPeP ?                    ¦   «         D �];\  ZQZReO G                    eQi ¦  «        ZS eBeSeI¦  «        sŒ) e!eS G                    dRdS¦  «        ¦  «         T                    ¦   «         ZU e!eS G                    dTdS¦  «        ¦  «         T                    ¦   «         ZV e!eS G                    dUdS¦  «        ¦  «         T                    ¦   «         ZW e!eS G                    dVdS¦  «        ¦  «         T                    ¦   «         ZXeUreUdWk    reUejF        eRdR         <   eVreVejF        eRdT         <   eWreWejF        eRdU         <   eXreXejF        eRdV         <   �Œ=e< G                    dXi ¦  «        ZYeYrÁ eBeYeI¦  «        rµdYeYv r e!eYdY         ¦  «        ejF        dZ<   d[eYv r"d\ejF        vr e!eYd[         ¦  «        ejF        d\<   d]eYv r"d^ejF        vr e!eYd]         ¦  «        ejF        d^<   d_eYv r"d`ejF        vr e!eYd_         ¦  «        ejF        d`<   daeYv r"dbejF        vr e!eYda         ¦  «        ejF        db<   e< G                    dci ¦  «        ZZeZr2 eBeZeI¦  «        r&ddeZv r"deejF        vr e!eZdd         ¦  «        ejF        de<   e< G                    dfdS¦  «        Z[e[r1 eBe[e!¦  «        r%dgejF        vre[ T                    ¦   «         ejF        dg<   e< G                    dhi ¦  «        Z\ eBe\eI¦  «        r<e\ G                    di¦  «        Z]e]�% e!e]¦  «         ^                    ¦   «         ejF        dj<   n# e_$ r Y nw xY w	 ddkl$m`Z` dl ea¦   «         v re<ni  G                    dmi ¦  «        Zb eBebeI¦  «        r!eb G                    dn¦  «        r e`do¬p¦  «         n# e_$ r Y nw xY w	 ddql=mcZc  ec¦   «          n# e_$ r Y nw xY w	 ddrl=mdZd  ed¦   «          n# e_$ r Y nw xY wdsejF        dt<   dsejF        du<   ejF         G                    ddS¦  «        ZeeereedBv r2 ejf        dv¦  «        p e! ejg        ¦   «         ¦  «        ZhehejF        d<   ddwlimjZjmkZkmlZl ddxlmmnZnmoZompZpmqZqmrZrmsZsmtZt ddylumvZv ddzlwmxZxmyZymzZzm{Z{ dd{l|m}Z}m~Z~mZ dd|l€m�Z‚mƒZ„m…Z†  ej‡        eˆ¦  «        Z‰ eŠ¦   «         Z‹deIfd}„ZŒdeIdz  fd~„Z�de!fd„ZŽd€e!deydz  fd�„Z�d‚Z�dƒZ‘d„Z’d…Z“d†Z”d‡Z• e–e� ^                    ¦   «         e‘ ^                    ¦   «         e’ ^                    ¦   «         e“ ^                    ¦   «         e” ^                    ¦   «         e• ^                    ¦   «         h¦  «        Z—dˆee!         deEfd‰„Z˜dŠe!de!dz  fd‹„Z™dŒd�de!fdŽ„ZšdeIfd�„Z›d¥d�eIdz  de!fd‘„ZœdeeMe!                  fd’„Z�d€e!dd“fd”„Zžd•eIdd–fd—„ZŸ G d˜„ d™¦  «        Z d¦d›ej¡        dœeCfd�„Z¢d§d�eek         dŸeEd eeC         deEfd¡„Z£d¢„ Z¤eˆd£k    r e¤¦   «          dS dS )¨a<  
Gateway runner - entry point for messaging platform integrations.

This module provides:
- start_gateway(): Start all configured platform adapters
- GatewayRunner: Main class managing the gateway lifecycle

Usage:
    # Start the gateway
    python -m gateway.run
    
    # Or from CLI
    python cli.py --gateway
é    N)ÚOrderedDict)Úcopy_context©ÚPath©Údatetime)ÚDictÚOptionalÚAnyÚList)Úfetch_account_usageÚrender_account_usage_linesé€   ç      ¬@Úreturnc                  óº  — dt           j        v rdS ddl} |                      ¦   «         }|j        |j        fD ]5}|r1t           j                             |¦  «        r|t           j        d<    dS Œ6	 ddl}| 	                    ¦   «         t           j        d<   dS # t          $ r Y nw xY wdD ]3}t           j                             |¦  «        r|t           j        d<    dS Œ4dS )zBSet SSL_CERT_FILE if the system doesn't expose CA certs to Python.ÚSSL_CERT_FILENr   )z"/etc/ssl/certs/ca-certificates.crtz /etc/pki/tls/certs/ca-bundle.crtz1/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemz/etc/ssl/ca-bundle.pemz/etc/ssl/cert.pemz/etc/pki/tls/cert.pemz#/usr/local/etc/openssl@1.1/cert.pemz&/opt/homebrew/etc/openssl@1.1/cert.pem)ÚosÚenvironÚsslÚget_default_verify_pathsÚcafileÚopenssl_cafileÚpathÚexistsÚcertifiÚwhereÚImportError)r   ÚpathsÚ	candidater   s       ú-/home/div/.hermes/hermes-agent/gateway/run.pyÚ_ensure_ssl_certsr"   0   s  € à�"œ*Ð$Ð$Øˆà€J€J€Jð ×(Ò(Ñ*Ô*€EØ”l EÔ$8Ð9ð ð ˆ	Øð 	�œŸš¨	Ñ2Ô2ð 	Ø*3�BŒJ�Ñ'ØˆFˆFøðØˆˆˆØ&-§m¢m¡o¤o�Œ
�?Ñ#ØˆøÝð ð ð Øˆðøøøð	ð ð ˆ	õ Œ7�>Š>˜)Ñ$Ô$ð 	Ø*3�BŒJ�Ñ'ØˆFˆFð	ðð s   Á.%B Â
B"Â!B")Úget_hermes_home)Úatomic_yaml_writeÚbase_url_host_matchesÚis_truthy_value)Úload_dotenv)Úload_hermes_dotenvz.envé   )Úhermes_homeÚproject_envz=^(?P<host>.+):(?P<container>/[^:]+?)(?::(?P<options>[^:]+))?$z/outputz/outputsúconfig.yamlúutf-8©Úencoding)Ú_expand_env_varsÚterminalÚbackendÚTERMINAL_ENVÚcwdÚTERMINAL_CWDÚtimeoutÚTERMINAL_TIMEOUTÚlifetime_secondsÚTERMINAL_LIFETIME_SECONDSÚdocker_imageÚTERMINAL_DOCKER_IMAGEÚdocker_forward_envÚTERMINAL_DOCKER_FORWARD_ENVÚsingularity_imageÚTERMINAL_SINGULARITY_IMAGEÚmodal_imageÚTERMINAL_MODAL_IMAGEÚdaytona_imageÚTERMINAL_DAYTONA_IMAGEÚssh_hostÚTERMINAL_SSH_HOSTÚssh_userÚTERMINAL_SSH_USERÚssh_portÚTERMINAL_SSH_PORTÚssh_keyÚTERMINAL_SSH_KEYÚcontainer_cpuÚTERMINAL_CONTAINER_CPUÚcontainer_memoryÚTERMINAL_CONTAINER_MEMORYÚcontainer_diskÚTERMINAL_CONTAINER_DISKÚcontainer_persistentÚTERMINAL_CONTAINER_PERSISTENTÚTERMINAL_DOCKER_VOLUMESÚTERMINAL_SANDBOX_DIRÚTERMINAL_PERSISTENT_SHELL)Údocker_volumesÚsandbox_dirÚpersistent_shell)ú.Úautor4   Ú	auxiliaryÚAUXILIARY_VISION_PROVIDERÚAUXILIARY_VISION_MODELÚAUXILIARY_VISION_BASE_URLÚAUXILIARY_VISION_API_KEY)ÚproviderÚmodelÚbase_urlÚapi_keyÚAUXILIARY_WEB_EXTRACT_PROVIDERÚAUXILIARY_WEB_EXTRACT_MODELÚAUXILIARY_WEB_EXTRACT_BASE_URLÚAUXILIARY_WEB_EXTRACT_API_KEYÚAUXILIARY_APPROVAL_PROVIDERÚAUXILIARY_APPROVAL_MODELÚAUXILIARY_APPROVAL_BASE_URLÚAUXILIARY_APPROVAL_API_KEY)ÚvisionÚweb_extractÚapprovalra   Ú rb   rc   rd   r[   ÚagentÚ	max_turnsÚHERMES_MAX_ITERATIONSÚgateway_timeoutÚHERMES_AGENT_TIMEOUTÚgateway_timeout_warningÚHERMES_AGENT_TIMEOUT_WARNINGÚgateway_notify_intervalÚHERMES_AGENT_NOTIFY_INTERVALÚrestart_drain_timeoutÚHERMES_RESTART_DRAIN_TIMEOUTÚdisplayÚbusy_input_modeÚHERMES_GATEWAY_BUSY_INPUT_MODEÚtimezoneÚHERMES_TIMEZONEÚsecurityÚredact_secretsÚHERMES_REDACT_SECRETS)Úapply_ipv4_preferenceÚ_cfgÚnetworkÚ
force_ipv4T©Úforce)Úprint_config_warnings)Úwarn_deprecated_cwd_env_varsÚ1ÚHERMES_QUIETÚHERMES_EXEC_ASKÚMESSAGING_CWD)ÚPlatformÚGatewayConfigÚload_gateway_config)ÚSessionStoreÚSessionSourceÚSessionContextÚbuild_session_contextÚbuild_session_context_promptÚbuild_session_keyÚis_shared_multi_user_session)ÚDeliveryRouter)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚmerge_pending_message_event)Ú%DEFAULT_GATEWAY_RESTART_DRAIN_TIMEOUTÚ!GATEWAY_SERVICE_RESTART_EXIT_CODEÚparse_restart_drain_timeout)Úcanonical_whatsapp_identifierÚexpand_whatsapp_aliasesÚnormalize_whatsapp_identifierc            
      ó–  — ddl m} m} ddlm} 	  | t          j        d¦  «        ¬¦  «        }n~# |$ rP}t                               d|¦  «         t          ¦   «         }|�|cY d}~S t           ||¦  «        ¦  «        |‚d}~wt          $ r}t           ||¦  «        ¦  «        |‚d}~ww xY w|                     d¦  «        |                     d	¦  «        |                     d
¦  «        |                     d¦  «        |                     d¦  «        t          |                     d¦  «        pg ¦  «        |                     d¦  «        dœS )zõResolve provider credentials for gateway-created AIAgent instances.

    If the primary provider fails with an authentication error, attempt to
    resolve credentials using the fallback provider chain from config.yaml
    before giving up.
    r   )Úresolve_runtime_providerÚformat_runtime_provider_error)Ú	AuthErrorÚHERMES_INFERENCE_PROVIDER)Ú	requestedu4   Primary provider auth failed: %s â€” trying fallbackNrd   rc   ra   Úapi_modeÚcommandÚargsÚcredential_pool©rd   rc   ra   r«   r¬   r­   r®   )Úhermes_cli.runtime_providerr¦   r§   Úhermes_cli.authr¨   r   ÚgetenvÚloggerÚwarningÚ_try_resolve_fallback_providerÚRuntimeErrorÚ	ExceptionÚgetÚlist)r¦   r§   r¨   ÚruntimeÚauth_excÚ	fb_configÚexcs          r!   Ú_resolve_runtime_agent_kwargsr¾   >  s¦  € ðð ð ð ð ð ð ð ð *Ð)Ð)Ð)Ð)Ð)ðHØ*Ð*Ý”iÐ ;Ñ<Ô<ð
ñ 
ô 
ˆˆøð ð Rð Rð Rõ 	�ŠÐMÈxÑXÔXÐXÝ2Ñ4Ô4ˆ	ØÐ ØÐÐÐÐÐÐÝÐ8Ð8¸ÑBÔBÑCÔCÈÐQøøøøÝð Hð Hð HÝÐ8Ð8¸Ñ=Ô=Ñ>Ô>ÀCÐGøøøøðHøøøð —;’;˜yÑ)Ô)Ø—K’K 
Ñ+Ô+Ø—K’K 
Ñ+Ô+Ø—K’K 
Ñ+Ô+Ø—;’;˜yÑ)Ô)Ý�W—[’[ Ñ(Ô(Ð.¨BÑ/Ô/Ø"Ÿ;š;Ð'8Ñ9Ô9ðð ð s,   �/ ¯B*´,A?Á B*Á&A?Á?B*ÂB%Â%B*c                  ó~  — ddl m}  	 ddl}t          dz  }|                     ¦   «         sdS t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     d¦  «        p|                     d¦  «        }|sdS t          |t          ¦  «        r|n|g}|D �]t}t          |t          ¦  «        sŒ	  | |                     d	¦  «        |                     d
¦  «        |                     d¦  «        ¬¦  «        }t                               d|                     d	¦  «        ¦  «         |                     d¦  «        |                     d
¦  «        |                     d	¦  «        |                     d¦  «        |                     d¦  «        t          |                     d¦  «        pg ¦  «        |                     d¦  «        dœc S # t          $ r:}	t                               d|                     d	¦  «        |	¦  «         Y d}	~	�Œnd}	~	ww xY wn# t          $ r Y nw xY wdS )zQAttempt to resolve credentials from the fallback_model/fallback_providers config.r   )r¦   Nr,   r-   r.   Úfallback_providersÚfallback_modelra   rc   rd   )rª   Úexplicit_base_urlÚexplicit_api_keyzFallback provider resolved: %sr«   r¬   r­   r®   r¯   zFallback entry %s failed: %s)r°   r¦   ÚyamlÚ_hermes_homer   ÚopenÚ	safe_loadr¸   Ú
isinstancer¹   Údictr³   Úinfor·   Údebug)
r¦   Ú_yÚcfg_pathÚ_fÚcfgÚfbÚfb_listÚentryrº   Úfb_excs
             r!   rµ   rµ   e  s¨  € àDÐDÐDÐDÐDÐDð#ØÐÐÐÝ -Ñ/ˆØ�ŠÑ Ô ð 	Ø�4Ý�( WÐ-Ñ-Ô-ð 	)°Ø—,’,˜rÑ"Ô"Ð( bˆCð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)à�WŠWÐ)Ñ*Ô*ÐG¨c¯gªgÐ6FÑ.GÔ.GˆØð 	Ø�4å" 2¥tÑ,Ô,Ð6�"�"°2°$ˆØð 	ñ 	ˆEÝ˜e¥TÑ*Ô*ð ØðØ2Ð2Ø#Ÿiši¨
Ñ3Ô3Ø&+§i¢i°
Ñ&;Ô&;Ø%*§Y¢Y¨yÑ%9Ô%9ðñ ô �õ
 —’Ð<¸g¿kºkÈ*Ñ>UÔ>UÑVÔVÐVà&Ÿ{š{¨9Ñ5Ô5Ø '§¢¨JÑ 7Ô 7Ø '§¢¨JÑ 7Ô 7Ø '§¢¨JÑ 7Ô 7Ø&Ÿ{š{¨9Ñ5Ô5Ý  §¢¨VÑ!4Ô!4Ð!:¸Ñ;Ô;Ø'.§{¢{Ð3DÑ'EÔ'Eðð ð ð ð øõ ð ð ð Ý—’Ð;¸U¿YºYÀzÑ=RÔ=RÐTZÑ[Ô[Ð[Ø���‘øøøøðøøøð'	øõ, ð ð ð Øˆðøøøàˆ4sj   ˆ"H- ¬H- ½A!ÁH- Á!A%Á%H- Á(A%Á)/H- Â5H- ÃDG%Ç"H- Ç%
H)Ç//H$ÈH- È$H)È)H- È-
H:È9H:c                 ó  — g }t          | dd¦  «        pg }t          | dd¦  «        pg }t          |¦  «        D ]¸\  }}|t          |¦  «        k     r||         nd}|                     d¦  «        st          | dd¦  «        t          j        k    r|                     d|› d�¦  «         Œp|                     d	¦  «        r|                     d
|› d�¦  «         ŒŸ|                     d|› d�¦  «         Œ¹d                     |¦  «        S )ag  Build a text placeholder for media-only events so they aren't dropped.

    When a photo/document is queued during active processing and later
    dequeued, only .text is extracted.  If the event has no caption,
    the media would be silently lost.  This builds a placeholder that
    the vision enrichment pipeline will replace with a real description.
    Ú
media_urlsNÚmedia_typesrp   úimage/Úmessage_typez[User sent an image: ú]úaudio/z[User sent audio: z[User sent a file: Ú
)ÚgetattrÚ	enumerateÚlenÚ
startswithr�   ÚPHOTOÚappendÚjoin)ÚeventÚpartsrÕ   rÖ   ÚiÚurlÚmtypes          r!   Ú_build_media_placeholderrè   �  s*  € ð €EÝ˜ ¨dÑ3Ô3Ð9°r€JÝ˜% °Ñ5Ô5Ð;¸€KÝ˜JÑ'Ô'ð 7ð 7‰ˆˆ3Ø"#¥c¨+Ñ&6Ô&6Ò"6Ð"6�˜A”�¸BˆØ×Ò˜HÑ%Ô%ð 	7­°¸ÈÑ)MÔ)MÕQ\ÔQbÒ)bÐ)bØ�LŠLÐ7°Ð7Ð7Ð7Ñ8Ô8Ð8Ð8Ø×Ò˜hÑ'Ô'ð 	7Ø�LŠLÐ4¨cÐ4Ð4Ð4Ñ5Ô5Ð5Ð5à�LŠLÐ5¨sÐ5Ð5Ð5Ñ6Ô6Ð6Ð6Ø�9Š9�UÑÔÐó    Úsession_keyc                 ó,   — |                       |¦  «        S )z÷Consume and return the full pending event for a session.

    Queued follow-ups must preserve their media metadata so they can re-enter
    the normal image/STT/document preprocessing path instead of being reduced
    to a placeholder string.
    )Úget_pending_message)Úadapterrê   s     r!   Ú_dequeue_pending_eventrî   ¥  s   € ð ×&Ò& {Ñ3Ô3Ð3ré   zStop requestedzSession reset requestedz Execution timed out (inactivity)zSSE client disconnectedzGateway shutting downzGateway restartingÚmessagec                 óÌ   — | sdS d                      t          | ¦  «                             ¦   «                              ¦   «         ¦  «                             ¦   «         }|t
          v S )z?Return True when an interrupt message is internal control flow.FÚ )râ   ÚstrÚstripÚsplitÚlowerÚ_CONTROL_INTERRUPT_MESSAGES)rï   Ú
normalizeds     r!   Ú_is_control_interrupt_messagerø   Â  sV   € àð ØˆuØ—’�#˜g™,œ,×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6Ñ7Ô7×=Ò=Ñ?Ô?€JØÕ4Ð4Ð4ré   Úcommand_namec                 óÖ  — |                       ¦   «                              dd¦  «        }	 ddlm} ddlm}  |¦   «         } |¦   «         D ]”}|                     ¦   «         sŒ|                     d¦  «        D ]g}t          d„ |j	        D ¦   «         ¦  «        rŒ!|j
        j                              ¦   «                              dd¦  «        }||k    r||v r
d| › d	�c c S ŒhŒ•dd
lm} t          t          ¦  «                             ¦   «         j
        j
        }	 ||	dz  ¦  «        }
|
                     ¦   «         r¡|
                     d¦  «        D ]‹}|j
        j                              ¦   «                              dd¦  «        }||k    rQ|j
                             |
¦  «        }t%          |j	        ¦  «        }dd                     |¦  «        › �}d| › d|› d�c S ŒŒn# t(          $ r Y nw xY wdS )zÌCheck if a command matches a known-but-inactive skill.

    Returns a helpful message if the skill exists but is disabled or only
    available as an optional install. Returns None if no match found.
    Ú_Ú-r   )Ú_get_disabled_skill_names)Úget_all_skills_dirszSKILL.mdc              3   ó   K  — | ]}|d v V — Œ	dS ))ú.gitz.githubz.hubN© ©Ú.0Úparts     r!   ú	<genexpr>z+_check_unavailable_skill.<locals>.<genexpr>Ü  s(   è è € ÐVÐV¸t�tÐ:Ð:ÐVÐVÐVÐVÐVÐVré   úThe **zJ** skill is installed but disabled.
Enable it with: `hermes skills config`)Úget_optional_skills_dirzoptional-skillsz	official/ú/zQ** skill is available but not installed.
Install it with: `hermes skills install ú`N)rõ   ÚreplaceÚtools.skills_toolrý   Úagent.skill_utilsrþ   r   ÚrglobÚanyrä   ÚparentÚnameÚhermes_constantsr  r   Ú__file__ÚresolveÚrelative_tor¹   râ   r·   )rù   r÷   rý   rþ   ÚdisabledÚ
skills_dirÚskill_mdr  r  Ú	repo_rootÚoptional_dirÚrelrä   Úinstall_paths                 r!   Ú_check_unavailable_skillr  Ê  s‰  € ð ×#Ò#Ñ%Ô%×-Ò-¨c°3Ñ7Ô7€Jð$Ø?Ð?Ð?Ð?Ð?Ð?Ø9Ð9Ð9Ð9Ð9Ð9Ø,Ð,Ñ.Ô.ˆð .Ð-Ñ/Ô/ð 	ð 	ˆJØ×$Ò$Ñ&Ô&ð ØØ&×,Ò,¨ZÑ8Ô8ð ð �ÝÐVÐVÀxÄ~ÐVÑVÔVÑVÔVð ØØ”Ô+×1Ò1Ñ3Ô3×;Ò;¸CÀÑEÔE�Ø˜:Ò%Ð%¨$°(Ð*:Ð*:ðB ð Bð Bð Bðð ð ð ð øðð 	=Ð<Ð<Ð<Ð<Ð<Ý�‘N”N×*Ò*Ñ,Ô,Ô3Ô:ˆ	Ø.Ð.¨yÐ;LÑ/LÑMÔMˆØ×ÒÑ Ô ð 	Ø(×.Ò.¨zÑ:Ô:ð 
ð 
�Ø”Ô+×1Ò1Ñ3Ô3×;Ò;¸CÀÑEÔE�Ø˜:Ò%Ð%à"œ/×5Ò5°lÑCÔC�CÝ  ¤™OœO�EØ#@¨s¯xªx¸©¬Ð#@Ð#@�LðS ð Sð SØCOðSð Sð Sðð ð ð &øøõ ð ð ð Øˆðøøøàˆ4s   ªB2G ÃC9G ÇG Ç
G&Ç%G&Úplatformr�   c                 ó4   — | t           j        k    rdn| j        S )uN   Map a Platform enum to its config.yaml key (LOCALâ†’"cli", restâ†’enum value).Úcli)r�   ÚLOCALÚvalue©r  s    r!   Ú_platform_config_keyr#  ú  s   € à¥¤Ò.Ð.ˆ5ˆ5°H´NÐBré   c                  ó6  — 	 t           dz  } |                      ¦   «         rEddl}t          | dd¬¦  «        5 }|                     |¦  «        pi cddd¦  «         S # 1 swxY w Y   n3# t
          $ r& t                               dt           dz  ¦  «         Y nw xY wi S )z@Load and parse ~/.hermes/config.yaml, returning {} on any error.r,   r   NÚrr-   r.   z%Could not load gateway config from %s)rÅ   r   rÄ   rÆ   rÇ   r·   r³   rË   )Úconfig_pathrÄ   Úfs      r!   Ú_load_gateway_configr(  ÿ  sô   € ð\Ý" ]Ñ2ˆØ×ÒÑÔð 	/ØˆKˆKˆKÝ�k 3°Ð9Ñ9Ô9ð /¸QØ—~’~ aÑ(Ô(Ð.¨Bð/ð /ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /øøåð \ð \ð \Ý�ŠÐ<½lÈ]Ñ>ZÑ[Ô[Ð[Ð[Ð[ð\øøøà€Is4   ‚4A& ¶AÁA& ÁAÁA& Á!AÁ"A& Á&-BÂBÚconfigc                 ó  — | �| nt          ¦   «         }|                     di ¦  «        }t          |t          ¦  «        r|S t          |t          ¦  «        r,|                     d¦  «        p|                     d¦  «        pdS dS )uÝ   Read model from config.yaml â€” single source of truth.

    Without this, temporary AIAgent instances (e.g. /compress) fall
    back to the hardcoded default which fails when the active provider is
    openai-codex.
    Nrb   Údefaultrp   )r(  r¸   rÈ   rò   rÉ   )r)  rÏ   Ú	model_cfgs      r!   Ú_resolve_gateway_modelr-    s…   € ð Ð&ˆ&ˆ&Õ,@Ñ,BÔ,B€CØ—’˜ Ñ$Ô$€IÝ�)�SÑ!Ô!ð HØÐÝ	�I�tÑ	$Ô	$ð HØ�}Š}˜YÑ'Ô'ÐG¨9¯=ª=¸Ñ+AÔ+AÐGÀRÐGØˆ2ré   c                  óÀ   — ddl } |                      d¦  «        }|r|gS 	 ddl}|j                             d¦  «        �t
          j        ddgS n# t          $ r Y nw xY wdS )us  Resolve the Hermes update command as argv parts.

    Tries in order:
    1. ``shutil.which("hermes")`` â€” standard PATH lookup
    2. ``sys.executable -m hermes_cli.main`` â€” fallback when Hermes is running
       from a venv/module invocation and the ``hermes`` shim is not on PATH

    Returns argv parts ready for quoting/joining, or ``None`` if neither works.
    r   NÚhermesÚ
hermes_cliz-mzhermes_cli.main)ÚshutilÚwhichÚimportlib.utilÚutilÚ	find_specÚsysÚ
executabler·   )r1  Ú
hermes_binÚ	importlibs      r!   Ú_resolve_hermes_binr:    s‘   € ð €M€M€Mà—’˜hÑ'Ô'€JØð Øˆ|ÐðØÐÐÐàŒ>×#Ò# LÑ1Ô1Ð=Ý”N DÐ*;Ð<Ð<ð >øåð ð ð Øˆðøøøð ˆ4s    ,A Á
AÁAzdict | Nonec                 ó
  — |                       d¦  «        }t          |¦  «        dk    rZ|d         dk    rN|d         dk    rB|d         |d         |d	         d
œ}t          |¦  «        dk    r|d         dv r|d         |d<   |S dS )a@  Parse a session key into its component parts.

    Session keys follow the format
    ``agent:main:{platform}:{chat_type}:{chat_id}[:{extra}...]``.
    Returns a dict with ``platform``, ``chat_type``, ``chat_id``, and
    optionally ``thread_id`` keys, or None if the key doesn't match.

    The 6th element is only returned as ``thread_id`` for chat types where
    it is unambiguous (``dm`` and ``thread``).  For group/channel sessions
    the suffix may be a user_id (per-user isolation) rather than a
    thread_id, so we leave ``thread_id`` out to avoid mis-routing.
    ú:é   r   rq   r)   Úmainé   é   é   )r  Ú	chat_typeÚchat_id)ÚdmÚthreadÚ	thread_idN)rô   rÞ   )rê   rä   Úresults      r!   Ú_parse_session_keyrH  7  s›   € ð ×Ò˜cÑ"Ô"€EÝ
ˆ5�z„z�Q‚€˜5 œ8 wÒ.Ð.°5¸´8¸vÒ3EÐ3Eà˜aœØ˜qœØ˜Q”xð
ð 
ˆõ
 ˆu‰:Œ:˜Š>ˆ>˜e AœhÐ*:Ð:Ð:Ø"'¨¤(ˆF�;ÑØˆØˆ4ré   Úevtz
str | Nonec                 óš  — |                       dd¦  «        }|                       dd¦  «        }|                       dd¦  «        }|dk    rd|                       dd	¦  «        › d
�S |dk    rb|                       dd¦  «        }|                       dd	¦  «        }|                       dd¦  «        }d|› d|› d|› d|› �}|r	|d|› d�z  }|d
z  }|S dS )zOFormat a watch pattern event from completion_queue into a [IMPORTANT:] message.ÚtypeÚ
completionÚ
session_idÚunknownr¬   Úwatch_disabledz[IMPORTANT: rï   rp   rÙ   Úwatch_matchÚpatternú?ÚoutputÚ
suppressedr   ú[IMPORTANT: Background process z matched watch pattern "z".
Command: z
Matched output:
z
(z/ earlier matches were suppressed by rate limit)N©r¸   )rI  Úevt_typeÚ_sidÚ_cmdÚ_patÚ_outÚ_supÚtexts           r!   Ú$_format_gateway_process_notificationr^  Q  s  € à�wŠw�v˜|Ñ,Ô,€HØ�7Š7�< Ñ+Ô+€DØ�7Š7�9˜iÑ(Ô(€DàÐ#Ò#Ð#Ø7˜cŸgšg i°Ñ4Ô4Ð7Ð7Ð7Ð7à�=Ò Ð Ø�wŠw�y #Ñ&Ô&ˆØ�wŠw�x Ñ$Ô$ˆØ�wŠw�| QÑ'Ô'ˆð'¨dð 'ð 'Ø#ð'ð 'àð'ð 'ð !%ð'ð 'ð 	ð ð 	PØÐO˜$ÐOÐOÐOÑOˆDØ�‰ˆØˆàˆ4ré   c                   ó8  — e Zd ZU dZi Zeeef         ed<   dZ	eed<   e
Zeed<   dZee         ed<   dZeed	<   dZeed
<   dZeed<   dZeed<   dZeed<   dZeej                 ed<   i Zeeeeef         f         ed<   i Zeeeeef         f         ed<   dödee         fd„Zd÷d„Zdefd„Zedz  Z de!dedefd„Z"deeef         fd„Z#d÷d„Z$dededdfd„Z%dededdfd„Z&d÷d „Z'd÷d!„Z(e)defd"„¦   «         Z*e)defd#„¦   «         Z+e)dee         fd$„¦   «         Z,e)dee         fd%„¦   «         Z-d&e.defd'„Z/dddd(œd&ee.         d)ee         d*ee0         de1ee0f         fd+„Z2d,ed-ed.e0de0fd/„Z3d0e4ddfd1„Z5d2eddfd3„Z6defd4„Z7defd5„Z8defd6„Z9defd7„Z:d)ed8d9d0eddfd:„Z;d)ed0ed;ed9         ded9         fd<„Z<dd=œd)ed0edefd>„Z=død?ee         d@ee         ddfdA„Z>ddddBœdedCee         dDee         dEee         ddf
dF„Z?e@deAeeef                  fdG„¦   «         ZBe@defdH„¦   «         ZCe@de0dz  fdI„¦   «         ZDe@dJede1eef         fdK„¦   «         ZEdddLœd&ee.         d)ee         de0dz  fdM„ZFd)edNee0         ddfdO„ZGe@dedz  fdP„¦   «         ZHe@defdQ„¦   «         ZIe@defdR„¦   «         ZJe@defdS„¦   «         ZKe@defdT„¦   «         ZLe@de0fdU„¦   «         ZMe@deNe0z  dz  fdV„¦   «         ZOdeeef         fdW„ZPd)edXeQddfdY„ZRdXeQd)edefdZ„ZSd[ede1eeef         ef         fd\„ZTd2eddfd]„ZUd÷d^„ZVd_eeef         ddfd`„ZWdaeddfdb„ZXdcZYddZZdee[ddfdf„Z\defdg„Z]d)eddfdh„Z^d÷di„Z_dddjœdkedledefdm„Z`defdn„Zadùdpefdq„Zbd÷dr„Zcddddsœdteduedveddfdw„Zdd÷dx„Zede!dedee4         fdy„Zfd&e.defdz„Zgdee!         defd{„ZhdXeQdee         fd|„ZidXeQd&e.d}eAeeef                  dee         fd~„Zjded€efd�„Zkdefd‚„ZldXeQdefdƒ„ZmdXeQdefd„„ZndXeQdefd…„ZodXeQdefd†„ZpdXeQdefd‡„ZqdXeQdefdˆ„ZrdXeQdefd‰„ZsdXeQdefdŠ„ZtdXeQdefd‹„ZudXeQdee         fdŒ„ZvdXeQdefd�„ZwdXeQdefdŽ„ZxdXeQdefd�„ZydXeQdefd�„Zze@dXeQdee         fd‘„¦   «         Z{dXeQdefd’„Z|dXeQdefd“„Z}dXeQdefd”„Z~deddfd•„Zd–ed—ed˜efd™„Z€	 dúdXeQdšed›eNdœedef
d�„Z�dXeQdžeddfdŸ„Z‚dšedXeQddfd „ZƒdXeQdefd¡„Z„dXeQdefd¢„Z…d£ed&d¤d¥eddfd¦„Z†dXeQdefd§„Z‡dXeQdefd¨„ZˆdXeQdefd©„Z‰dXeQdefdª„ZŠdXeQdefd«„Z‹dXeQdefd¬„ZŒdXeQdefd­„Z�dXeQdefd®„ZŽdXeQdefd¯„Z�dXeQdefd°„Z�dXeQdefd±„Z‘doZ’dXeQdee         fd²„Z“dXeQdefd³„Z” e•e!j–        e!j—        e!j˜        e!j™        e!jš        e!j›        e!jœ        e!j�        e!jž        e!jŸ        e!j         e!j¡        e!j¢        e!j£        e!j¤        e!j¥        e!j¦        e!j§        h¦  «        Z¨dXeQdefd´„Z©dXeQdefdµ„Zªd÷d¶„Z«	 	 	 dûdºed»ed[eddfd¼„Z¬defd½„Z­d÷d¾„Z®d¿e¯deNfdÀ„Z°dÁeNddfdÂ„Z±dÃ„ Z²dÄedÅeAe         defdÆ„Z³dÄedÇeAe         defdÈ„Z´dÉe0fdÊ„ZµdËedÉe0ddfdÌ„Z¶dÍe0ddfdÎ„Z·dcZ¸e@d-edÏe0dÐeNdÑedef
dÒ„¦   «         Z¹d)ed-ed.e0de1fdÓ„Zºd)edÔedefdÕ„Z»ddÖœd)ed€ee         defd×„Z¼d)eddfdØ„Z½d)edefdÙ„Z¾dÚdÛœd)ed2edefdÜ„Z¿d)edÝedefdÞ„ZÀd0ed)edÝedz  ddfdß„ZÁdàdáœd)ed&e.dâedãedäeddfdå„ZÂd)eddfdæ„ZÃe@daedçeddfdè„¦   «         ZÄdaeddfdé„ZÅd÷dê„ZÆdefdë„ZÇdee         fdì„ZÈ	 	 	 düdíedîed}eAeeef                  d&d¤dïed)ed€ee         dðee         deeef         fdñ„ZÉ	 	 	 	 	 dýdíedîed}eAeeef                  d&e.dïed)ed€ee         dóedðee         dôee         deeef         fdõ„ZÊdS )þÚGatewayRunnerz�
    Main gateway controller.

    Manages the lifecycle of all platform adapters and routes
    messages to/from the agent.
    Ú_running_agents_tsÚ	interruptÚ_busy_input_modeÚ_restart_drain_timeoutNÚ
_exit_codeFÚ	_drainingÚ_restart_requestedÚ_restart_task_startedÚ_restart_detachedÚ_restart_via_serviceÚ
_stop_taskÚ_session_model_overridesÚ_session_reasoning_overridesr)  c           
      óþ  ‡— |pt          ¦   «         | _        i | _        |                      ¦   «          |                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _	        |  
                    ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        |                      ¦   «         | _        ddlmŠ t1          | j        j        | j        ˆfd„¬¦  «        | _        t7          | j        ¦  «        | _        d| _        t=          j        ¦   «         | _         d| _!        d| _"        d | _#        d | _$        d| _%        d| _&        d| _'        d| _(        d| _)        d | _*        i | _+        i | _,        i | _-        i | _.        i | _/        i | _0        dd l1}te          ¦   «         | _3        | 4                    ¦   «         | _5        i | _6        i | _7        i | _8        i | _9        i | _:        	 ddl;m<}  |d¬¦  «         n# tz          $ r Y nw xY wd | _>        	 ddl?m@}  |¦   «         | _>        n2# tz          $ r%}t‚           B                    d	|¦  «         Y d }~nd }~ww xY w| j>        �ï	 dd
lCmD}  |¦   «          E                    d¦  «        pi }| E                    dd¦  «        r€| j>         F                    t�          | E                    dd¦  «        ¦  «        t�          | E                    dd¦  «        ¦  «        t‘          | E                    dd¦  «        ¦  «        ¬¦  «         n2# tz          $ r%}t‚           B                    d|¦  «         Y d }~nd }~ww xY wddlImJ}	  |	¦   «         | _K        ddlLmM}
  |
¦   «         | _N        |  O                    ¦   «         | _P        t£          ¦   «         | _R        d S )Nr   ©Úprocess_registryc                 ó.   •— ‰                      | ¦  «        S ©N)Úhas_active_for_session)Úkeyrp  s    €r!   ú<lambda>z(GatewayRunner.__init__.<locals>.<lambda>˜  s   ø€ Ð0@×0WÒ0WÐX[Ñ0\Ô0\€ ré   )Úhas_active_processes_fnF)Úensure_installed)Úlog_failures©Ú	SessionDBz&SQLite session store not available: %s©Úload_configÚsessionsÚ
auto_pruneÚretention_dayséZ   Úmin_interval_hoursé   Úvacuum_after_pruneT)r  r�  Úvacuumz%state.db auto-maintenance skipped: %s)ÚPairingStore)ÚHookRegistry)Sr’   r)  ÚadaptersÚ'_warn_if_docker_media_delivery_is_riskyÚ_load_prefill_messagesÚ_prefill_messagesÚ_load_ephemeral_system_promptÚ_ephemeral_system_promptÚ_load_reasoning_configÚ_reasoning_configÚ_load_service_tierÚ_service_tierÚ_load_show_reasoningÚ_show_reasoningÚ_load_busy_input_moderc  Ú_load_restart_drain_timeoutrd  Ú_load_provider_routingÚ_provider_routingÚ_load_fallback_modelÚ_fallback_modelÚtools.process_registryrp  r“   Úsessions_dirÚsession_storerš   Údelivery_routerÚ_runningÚasyncioÚEventÚ_shutdown_eventÚ_exit_cleanlyÚ_exit_with_failureÚ_exit_reasonre  rf  rg  rh  ri  rj  rk  Ú_running_agentsra  Ú_pending_messagesÚ_queued_eventsÚ_busy_ack_tsÚ_session_run_generationÚ	threadingr   Ú_agent_cacheÚLockÚ_agent_cache_lockrl  rm  Ú_pending_approvalsÚ_failed_platformsÚ_update_prompt_pendingÚtools.tirith_securityrw  r·   Ú_session_dbÚhermes_staterz  r³   rË   Úhermes_cli.configr|  r¸   Úmaybe_auto_prune_and_vacuumÚintÚboolÚgateway.pairingr…  Úpairing_storeÚgateway.hooksr†  ÚhooksÚ_load_voice_modesÚ_voice_modeÚsetÚ_background_tasks)Úselfr)  Ú
_threadingrw  rz  ÚeÚ_load_full_configÚ	_sess_cfgr½   r…  r†  rp  s              @r!   Ú__init__zGatewayRunner.__init__ƒ  s�  ø€ ØÐ5Õ 3Ñ 5Ô 5ˆŒØ=?ˆŒØ×4Ò4Ñ6Ô6Ð6ð "&×!<Ò!<Ñ!>Ô!>ˆÔØ(,×(JÒ(JÑ(LÔ(LˆÔ%Ø!%×!<Ò!<Ñ!>Ô!>ˆÔØ!×4Ò4Ñ6Ô6ˆÔØ#×8Ò8Ñ:Ô:ˆÔØ $× :Ò :Ñ <Ô <ˆÔØ&*×&FÒ&FÑ&HÔ&HˆÔ#Ø!%×!<Ò!<Ñ!>Ô!>ˆÔØ#×8Ò8Ñ:Ô:ˆÔð 	<Ð;Ð;Ð;Ð;Ð;Ý)ØŒKÔ$ d¤kØ$\Ð$\Ð$\Ð$\ð
ñ 
ô 
ˆÔõ  .¨d¬kÑ:Ô:ˆÔØˆŒÝ&œ}™œˆÔØ"ˆÔØ"'ˆÔØ+/ˆÔØ)-ˆŒØˆŒØ"'ˆÔØ%*ˆÔ"Ø!&ˆÔØ$)ˆÔ!Ø26ˆŒð 02ˆÔØ46ˆÔØ13ˆÔð >@ˆÔØ.0ˆÔØ79ˆÔ$ð 	'Ð&Ð&Ð&Ý7B±}´}ˆÔØ!+§¢Ñ!2Ô!2ˆÔð DFˆÔ%ð HJˆÔ)ð >@ˆÔð BDˆÔð 8:ˆÔ#ð	Ø>Ð>Ð>Ð>Ð>Ð>ØÐ¨%Ð0Ñ0Ô0Ð0Ð0øÝð 	ð 	ð 	ØˆDð	øøøð  ˆÔð	FØ.Ð.Ð.Ð.Ð.Ð.Ø(˜y™{œ{ˆDÔÐøÝð 	Fð 	Fð 	FÝ�LŠLÐAÀ1ÑEÔEÐEÐEÐEÐEÐEÐEøøøøð	Føøøð ÔÐ'ð
KØNÐNÐNÐNÐNÐNØ.Ð.Ñ0Ô0×4Ò4°ZÑ@Ô@ÐFÀB�	Ø—=’= ¨uÑ5Ô5ð ØÔ$×@Ò@Ý'*¨9¯=ª=Ð9IÈ2Ñ+NÔ+NÑ'OÔ'OÝ+.¨y¯}ª}Ð=QÐSUÑ/VÔ/VÑ+WÔ+WÝ# I§M¢MÐ2FÈÑ$MÔ$MÑNÔNð Añ ô ð øøõ
 ð Kð Kð KÝ—’ÐDÀcÑJÔJÐJÐJÐJÐJÐJÐJøøøøðKøøøð 	1Ð0Ð0Ð0Ð0Ð0Ø)˜\™^œ^ˆÔð 	/Ð.Ð.Ð.Ð.Ð.Ø!�\‘^”^ˆŒ
ð ,0×+AÒ+AÑ+CÔ+CˆÔõ '*¡e¤eˆÔÐÐsC   È>I É
IÉIÉ)I? É?
J.Ê	J)Ê)J.Ê9B;M5 Í5
N$Í?NÎN$r   c                 óº  — t          j        dd¦  «                             ¦   «                              ¦   «         dk    rdS | j                             ¦   «         }d„ |D ¦   «         }|sdS t          j        dd¦  «                             ¦   «         }g }|rc	 t          j        |¦  «        }t          |t          ¦  «        rd„ |D ¦   «         }n,# t          $ r t                               dd	¬
¦  «         Y nw xY wd}|D ]A}t                               |¦  «        }|sŒ|                     d¦  «        }	|	t           v rd	} nŒB|rdS t                               d¦  «         dS )a�  Warn when Docker-backed gateways lack an explicit export mount.

        MEDIA delivery happens in the gateway process, so paths emitted by the model
        must be readable from the host. A plain container-local path like
        `/workspace/report.txt` or `/output/report.txt` often exists only inside
        Docker, so users commonly need a dedicated export mount such as
        `host-dir:/output`.
        r3   rp   ÚdockerNc                 ó\   — g | ])}|t           j        t           j        t           j        hv¯'|‘Œ*S r  )r�   r   Ú
API_SERVERÚWEBHOOK©r  Úps     r!   ú
<listcomp>zIGatewayRunner._warn_if_docker_media_delivery_is_risky.<locals>.<listcomp>  s3   € ÐxÐxÐx Q°qÅÄÕQYÔQdÕfnÔfvÐ@wÐ7wÐ7w˜qÐ7wÐ7wÐ7wré   rT   c                 óV   — g | ]&}t          |t          ¦  «        ¯t          |¦  «        ‘Œ'S r  )rÈ   rò   ©r  Úvs     r!   rÌ  zIGatewayRunner._warn_if_docker_media_delivery_is_risky.<locals>.<listcomp>(  s-   € ÐLÐLÐL¨!½ÀAÅsÑ9KÔ9KÐL�s 1™vœvÐLÐLÐLré   zACould not parse TERMINAL_DOCKER_VOLUMES for gateway media warningT©Úexc_infoFÚ	containeraF  Docker backend is enabled for the messaging gateway but no explicit host-visible output mount (for example '/home/user/.hermes/cache/documents:/output') is configured. This is fine if the model already emits host-visible paths, but MEDIA file delivery can fail for container-local paths like '/workspace/...' or '/output/...'.)r   r²   ró   rõ   r)  Úget_connected_platformsÚjsonÚloadsrÈ   r¹   r·   r³   rË   Ú_DOCKER_VOLUME_SPEC_REÚmatchÚgroupÚ$_DOCKER_MEDIA_OUTPUT_CONTAINER_PATHSr´   )
r¿  Ú	connectedÚmessaging_platformsÚraw_volumesÚvolumesÚparsedÚhas_explicit_output_mountÚspecr×  Úcontainer_paths
             r!   rˆ  z5GatewayRunner._warn_if_docker_media_delivery_is_risky  s©  € õ Œ9�^ RÑ(Ô(×.Ò.Ñ0Ô0×6Ò6Ñ8Ô8¸HÒDÐDØˆFà”K×7Ò7Ñ9Ô9ˆ	ØxÐx¨)ÐxÑxÔxÐØ"ð 	ØˆFå”iÐ 9¸2Ñ>Ô>×DÒDÑFÔFˆØˆØð 	qðqÝœ KÑ0Ô0�Ý˜f¥dÑ+Ô+ð MØLÐL¨vÐLÑLÔL�GøøÝð qð qð qÝ—’Ð`Ðko�ÑpÔpÐpÐpÐpðqøøøð %*Ð!Øð 	ð 	ˆDÝ*×0Ò0°Ñ6Ô6ˆEØð ØØ"Ÿ[š[¨Ñ5Ô5ˆNØÕ!EÐEÐEØ,0Ð)Ø�ð Fð %ð 	ØˆFå�ŠðPñ	
ô 	
ð 	
ð 	
ð 	
s   Â5C Ã&C4Ã3C4c                 óL   — 	 ddl m}  |d¦  «        duS # t          $ r Y dS w xY w)z3Check if the hermes-agent-setup skill is installed.r   )Ú_find_skillzhermes-agent-setupNF)Útools.skill_manager_toolrã  r·   )r¿  rã  s     r!   Ú_has_setup_skillzGatewayRunner._has_setup_skillD  sQ   € ð	Ø<Ð<Ð<Ð<Ð<Ð<Ø�;Ð3Ñ4Ô4¸DÐ@Ð@øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚ •
#¢#zgateway_voice_mode.jsonr  rC  c                 ó   — |j         › d|› �S )z6Return a platform-namespaced key for voice mode state.r<  ©r!  )r¿  r  rC  s      r!   Ú
_voice_keyzGatewayRunner._voice_keyP  s   € à”.Ð,Ð, 7Ð,Ð,Ð,ré   c                 óˆ  — 	 t          j        | j                             ¦   «         ¦  «        }n$# t          t           j        t          f$ r i cY S w xY wt          |t          ¦  «        si S h d£}i }| 	                    ¦   «         D ]>\  }}||vrŒ
t          |¦  «        }d|vrt                               d|¦  «         Œ9|||<   Œ?|S )N>   ÚallÚoffÚ
voice_onlyr<  z}Skipping legacy unprefixed voice mode key %r during migration. Re-enable voice mode on that chat to rebuild the prefixed key.)rÔ  rÕ  Ú_VOICE_MODE_PATHÚ	read_textÚFileNotFoundErrorÚJSONDecodeErrorÚOSErrorrÈ   rÉ   Úitemsrò   r³   r´   )r¿  ÚdataÚvalid_modesrG  rC  Úmodert  s          r!   r»  zGatewayRunner._load_voice_modesT  sï   € ð	Ý”:˜dÔ3×=Ò=Ñ?Ô?Ñ@Ô@ˆDˆDøÝ!¥4Ô#7½ÐAð 	ð 	ð 	ØˆIˆIˆIð	øøøõ ˜$¥Ñ%Ô%ð 	ØˆIà2Ð2Ð2ˆØˆØ!ŸZšZ™\œ\ð 	ð 	‰MˆG�TØ˜;Ð&Ð&ØÝ�g‘,”,ˆCà˜#ˆ~ˆ~Ý—’ðUàñô ð ð
 ØˆF�3‰KˆKØˆs   ‚+. ®AÁAc                 ó  — 	 | j         j                             dd¬¦  «         | j                              t	          j        | j        d¬¦  «        ¦  «         d S # t          $ r&}t           	                    d|¦  «         Y d }~d S d }~ww xY w)NT)ÚparentsÚexist_okr?  )ÚindentzFailed to save voice modes: %s)
rí  r  ÚmkdirÚ
write_textrÔ  Údumpsr¼  rñ  r³   r´   )r¿  rÁ  s     r!   Ú_save_voice_modeszGatewayRunner._save_voice_modesn  s­   € ð	@ØÔ!Ô(×.Ò.°tÀdÐ.ÑKÔKÐKØÔ!×,Ò,Ý”
˜4Ô+°AÐ6Ñ6Ô6ñô ð ð ð øõ ð 	@ð 	@ð 	@Ý�NŠNÐ;¸QÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøs   ‚AA Á
BÁ"BÂBr  c                 ó,  — t          |dd¦  «        }t          |t          ¦  «        sdS |rT|                     |¦  «         t          |dd¦  «        }t          |t          ¦  «        r|                     |¦  «         dS dS |                     |¦  «         dS )zBUpdate an adapter's in-memory auto-TTS suppression set if present.Ú_auto_tts_disabled_chatsNÚ_auto_tts_enabled_chats©rÜ   rÈ   r½  ÚaddÚdiscard)r¿  rí   rC  r  Údisabled_chatsÚenabled_chatss         r!   Ú_set_adapter_auto_tts_disabledz,GatewayRunner._set_adapter_auto_tts_disabledw  s«   € å  Ð*DÀdÑKÔKˆÝ˜.­#Ñ.Ô.ð 	ØˆFØð 	,Ø×Ò˜wÑ'Ô'Ð'å# GÐ-FÈÑMÔMˆMÝ˜-­Ñ-Ô-ð /Ø×%Ò% gÑ.Ô.Ð.Ð.Ð.ð/ð /ð ×"Ò" 7Ñ+Ô+Ð+Ð+Ð+ré   Úenabledc                 ó,  — t          |dd¦  «        }t          |t          ¦  «        sdS |rT|                     |¦  «         t          |dd¦  «        }t          |t          ¦  «        r|                     |¦  «         dS dS |                     |¦  «         dS )zÕUpdate an adapter's per-chat auto-TTS opt-in set if present.

        Used for ``/voice on``/``/voice tts`` where the user explicitly wants
        auto-TTS even when ``voice.auto_tts`` is False globally.
        r   Nrÿ  r  )r¿  rí   rC  r  r  r  s         r!   Ú_set_adapter_auto_tts_enabledz+GatewayRunner._set_adapter_auto_tts_enabled…  s­   € õ   Ð)BÀDÑIÔIˆÝ˜-­Ñ-Ô-ð 	ØˆFØð 	+Ø×Ò˜gÑ&Ô&Ð&å$ WÐ.HÈ$ÑOÔOˆNÝ˜.­#Ñ.Ô.ð 0Ø×&Ò& wÑ/Ô/Ð/Ð/Ð/ð0ð 0ð ×!Ò! 'Ñ*Ô*Ð*Ð*Ð*ré   c                 óv  ‡— t          |dd¦  «        }t          |t          ¦  «        sdS t          |dd¦  «        }t          |dd¦  «        }t          |t          ¦  «        st          |t          ¦  «        sdS 	 ddlm}  |¦   «         }t          |                     d¦  «        pi                      dd	¦  «        ¦  «        }n# t          $ r d	}Y nw xY wt          |d
¦  «        r||_
        |j        › d�Št          |t          ¦  «        rL|                     ¦   «          |                     ˆfd„| j                             ¦   «         D ¦   «         ¦  «         t          |t          ¦  «        rN|                     ¦   «          |                     ˆfd„| j                             ¦   «         D ¦   «         ¦  «         dS dS )ae  Restore persisted /voice state into a live platform adapter.

        Populates three fields from config + ``self._voice_mode``:
          - ``_auto_tts_default``: global default from ``voice.auto_tts``
          - ``_auto_tts_enabled_chats``: chats with mode ``voice_only``/``all``
          - ``_auto_tts_disabled_chats``: chats with mode ``off``
        r  Nrÿ  r   r   r{  ÚvoiceÚauto_ttsFÚ_auto_tts_defaultr<  c              3   ó‚   •K  — | ]9\  }}|d k    ¯|                      ‰¦  «        ¯ |t          ‰¦  «        d…         V — Œ:dS )rë  N©rß   rÞ   ©r  rt  rõ  Úprefixs      €r!   r  zBGatewayRunner._sync_voice_mode_state_to_adapter.<locals>.<genexpr>¸  sX   øè è € ð "ð "Ù&/ c¨4Ø˜5’=�= S§^¢^°FÑ%;Ô%;�=ð •C˜‘K”K�L�LÔ!Ø �=�=�=ð"ð "ré   c              3   ó~   •K  — | ]7\  }}|d v ¯	|                      ‰¦  «        ¯|t          ‰¦  «        d…         V — Œ8dS ))rì  rê  Nr  r  s      €r!   r  zBGatewayRunner._sync_voice_mode_state_to_adapter.<locals>.<genexpr>¾  s_   øè è € ð !ð !Ù&/ c¨4ØÐ0Ð0Ð0°S·^²^ÀFÑ5KÔ5KÐ0ð •C˜‘K”K�L�LÔ!Ø0Ð0Ð0Ð0ð!ð !ré   )rÜ   rÈ   r�   r½  r³  r|  r¶  r¸   r·   Úhasattrr  r!  ÚclearÚupdater¼  rò  )	r¿  rí   r  r  r  rÂ  Ú	_full_cfgr  r  s	           @r!   Ú!_sync_voice_mode_state_to_adapterz/GatewayRunner._sync_voice_mode_state_to_adapter—  s"  ø€ õ ˜7 J°Ñ5Ô5ˆÝ˜(¥HÑ-Ô-ð 	ØˆFå  Ð*DÀdÑKÔKˆÝ Ð)BÀDÑIÔIˆÝ˜.­#Ñ.Ô.ð 	µzÀ-ÕQTÑ7UÔ7Uð 	ØˆFð	&ØJÐJÐJÐJÐJÐJØ)Ð)Ñ+Ô+ˆIÝ $Ø—’˜wÑ'Ô'Ð-¨2×2Ò2°:¸uÑEÔEñ!ô !ÐÐøõ ð 	&ð 	&ð 	&Ø %ÐÐÐð	&øøøå�7Ð/Ñ0Ô0ð 	:Ø(9ˆGÔ%à”NÐ%Ð%Ð%ˆÝ�n¥cÑ*Ô*ð 	Ø× Ò Ñ"Ô"Ð"Ø×!Ò!ð "ð "ð "ð "Ø37Ô3C×3IÒ3IÑ3KÔ3Kð"ñ "ô "ñ ô ð õ �m¥SÑ)Ô)ð 	Ø×ÒÑ!Ô!Ð!Ø× Ò ð !ð !ð !ð !Ø37Ô3C×3IÒ3IÑ3KÔ3Kð!ñ !ô !ñ ô ð ð ð ð	ð 	s   Á9AC ÃCÃCc              ƒ   óº   K  — 	 |                      ¦   «         ƒ d{V —† dS # t          $ r0}t                               d|�|j        nd|¦  «         Y d}~dS d}~ww xY w)uÓ  Call adapter.disconnect() defensively, swallowing any error.

        Used when adapter.connect() failed or raised â€” the adapter may
        have allocated partial resources (aiohttp.ClientSession, poll
        tasks, child subprocesses) that would otherwise leak and surface
        as "Unclosed client session" warnings at process exit.

        Must tolerate partial-init state and never raise, since callers
        use it inside error-handling blocks.
        Nz7Defensive %s disconnect after failed connect raised: %srí   )Ú
disconnectr·   r³   rË   r!  )r¿  rí   r  rÁ  s       r!   Ú_safe_adapter_disconnectz&GatewayRunner._safe_adapter_disconnectÃ  sœ   è è € ð	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	Ý�LŠLØIØ"*Ð"6�”�¸IØñô ð ð ð ð ð ð ð øøøøð	øøøs   „   
Aª%AÁAc                 ó   — | j         S rr  )r¡  ©r¿  s    r!   Úshould_exit_cleanlyz!GatewayRunner.should_exit_cleanly×  s   € àÔ!Ð!ré   c                 ó   — | j         S rr  )r¢  r  s    r!   Úshould_exit_with_failurez&GatewayRunner.should_exit_with_failureÛ  s   € àÔ&Ð&ré   c                 ó   — | j         S rr  )r£  r  s    r!   Úexit_reasonzGatewayRunner.exit_reasonß  s   € àÔ Ð ré   c                 ó   — | j         S rr  )re  r  s    r!   Ú	exit_codezGatewayRunner.exit_codeã  s
   € àŒÐré   Úsourcec           	      ó<  — t          | d¦  «        rL| j        �E	 | j                             |¦  «        }t          |t          ¦  «        r|r|S n# t
          $ r Y nw xY wt          | dd¦  «        }t          |t          |dd¦  «        t          |dd¦  «        ¬¦  «        S )	zUResolve the current session key for a source, honoring gateway config when available.r›  Nr)  Úgroup_sessions_per_userTÚthread_sessions_per_userF©r&  r'  )r  r›  Ú_generate_session_keyrÈ   rò   r·   rÜ   r˜   )r¿  r$  rê   r)  s       r!   Ú_session_key_for_sourcez%GatewayRunner._session_key_for_sourceç  sÃ   € å�4˜Ñ)Ô)ð 	¨dÔ.@Ð.LðØ"Ô0×FÒFÀvÑNÔN�Ý˜k­3Ñ/Ô/ð '°Kð 'Ø&Ð&øøÝð ð ð Ø�ðøøøå˜˜x¨Ñ.Ô.ˆÝ ØÝ$+¨FÐ4MÈtÑ$TÔ$TÝ%,¨VÐ5OÐQVÑ%WÔ%Wð
ñ 
ô 
ð 	
s   ™2A Á
AÁA©r$  rê   Úuser_configrê   r,  c          	      ó8  — |}|s+|�)	 |                       |¦  «        }n# t          $ r d}Y nw xY wt          |¦  «        }|r| j                             |¦  «        nd}|rÕ|                     d|¦  «        }|                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        dœ}|                     d¦  «        r7t
                               d|pd	|||                     d¦  «        ¦  «         ||fS t
                               d
|pd	||¦  «         nTt
                               d|pd	|| j        r.t          | j                             ¦   «         ¦  «        dd…         nd¦  «         t          ¦   «         }	|r|r|  
                    |||	¦  «        \  }}	|sb|	                     d¦  «        rM	 ddlm}
  |
|	d         ¦  «        }|r"t
                               d||	d         ¦  «         n# t          $ r Y nw xY w||	fS )a$  Resolve model/runtime for a session, honoring session-scoped /model overrides.

        If the session override already contains a complete provider bundle
        (provider/api_key/base_url/api_mode), prefer it directly instead of
        resolving fresh global runtime state first.
        Nrb   ra   rd   rc   r«   ©ra   rd   rc   r«   zZSession model override (fast): session=%s config_model=%s -> override_model=%s provider=%srp   z[Session model override (no api_key, fallback): session=%s config_model=%s override_model=%szFNo session model override: session=%s config_model=%s override_keys=%sr=  z[]r   )Úget_default_model_for_provideru8   No model configured â€” defaulting to %s for provider %s)r*  r·   r-  rl  r¸   r³   rË   r¹   Úkeysr¾   Ú_apply_session_model_overrideÚhermes_cli.modelsr/  rÊ   )r¿  r$  rê   r,  Úresolved_session_keyrb   ÚoverrideÚoverride_modelÚoverride_runtimeÚruntime_kwargsr/  s              r!   Ú_resolve_session_agent_runtimez,GatewayRunner._resolve_session_agent_runtime÷  s±  € ð  +ÐØ#ð 	,¨Ð(:ð,Ø'+×'CÒ'CÀFÑ'KÔ'KÐ$Ð$øÝð ,ð ,ð ,Ø'+Ð$Ð$Ð$ð,øøøõ ' {Ñ3Ô3ˆØNbÐl�4Ô0×4Ò4Ð5IÑJÔJÐJÐhlˆØð 	Ø%Ÿ\š\¨'°5Ñ9Ô9ˆNà$ŸLšL¨Ñ4Ô4Ø#Ÿ<š<¨	Ñ2Ô2Ø$ŸLšL¨Ñ4Ô4Ø$ŸLšL¨Ñ4Ô4ð	 ð  Ðð  ×#Ò# IÑ.Ô.ð 8Ý—’ØpØ(Ð.¨B°°~Ø$×(Ò(¨Ñ4Ô4ñô ð ð
 &Ð'7Ð7Ð7õ �LŠLØmØ$Ð*¨¨E°>ñô ð ð õ
 �LŠLØXØ$Ð*¨¨EØBFÔB_Ði•�TÔ2×7Ò7Ñ9Ô9Ñ:Ô:¸2¸A¸2Ô>Ð>Ðeiñô ð õ 7Ñ8Ô8ˆØð 	Ð,ð 	Ø$(×$FÒ$FØ$ e¨^ñ%ô %Ñ!ˆE�>ð ð 
	˜×+Ò+¨JÑ7Ô7ð 
	ð	ØLÐLÐLÐLÐLÐLØ6Ð6°~ÀjÔ7QÑRÔR�Øð Ý—K’KØRØ˜~¨jÔ9ñô ð øøõ ð ð ð Ø�ðøøøð �nÐ$Ð$s   ˆ ž-¬-Ç;H È
HÈHÚuser_messagerb   r7  c                 óD  — ddl m} |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        t          |                     d¦  «        pg ¦  «        |                     d	¦  «        d
œ}||||d         |d         |d         |d         t	          |d         ¦  «        fdœ}t          | dd¦  «        }|sd|d<   |S 	  ||d         ¦  «        }n# t          $ r d}Y nw xY w||d<   |S )a2  Build the effective model/runtime config for a single turn.

        Always uses the session's primary model/provider.  If `/fast` is
        enabled and the model supports Priority Processing / Anthropic fast
        mode, attach `request_overrides` so the API call is marked
        accordingly.
        r   )Úresolve_fast_mode_overridesrd   rc   ra   r«   r¬   r­   r®   r¯   )rb   rº   Ú	signaturer�  NÚrequest_overridesrb   )r2  r;  r¸   r¹   ÚtuplerÜ   r·   )	r¿  r9  rb   r7  r;  rº   ÚrouteÚservice_tierÚ	overridess	            r!   Ú_resolve_turn_agent_configz(GatewayRunner._resolve_turn_agent_configA  so  € ð 	BÐAÐAÐAÐAÐAð &×)Ò)¨)Ñ4Ô4Ø&×*Ò*¨:Ñ6Ô6Ø&×*Ò*¨:Ñ6Ô6Ø&×*Ò*¨:Ñ6Ô6Ø%×)Ò)¨)Ñ4Ô4Ý˜×+Ò+¨FÑ3Ô3Ð9°rÑ:Ô:Ø-×1Ò1Ð2CÑDÔDð
ð 
ˆð ØàØ˜
Ô#Ø˜
Ô#Ø˜
Ô#Ø˜	Ô"Ý�g˜f”oÑ&Ô&ðð
ð 
ˆõ ˜t _°dÑ;Ô;ˆØð 	Ø)-ˆEÐ%Ñ&ØˆLð	Ø3Ð3°E¸'´NÑCÔCˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøà%.ˆÐ!Ñ"Øˆs   Ã7D	 Ä	DÄDrí   c              ƒ   óR  K  — t                                d|j        j        |j        pd|j        pd¦  «         |                      |j        j        |j        rdnd|j        |j        ¬¦  «         | j         	                    |j        ¦  «        }||u rƒ	 | 
                    ¦   «         ƒ d{V —† | j                             |j        d¦  «         | j        | j        _        n6# | j                             |j        d¦  «         | j        | j        _        w xY w|j        r€| j        j         	                    |j        ¦  «        }|rZ|j        | j        vrL|dt!          j        ¦   «         d	z   d
œ| j        |j        <   t                                d|j        j        ¦  «         | j        st| j        sm|j        pd| _        |j        r"d| _        t                                d¦  «         nt                                d¦  «         |                      ¦   «         ƒ d{V —† dS | j        sˆ| j        rƒ|j        rK|j        pd| _        d| _        t                                d¦  «         |                      ¦   «         ƒ d{V —† dS t                                dt/          | j        ¦  «        ¦  «         dS dS dS )zÑReact to an adapter failure after startup.

        If the error is retryable (e.g. network blip, DNS failure), queue the
        platform for background reconnection instead of giving up permanently.
        zFatal %s adapter error (%s): %srN  úunknown errorÚretryingÚfatal©Úplatform_stateÚ
error_codeÚerror_messageNr   é   ©r)  ÚattemptsÚ
next_retryz%%s queued for background reconnectionz#All messaging adapters disconnectedTzSNo connected messaging platforms remain. Shutting down gateway for service restart.zGNo connected messaging platforms remain. Shutting down gateway cleanly.z4All messaging platforms failed with retryable errorszuAll messaging platforms failed with retryable errors. Shutting down gateway for service restart (systemd will retry).zSNo connected messaging platforms remain, but %d platform(s) queued for reconnection)r³   Úerrorr  r!  Úfatal_error_codeÚfatal_error_messageÚ_update_platform_runtime_statusÚfatal_error_retryabler‡  r¸   r  Úpoprœ  r)  Ú	platformsr®  ÚtimeÚ	monotonicrÊ   r£  r¢  Ústopr´   rÞ   )r¿  rí   ÚexistingÚplatform_configs       r!   Ú_handle_adapter_fatal_errorz)GatewayRunner._handle_adapter_fatal_errorm  s  è è € õ 	�ŠØ-ØÔÔ"ØÔ$Ð1¨	ØÔ'Ð:¨?ñ		
ô 	
ð 	
ð 	×,Ò,ØÔÔ"Ø)0Ô)FÐS˜:˜:ÈGØÔ/Ø!Ô5ð	 	-ñ 	
ô 	
ð 	
ð ”=×$Ò$ WÔ%5Ñ6Ô6ˆØ�wÐÐð>Ø×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*à”×!Ò! 'Ô"2°DÑ9Ô9Ð9Ø04´�Ô$Ô-Ð-øð ”×!Ò! 'Ô"2°DÑ9Ô9Ð9Ø04´�Ô$Ô-Ð=Ð=Ð=Ð=ð Ô(ð 	Ø"œkÔ3×7Ò7¸Ô8HÑIÔIˆOØð 	 7Ô#3¸4Ô;QÐ#QÐ#Qà-Ø !Ý"&¤.Ñ"2Ô"2°RÑ"7ð<ð <�Ô& wÔ'7Ñ8õ
 —’Ø;ØÔ$Ô*ñô ð ð
 Œ}ð 	 TÔ%;ð 	Ø 'Ô ;Ð dÐ?dˆDÔØÔ,ð hØ*.�Ô'Ý—’ÐrÑsÔsÐsÐså—’ÐfÑgÔgÐgØ—)’)‘+”+ÐÐÐÐÐÐÐÐÐØ”ð 	 4Ô#9ð 	ð Ô,ð Ø$+Ô$?Ð$yÐCy�Ô!Ø*.�Ô'Ý—’ðVñô ð ð —i’i‘k”kÐ!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!å—’ØiÝ˜Ô.Ñ/Ô/ñô ð ð ð ð	ð 	ð 	ð 	s   ÂC Ã3DÚreasonc                 óT   — d| _         || _        | j                             ¦   «          d S ©NT)r¡  r£  r   r½  )r¿  r\  s     r!   Ú_request_clean_exitz!GatewayRunner._request_clean_exit°  s-   € Ø!ˆÔØ"ˆÔØÔ× Ò Ñ"Ô"Ð"Ð"Ð"ré   c                 ó*   — t          | j        ¦  «        S rr  )rÞ   r¤  r  s    r!   Ú_running_agent_countz"GatewayRunner._running_agent_countµ  s   € Ý�4Ô'Ñ(Ô(Ð(ré   c                 ó   — | j         rdndS )NÚrestartÚshutdown©rg  r  s    r!   Ú_status_action_labelz"GatewayRunner._status_action_label¸  s   € Ø Ô3ÐCˆyˆy¸ÐCré   c                 ó   — | j         rdndS )NÚ
restartingúshutting downre  r  s    r!   Ú_status_action_gerundz#GatewayRunner._status_action_gerund»  s   € Ø#Ô6ÐKˆ|ˆ|¸OÐKré   c                 ó&   — | j         o
| j        dk    S )NÚqueue)rg  rc  r  s    r!   Ú_queue_during_drain_enabledz)GatewayRunner._queue_during_drain_enabled¾  s   € ØÔ&ÐK¨4Ô+@ÀGÒ+KÐKré   Úqueued_eventrœ   c                 óØ   — |€dS t          |dd¦  «        }|€dS t          | dd¦  «        }|€	i }|| _        ||v r+|                     |g ¦  «                             |¦  «         dS |||<   dS )z6Append a /queue event to the FIFO chain for a session.Nr¥  r¦  )rÜ   r¦  Ú
setdefaultrá   )r¿  rê   rn  rí   Úpending_slotÚqueued_eventss         r!   Ú_enqueue_fifozGatewayRunner._enqueue_fifoÌ  s“   € àˆ?ØˆFÝ˜wÐ(;¸TÑBÔBˆØÐØˆFÝ Ð&6¸Ñ=Ô=ˆØÐ ØˆMØ"/ˆDÔØ˜,Ð&Ð&Ø×$Ò$ [°"Ñ5Ô5×<Ò<¸\ÑJÔJÐJÐJÐJà(4ˆL˜Ñ%Ð%Ð%ré   Úpending_eventc                 óR  — t          | dd¦  «        }|s|S |                     |¦  «        }|s|S |                     d¦  «        }|s|                     |d¦  «         |€|S |�t          |d¦  «        r||j        |<   n*|                     |g ¦  «                             d|¦  «         |S )aY  Promote the next overflow item after the slot was drained.

        Called at the drain site after _dequeue_pending_event consumed
        (or failed to consume) the slot.  If there's an overflow item:
          - When pending_event is None (slot was empty), return the
            overflow head as the new pending_event.
          - When pending_event already exists (slot was populated by an
            interrupt follow-up or similar), stage the overflow head in
            the slot so the NEXT recursion picks it up.
        Returns the (possibly updated) pending_event for drain to use.
        r¦  Nr   r¥  )rÜ   r¸   rT  r  r¥  rp  Úinsert)r¿  rê   rí   rt  rr  ÚoverflowÚnext_queueds          r!   Ú_promote_queued_eventz#GatewayRunner._promote_queued_eventÜ  sÒ   € õ"   Ð&6¸Ñ=Ô=ˆØð 	!Ø Ð Ø ×$Ò$ [Ñ1Ô1ˆØð 	!Ø Ð Ø—l’l 1‘o”oˆØð 	1Ø×Ò˜k¨4Ñ0Ô0Ð0ØÐ ØÐØÐ¥7¨7Ð4GÑ#HÔ#HÐØ5@ˆGÔ% kÑ2Ð2ð ×$Ò$ [°"Ñ5Ô5×<Ò<¸QÀÑLÔLÐLØÐré   ©rí   c                ó¦   — t          | dd¦  «        pi }t          |                     |g ¦  «        ¦  «        }|�|t          |di ¦  «        v r|dz  }|S )u=   Total pending /queue items for a session â€” slot + overflow.r¦  Nr¥  r)   )rÜ   rÞ   r¸   )r¿  rê   rí   rr  Údepths        r!   Ú_queue_depthzGatewayRunner._queue_depthÿ  sb   € å Ð&6¸Ñ=Ô=ÐCÀˆÝ�M×%Ò% k°2Ñ6Ô6Ñ7Ô7ˆØÐ ;µ'¸'ÐCVÐXZÑ2[Ô2[Ð#[Ð#[Ø�Q‰JˆEØˆré   Úgateway_stater!  c                 ó‚   — 	 ddl m}  |||| j        |                      ¦   «         ¬¦  «         d S # t          $ r Y d S w xY w)Nr   ©Úwrite_runtime_status)r~  r!  Úrestart_requestedÚactive_agents)Úgateway.statusr�  rg  ra  r·   )r¿  r~  r!  r�  s       r!   Ú_update_runtime_statusz$GatewayRunner._update_runtime_status  s|   € ð		Ø;Ð;Ð;Ð;Ð;Ð;Ø Ð Ø+Ø'Ø"&Ô"9Ø"×7Ò7Ñ9Ô9ð	ñ ô ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚,0 °
>½>rG  rH  rI  rJ  c                óT   — 	 ddl m}  |||||¬¦  «         d S # t          $ r Y d S w xY w)Nr   r€  )r  rH  rI  rJ  )r„  r�  r·   )r¿  r  rH  rI  rJ  r�  s         r!   rR  z-GatewayRunner._update_platform_runtime_status  sm   € ð		Ø;Ð;Ð;Ð;Ð;Ð;Ø Ð Ø!Ø-Ø%Ø+ð	ñ ô ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ ™
'¦'c                  ó|  — t          j        dd¦  «        } | sŠ	 ddl}t          dz  }|                     ¦   «         rVt          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     dd¦  «        } n# t          $ r Y nw xY w| sg S t          | ¦  «         
                    ¦   «         }|                     ¦   «         s
t          |z  }|                     ¦   «         st                               d	|¦  «         g S 	 t          |d
d¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   t!          |t"          ¦  «        st                               d|¦  «         g S |S # t          $ r(}t                               d||¦  «         g cY d}~S d}~ww xY w)a  Load ephemeral prefill messages from config or env var.
        
        Checks HERMES_PREFILL_MESSAGES_FILE env var first, then falls back to
        the prefill_messages_file key in ~/.hermes/config.yaml.
        Relative paths are resolved from ~/.hermes/.
        ÚHERMES_PREFILL_MESSAGES_FILErp   r   Nr,   r-   r.   Úprefill_messages_filez#Prefill messages file not found: %sr%  z3Prefill messages file must contain a JSON array: %sz+Failed to load prefill messages from %s: %s)r   r²   rÄ   rÅ   r   rÆ   rÇ   r¸   r·   r   Ú
expanduserÚis_absoluter³   r´   rÔ  ÚloadrÈ   r¹   )	Ú	file_pathrÌ   rÍ   rÎ   rÏ   r   r'  ró  rÁ  s	            r!   r‰  z$GatewayRunner._load_prefill_messages&  sY  € õ ”IÐ<¸bÑAÔAˆ	Øð 		ðØ!Ð!Ð!Ð!Ý'¨-Ñ7�Ø—?’?Ñ$Ô$ð EÝ˜h°Ð9Ñ9Ô9ð 5¸RØ Ÿlšl¨2Ñ.Ô.Ð4°"˜ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5à #§¢Ð(?ÀÑ DÔ D�IøøÝð ð ð Ø�ðøøøàð 	ØˆIÝ�I‰Œ×)Ò)Ñ+Ô+ˆØ×ÒÑ!Ô!ð 	'Ý $Ñ&ˆDØ�{Š{‰}Œ}ð 	Ý�NŠNÐ@À$ÑGÔGÐGØˆIð		Ý�d˜C¨'Ð2Ñ2Ô2ð $°aÝ”y ‘|”|�ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $å˜d¥DÑ)Ô)ð Ý—’ÐTÐVZÑ[Ô[Ð[Ø�	ØˆKøÝð 	ð 	ð 	Ý�NŠNÐHÈ$ÐPQÑRÔRÐRØˆIˆIˆIˆIˆIˆIøøøøð	øøøs}   ™3B ÁA0Á$B Á0A4Á4B Á7A4Á8B Â
BÂBÄF	 Ä)E
Ä>F	 Å
EÅF	 ÅEÅ4F	 ÆF	 Æ	
F;ÆF6Æ0F;Æ6F;c                  óœ  — t          j        dd¦  «        } | r| S 	 ddl}t          dz  }|                     ¦   «         r~t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «                             d	d¦  «        pd                     ¦   «         S n# t          $ r Y nw xY wdS )
zÌLoad ephemeral system prompt from config or env var.
        
        Checks HERMES_EPHEMERAL_SYSTEM_PROMPT env var first, then falls back to
        agent.system_prompt in ~/.hermes/config.yaml.
        ÚHERMES_EPHEMERAL_SYSTEM_PROMPTrp   r   Nr,   r-   r.   rq   Úsystem_prompt)
r   r²   rÄ   rÅ   r   rÆ   rÇ   r¸   ró   r·   )ÚpromptrÌ   rÍ   rÎ   rÏ   s        r!   r‹  z+GatewayRunner._load_ephemeral_system_promptL  s.  € õ ”Ð;¸RÑ@Ô@ˆØð 	ØˆMð	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð UÝ˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1àŸš ¨Ñ,Ô,×0Ò0°À"ÑEÔEÐKÈ×RÒRÑTÔTÐTðUøõ ð 	ð 	ð 	ØˆDð	øøøàˆrs6   ›3B< ÁA2Á&B< Á2A6Á6B< Á9A6Á:A B< Â<
C	ÃC	c                  ó  — ddl m}  d}	 ddl}t          dz  }|                     ¦   «         r‹t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t          |                     di ¦  «                             d	d¦  «        pd¦  «         	                    ¦   «         }n# t          $ r Y nw xY w | |¦  «        }|r1| 	                    ¦   «         r|€t                               d
|¦  «         |S )zÚLoad reasoning effort from config.yaml.

        Reads agent.reasoning_effort from config.yaml. Valid: "none",
        "minimal", "low", "medium", "high", "xhigh". Returns None to use
        default (medium).
        r   )Úparse_reasoning_effortrp   Nr,   r-   r.   rq   Úreasoning_effortz5Unknown reasoning_effort '%s', using default (medium))r  r“  rÄ   rÅ   r   rÆ   rÇ   rò   r¸   ró   r·   r³   r´   )r“  ÚeffortrÌ   rÍ   rÎ   rÏ   rG  s          r!   r�  z$GatewayRunner._load_reasoning_configa  sk  € ð 	<Ð;Ð;Ð;Ð;Ð;Øˆð	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð ]Ý˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1å˜SŸWšW W¨bÑ1Ô1×5Ò5Ð6HÈ"ÑMÔMÐSÐQSÑTÔT×ZÒZÑ\Ô\�øøÝð 	ð 	ð 	ØˆDð	øøøà'Ð'¨Ñ/Ô/ˆØð 	\�f—l’l‘n”nð 	\¨¨Ý�NŠNÐRÐTZÑ[Ô[Ð[Øˆs5   Š3B8 ½A!ÁB8 Á!A%Á%B8 Á(A%Á)AB8 Â8
CÃCÚraw_argsc                 ó°  — ddl }t          | pd¦  «                             ¦   «                              dd¦  «        }|sdS 	  |j        |¦  «        }n$# t
          $ r |                     ¦   «         }Y nw xY wd}g }|D ] }|dk    rd	}Œ|                     |¦  «         Œ!d
                     |¦  «                             ¦   «                              ¦   «         |fS )zÕParse `/reasoning` args into `(value, persist_global)`.

        `/reasoning <level>` is session-scoped by default. `--global` may be
        supplied in any position to persist the change to config.yaml.
        r   Nrp   u   â€”z--)rp   FFz--globalTrñ   )	Úshlexrò   ró   r
  rô   Ú
ValueErrorrá   râ   rõ   )r–  r˜  r]  ÚtokensÚpersist_globalÚvalue_tokensÚtokens          r!   Ú_parse_reasoning_command_argsz+GatewayRunner._parse_reasoning_command_argsy  sþ   € ð 	ˆˆˆå�8�>˜rÑ"Ô"×(Ò(Ñ*Ô*×2Ò2°5¸$Ñ?Ô?ˆØð 	Ø�9ð	"Ø �U”[ Ñ&Ô&ˆFˆFøÝð 	"ð 	"ð 	"Ø—Z’Z‘\”\ˆFˆFˆFð	"øøøð ˆØˆØð 	+ð 	+ˆEØ˜
Ò"Ð"Ø!%��à×#Ò# EÑ*Ô*Ð*Ð*Ø�xŠx˜Ñ%Ô%×+Ò+Ñ-Ô-×3Ò3Ñ5Ô5°~ÐEÐEs   ÁA ÁA3Á2A3©r$  rê   c                óÊ   — |}|s+|�)	 |                       |¦  «        }n# t          $ r d}Y nw xY wt          | di ¦  «        pi }|r||v r||         S |                      ¦   «         S )zCResolve reasoning effort for a session, honoring session overrides.Nrm  )r*  r·   rÜ   r�  )r¿  r$  rê   r3  rA  s        r!   Ú!_resolve_session_reasoning_configz/GatewayRunner._resolve_session_reasoning_config“  s¤   € ð  +ÐØ#ð 	,¨Ð(:ð,Ø'+×'CÒ'CÀFÑ'KÔ'KÐ$Ð$øÝð ,ð ,ð ,Ø'+Ð$Ð$Ð$ð,øøøõ ˜DÐ"@À"ÑEÔEÐKÈˆ	Øð 	3Ð$8¸IÐ$EÐ$EØÐ1Ô2Ð2Ø×*Ò*Ñ,Ô,Ð,s   ˆ ž-¬-Úreasoning_configc                 ó¨   — |sdS t          | d¦  «        si | _        |€| j                             |d¦  «         dS t          |¦  «        | j        |<   dS )z3Set or clear the session-scoped reasoning override.Nrm  )r  rm  rT  rÉ   )r¿  rê   r¢  s      r!   Ú_set_session_reasoning_overridez-GatewayRunner._set_session_reasoning_override¦  sm   € ð ð 	ØˆFÝ�tÐ;Ñ<Ô<ð 	3Ø02ˆDÔ-ØÐ#ØÔ-×1Ò1°+¸tÑDÔDÐDÐDÐDå=AÐBRÑ=SÔ=SˆDÔ-¨kÑ:Ð:Ð:ré   c                  ó  — d} 	 ddl }t          dz  }|                     ¦   «         r‹t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t          |                     di ¦  «                             dd¦  «        pd¦  «                             ¦   «         } n# t          $ r Y nw xY w|  	                    ¦   «         }|r|d	v rdS |d
v rdS t                               d| ¦  «         dS )a  Load Priority Processing setting from config.yaml.

        Reads agent.service_tier from config.yaml. Accepted values mirror the CLI:
        "fast"/"priority"/"on" => "priority", while "normal"/"off" disables it.
        Returns None when unset or unsupported.
        rp   r   Nr,   r-   r.   rq   r@  >   rë  ÚnoneÚnormalr+  Ústandard>   ÚonÚfastÚpriorityr«  z#Unknown service_tier '%s', ignoring)rÄ   rÅ   r   rÆ   rÇ   rò   r¸   ró   r·   rõ   r³   r´   ©ÚrawrÌ   rÍ   rÎ   rÏ   r!  s         r!   r�  z GatewayRunner._load_service_tierµ  sa  € ð ˆð	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð VÝ˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1å˜#Ÿ'š' '¨2Ñ.Ô.×2Ò2°>À2ÑFÔFÐLÈ"ÑMÔM×SÒSÑUÔU�øøÝð 	ð 	ð 	ØˆDð	øøøð —	’	‘”ˆØð 	˜Ð!QÐQÐQØ�4ØÐ.Ð.Ð.Ø�:Ý�ŠÐ<¸cÑBÔBÐBØˆts5   „3B2 ·AÁB2 ÁAÁB2 Á"AÁ#AB2 Â2
B?Â>B?c                  ó\  — 	 ddl } t          dz  }|                     ¦   «         rwt          |d¬¦  «        5 }|                      |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t          |                     di ¦  «                             dd¦  «        ¦  «        S n# t          $ r Y nw xY wdS )	z<Load show_reasoning toggle from config.yaml display section.r   Nr,   r-   r.   r|   Úshow_reasoningF)rÄ   rÅ   r   rÆ   rÇ   r¶  r¸   r·   ©rÌ   rÍ   rÎ   rÏ   s       r!   r‘  z"GatewayRunner._load_show_reasoningÐ  s  € ð	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð QÝ˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1å˜CŸGšG I¨rÑ2Ô2×6Ò6Ð7GÈÑOÔOÑPÔPÐPðQøõ ð 	ð 	ð 	ØˆDð	øøøàˆus4   ‚3B µAÁB ÁAÁB Á AÁ!9B Â
B)Â(B)c                  ó.  — t          j        dd¦  «                             ¦   «                              ¦   «         } | sÑ	 ddl}t
          dz  }|                     ¦   «         r�t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t          | 
                    di ¦  «         
                    d	d¦  «        pd¦  «                             ¦   «                              ¦   «         } n# t          $ r Y nw xY w| d
k    rd
ndS )z<Load gateway drain-time busy-input behavior from config/env.r~   rp   r   Nr,   r-   r.   r|   r}   rl  rb  )r   r²   ró   rõ   rÄ   rÅ   r   rÆ   rÇ   rò   r¸   r·   )rõ  rÌ   rÍ   rÎ   rÏ   s        r!   r“  z#GatewayRunner._load_busy_input_modeÞ  s\  € õ ŒyÐ9¸2Ñ>Ô>×DÒDÑFÔF×LÒLÑNÔNˆØð 		ðØ!Ð!Ð!Ð!Ý'¨-Ñ7�Ø—?’?Ñ$Ô$ð hÝ˜h°Ð9Ñ9Ô9ð 5¸RØ Ÿlšl¨2Ñ.Ô.Ð4°"˜ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5å˜sŸwšw y°"Ñ5Ô5×9Ò9Ð:KÈRÑPÔPÐVÐTVÑWÔW×]Ò]Ñ_Ô_×eÒeÑgÔg�DøøÝð ð ð Ø�ðøøøà 'š/˜/ˆwˆw¨{Ð:s6   ½3C= Á0BÂC= ÂBÂC= ÂBÂA C= Ã=
D
Ä	D
c                  ó   — t          j        dd¦  «                             ¦   «         } | s¿	 ddl}t          dz  }|                     ¦   «         r‹t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t          | 	                    di ¦  «         	                    d	d¦  «        pd¦  «                             ¦   «         } n# t          $ r Y nw xY wt          | ¦  «        }| rT|t          k    rI	 t          | ¦  «         n8# t          t          f$ r$ t                                d
| t          ¦  «         Y nw xY w|S )z<Load graceful gateway restart/stop drain timeout in seconds.r{   rp   r   Nr,   r-   r.   rq   rz   z7Invalid restart_drain_timeout '%s', using default %.0fs)r   r²   ró   rÄ   rÅ   r   rÆ   rÇ   rò   r¸   r·   r¡   rŸ   ÚfloatÚ	TypeErrorr™  r³   r´   r¬  s         r!   r”  z)GatewayRunner._load_restart_drain_timeoutî  sµ  € õ ŒiÐ6¸Ñ;Ô;×AÒAÑCÔCˆØð 		ðØ!Ð!Ð!Ð!Ý'¨-Ñ7�Ø—?’?Ñ$Ô$ð cÝ˜h°Ð9Ñ9Ô9ð 5¸RØ Ÿlšl¨2Ñ.Ô.Ð4°"˜ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5å˜cŸgšg g¨rÑ2Ô2×6Ò6Ð7NÐPRÑSÔSÐYÐWYÑZÔZ×`Ò`ÑbÔb�CøøÝð ð ð Ø�ðøøøå+¨CÑ0Ô0ˆØð 	�5ÕAÒAÐAðÝ�c‘
”
�
�
øÝ�zÐ*ð ð ð Ý—’ØMØÝ9ñô ð ð ð ðøøøð ˆsH   «3C ÁBÁ6C ÂBÂC Â	BÂ
AC Ã
C&Ã%C&ÄD Ä2EÅ
Ec                  ó<  — t          j        dd¦  «        } | s·	 ddl}t          dz  }|                     ¦   «         rƒt          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «                             d	¦  «        }|d
u rd} n|dvrt          |¦  «        } n# t          $ r Y nw xY w| pd 
                    ¦   «                              ¦   «         } h d£}| |vrt                               d| ¦  «         dS | S )u�  Load background process notification mode from config or env var.

        Modes:
          - ``all``    â€” push running-output updates *and* the final message (default)
          - ``result`` â€” only the final completion message (regardless of exit code)
          - ``error``  â€” only the final message when exit code is non-zero
          - ``off``    â€” no watcher messages at all
        ÚHERMES_BACKGROUND_NOTIFICATIONSrp   r   Nr,   r-   r.   r|   Ú background_process_notificationsFrë  )Nrp   rê  >   rê  rë  rO  rG  zBUnknown background_process_notifications '%s', defaulting to 'all')r   r²   rÄ   rÅ   r   rÆ   rÇ   r¸   rò   r·   ró   rõ   r³   r´   )rõ  rÌ   rÍ   rÎ   rÏ   r­  Úvalids          r!   Ú#_load_background_notifications_modez1GatewayRunner._load_background_notifications_mode  sŽ  € õ ŒyÐ:¸BÑ?Ô?ˆØð 	ðØ!Ð!Ð!Ð!Ý'¨-Ñ7�Ø—?’?Ñ$Ô$ð (Ý˜h°Ð9Ñ9Ô9ð 5¸RØ Ÿlšl¨2Ñ.Ô.Ð4°"˜ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5àŸ'š' )¨RÑ0Ô0×4Ò4Ð5WÑXÔX�CØ˜e�|�|Ø$˜˜Ø JÐ.Ð.Ý" 3™xœx˜øøÝð ð ð Ø�ðøøøà�˜×$Ò$Ñ&Ô&×,Ò,Ñ.Ô.ˆØ1Ð1Ð1ˆØ�uÐÐÝ�NŠNØTØñô ð ð �5Øˆs6   ™3B? ÁA0Á$B? Á0A4Á4B? Á7A4Á8AB? Â?
CÃCc                  ó  — 	 ddl } t          dz  }|                     ¦   «         rXt          |d¬¦  «        5 }|                      |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «        pi S n# t          $ r Y nw xY wi S )z>Load OpenRouter provider routing preferences from config.yaml.r   Nr,   r-   r.   Úprovider_routing©rÄ   rÅ   r   rÆ   rÇ   r¸   r·   r°  s       r!   r•  z$GatewayRunner._load_provider_routing+  sð   € ð	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð =Ý˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à—w’wÐ1°2Ñ6Ô6Ð<¸"Ð<ð=øõ ð 	ð 	ð 	ØˆDð	øøøàˆ	s4   ‚3A= µAÁA= ÁAÁA= Á AÁ!A= Á=
B
Â	B
c                  óN  — 	 ddl } t          dz  }|                     ¦   «         rpt          |d¬¦  «        5 }|                      |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     d¦  «        p|                     d¦  «        pd}|r|S n# t          $ r Y nw xY wdS )a  Load fallback provider chain from config.yaml.

        Returns a list of provider dicts (``fallback_providers``), a single
        dict (legacy ``fallback_model``), or None if not configured.
        AIAgent.__init__ normalizes both formats into a chain.
        r   Nr,   r-   r.   rÀ   rÁ   r¼  )rÌ   rÍ   rÎ   rÏ   rÐ   s        r!   r—  z"GatewayRunner._load_fallback_model9  s  € ð
	ØÐÐÐÝ# mÑ3ˆHØ�ŠÑ Ô ð Ý˜(¨WÐ5Ñ5Ô5ð 1¸ØŸ,š, rÑ*Ô*Ð0¨b�Cð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1à—W’WÐ1Ñ2Ô2ÐW°c·g²gÐ>NÑ6OÔ6OÐWÐSW�Øð Ø�IøøÝð 	ð 	ð 	ØˆDð	øøøàˆts4   ‚3B µAÁB ÁAÁB Á AÁ!2B Â
B"Â!B"c                 óH   — d„ | j                              ¦   «         D ¦   «         S )Nc                 ó,   — i | ]\  }}|t           u¯||“ŒS r  )Ú_AGENT_PENDING_SENTINEL)r  rê   rq   s      r!   ú
<dictcomp>z:GatewayRunner._snapshot_running_agents.<locals>.<dictcomp>O  s4   € ð 
ð 
ð 
á"�˜UØÕ3Ð3Ð3ð ˜à3Ð3Ð3ré   )r¤  rò  r  s    r!   Ú_snapshot_running_agentsz&GatewayRunner._snapshot_running_agentsN  s2   € ð
ð 
à&*Ô&:×&@Ò&@Ñ&BÔ&Bð
ñ 
ô 
ð 	
ré   rã   c                 ó‚   — | j                              |j        j        ¦  «        }|sd S t	          |j        ||¦  «         d S rr  )r‡  r¸   r$  r  rž   r¥  )r¿  rê   rã   rí   s       r!   Ú_queue_or_replace_pending_eventz-GatewayRunner._queue_or_replace_pending_eventU  sD   € Ø”-×#Ò# E¤LÔ$9Ñ:Ô:ˆØð 	ØˆFÝ# GÔ$=¸{ÈEÑRÔRÐRÐRÐRré   c              ƒ   óÊ  K  — | j         rÏ| j                             |j        j        ¦  «        }|sdS |j        j        rd|j        j        ind }|                      ¦   «         r/|                      ||¦  «         d|                      ¦   «         › d�}nd|                      ¦   «         › d�}| 	                    |j        j
        ||j        |¬¦  «        ƒ d {V —† dS | j                             |j        j        ¦  «        }|sdS d	d
lm}  ||j        ||¦  «         | j        dk    }| j                             |¦  «        }|s7|r5|t"          ur,	 |                     |j        ¦  «         n# t(          $ r Y nw xY wd}	t+          j        ¦   «         }
| j                             |d	¦  «        }|
|z
  |	k     rdS |
| j        |<   g }|r÷|t"          urî	 |                     ¦   «         }|                     dd	¦  «        }|                     dd	¦  «        }|                     d¦  «        }| j                             |d	¦  «        }|r3t3          |
|z
  dz  ¦  «        }|d	k    r|                     |› d�¦  «         |r|                     d|› d|› �¦  «         |r|                     d|› �¦  «         n# t(          $ r Y nw xY w|rdd                     |¦  «        › d�nd}|rd|› d�}nd|› d�}	 d	dlm}m}m}m } tC          ¦   «         } |||¦  «        s(|› d ||rdnd¦  «        › �} |tD          d z  |¦  «         n2# t(          $ r%}tF           $                    d!|¦  «         Y d }~nd }~ww xY w|j        j        rd|j        j        ind }	 | 	                    |j        j
        ||j        |¬¦  «        ƒ d {V —† n2# t(          $ r%}tF           $                    d"|¦  «         Y d }~nd }~ww xY wdS )#NTrF  õ   â�³ Gateway õ2    â€” queued for the next turn after it comes back.õ   â�³ Gateway is ú- and is not accepting another turn right now.)rC  ÚcontentÚreply_toÚmetadataFr   )rž   rl  rK  Úapi_call_countÚmax_iterationsÚcurrent_toolé<   ú min elapsedú
iteration r  ú	running: ú (ú, ú)rp   u   â�³ Queued for the next turnz.. I'll respond once the current task finishes.u   âš¡ Interrupting current taskz'. I'll respond to your message shortly.)ÚBUSY_INPUT_FLAGÚbusy_input_hint_gatewayÚis_seenÚ	mark_seenú

rb  r,   z.Failed to apply busy-input onboarding hint: %szFailed to send busy-ack: %s)%rf  r‡  r¸   r$  r  rF  rm  rÄ  rj  Ú_send_with_retryrC  Ú
message_idÚgateway.platforms.baserž   r¥  rc  r¤  rÀ  rb  r]  r·   rV  r§  Úget_activity_summaryra  rµ  rá   râ   Úagent.onboardingr×  rØ  rÙ  rÚ  r(  rÅ   r³   rË   )r¿  rã   rê   rí   Úthread_metarï   rž   Úis_queue_modeÚrunning_agentÚ_BUSY_ACK_COOLDOWNÚnowÚlast_ackÚstatus_partsÚsummaryÚ	iterationÚmax_iterrÏ  Ústart_tsÚelapsed_minÚstatus_detailr×  rØ  rÙ  rÚ  Ú	_user_cfgÚ_onb_errrÁ  s                              r!   Ú#_handle_active_session_busy_messagez1GatewayRunner._handle_active_session_busy_message[  sž  è è € àŒ>ð 	Ø”m×'Ò'¨¬Ô(=Ñ>Ô>ˆGØð Ø�tàCHÄ<ÔCYÐc˜;¨¬Ô(>Ð?Ð?Ð_cˆKØ×/Ò/Ñ1Ô1ð xØ×4Ò4°[À%ÑHÔHÐHØy¨×)CÒ)CÑ)EÔ)EÐyÐyÐy��àw¨D×,FÒ,FÑ,HÔ,HÐwÐwÐw�à×*Ò*ØœÔ,ØØÔ)Ø$ð	 +ñ ô ð ð ð ð ð ð ð ð �4ð ”-×#Ò# E¤LÔ$9Ñ:Ô:ˆØð 	Ø�5ð 	GÐFÐFÐFÐFÐFØ#Ð# GÔ$=¸{ÈEÑRÔRÐRàÔ-°Ò8ˆð
 Ô,×0Ò0°Ñ=Ô=ˆØð 	 ð 	°=ÕH_Ð3_Ð3_ðØ×'Ò'¨¬
Ñ3Ô3Ð3Ð3øÝð ð ð Ø�ðøøøð
  ÐÝŒi‰kŒkˆØÔ$×(Ò(¨°aÑ8Ô8ˆØ�‰>Ð.Ò.Ð.Ø�4à),ˆÔ˜+Ñ&ð ˆØð 	˜]Õ2IÐIÐIðØ'×<Ò<Ñ>Ô>�Ø#ŸKšKÐ(8¸!Ñ<Ô<�	Ø"Ÿ;š;Ð'7¸Ñ;Ô;�Ø&Ÿ{š{¨>Ñ:Ô:�ØÔ2×6Ò6°{ÀAÑFÔF�Øð JÝ"% s¨X¡~¸Ñ&;Ñ"<Ô"<�KØ" Q’�Ø$×+Ò+¨{Ð,HÐ,HÐ,HÑIÔIÐIØð MØ ×'Ò'Ð(K°YÐ(KÐ(KÀÐ(KÐ(KÑLÔLÐLØð DØ ×'Ò'Ð(B°LÐ(BÐ(BÑCÔCÐCøøÝð ð ð Ø�ðøøøð <HÐOÐ7˜TŸYšY |Ñ4Ô4Ð7Ð7Ð7Ð7ÈRˆØð 		ð@¨}ð @ð @ð @ð ˆGð9°ð 9ð 9ð 9ð ð	Uðð ð ð ð ð ð ð ð ð ð ð õ -Ñ.Ô.ˆIØ�7˜9 oÑ6Ô6ð Iàð \ð \Ø.Ð.¸-Ð/X¨w¨wÈ[ÑYÔYð\ð \ð ð �	�,¨Ñ6¸ÑHÔHÐHøøÝð 	Uð 	Uð 	UÝ�LŠLÐIÈ8ÑTÔTÐTÐTÐTÐTÐTÐTøøøøð	Uøøøð @E¼|Ô?UÐ_�{ E¤LÔ$:Ð;Ð;Ð[_ˆð	;Ø×*Ò*ØœÔ,ØØÔ)Ø$ð	 +ñ ô ð ð ð ð ð ð ð ð øõ ð 	;ð 	;ð 	;Ý�LŠLÐ6¸Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøð ˆtsV   ÅE' Å'
E4Å3E4Ç
CJ' Ê'
J4Ê3J4Ë$AL3 Ì3
M"Ì=MÍM"Î.N1 Î1
O Î;OÏO r6   c              ƒ   ó~  ‡ ‡‡K  — ‰                       ¦   «         }‰                      ¦   «         ŠdŠd
dt          dd fˆˆˆ fd„}‰ j        s |d¬¦  «         |dfS  |d¬¦  «         |dk    r|dfS t	          j        ¦   «                              ¦   «         |z   }‰ j        r}t	          j        ¦   «                              ¦   «         |k     rT |¦   «          t	          j        d	¦  «        ƒ d {V —† ‰ j        r)t	          j        ¦   «                              ¦   «         |k     °Tt          ‰ j        ¦  «        } |d¬¦  «         ||fS )Nç        Fr‰   r   c                 óÒ   •— t          j        ¦   «                              ¦   «         }‰                     ¦   «         }| s|‰k    s	|‰z
  dk    r‰                     d¦  «         |Š|Šd S d S )Ng      ð?Údraining)rž  Úget_running_looprV  ra  r…  )r‰   rå  Úactive_countÚlast_active_countÚlast_status_atr¿  s      €€€r!   Ú_maybe_update_statusz@GatewayRunner._drain_active_agents.<locals>._maybe_update_statusØ  s}   ø€ åÔ*Ñ,Ô,×1Ò1Ñ3Ô3ˆCØ×4Ò4Ñ6Ô6ˆLØð %˜Ð(9Ò9Ð9¸cÀNÑ>RÐWZÒ=ZÐ=ZØ×+Ò+¨JÑ7Ô7Ð7Ø$0Ð!Ø!$���ð >[Ð=Zré   Trˆ   r   çš™™™™™¹?©F)rÂ  ra  r¶  r¤  rž  rõ  rV  Úsleep)r¿  r6   Úsnapshotrù  ÚdeadlineÚ	timed_outr÷  rø  s   `     @@r!   Ú_drain_active_agentsz"GatewayRunner._drain_active_agentsÓ  s•  øøøè è € Ø×0Ò0Ñ2Ô2ˆØ ×5Ò5Ñ7Ô7ÐØˆð	%ð 	%­ð 	%¸ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð Ô#ð 	#Ø Ð  tÐ,Ñ,Ô,Ð,Ø˜U�?Ð"àÐ 4Ð(Ñ(Ô(Ð(Ø�aŠ<ˆ<Ø˜T�>Ð!åÔ+Ñ-Ô-×2Ò2Ñ4Ô4°wÑ>ˆØÔ"ð 	%¥wÔ'?Ñ'AÔ'A×'FÒ'FÑ'HÔ'HÈ8Ò'SÐ'SØ Ð Ñ"Ô"Ð"Ý”- Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ð Ô"ð 	%¥wÔ'?Ñ'AÔ'A×'FÒ'FÑ'HÔ'HÈ8Ò'SÐ'Sõ ˜Ô-Ñ.Ô.ˆ	ØÐ 4Ð(Ñ(Ô(Ð(Ø˜Ð"Ð"ré   c                 ó8  — t          | j                             ¦   «         ¦  «        D ]r\  }}|t          u rŒ	 |                     |¦  «         t
                               d|¦  «         ŒA# t          $ r%}t
                               d|¦  «         Y d }~Œkd }~ww xY wd S )Nz8Interrupted running agent for session %s during shutdownz-Failed interrupting agent during shutdown: %s)r¹   r¤  rò  rÀ  rb  r³   rË   r·   )r¿  r\  rê   rq   rÁ  s        r!   Ú_interrupt_running_agentsz'GatewayRunner._interrupt_running_agentsñ  sÂ   € Ý"& tÔ';×'AÒ'AÑ'CÔ'CÑ"DÔ"Dð 	Qð 	QÑˆK˜ØÕ/Ð/Ð/ØðQØ—’ Ñ'Ô'Ð'Ý—’ÐWÐYdÑeÔeÐeÐeøÝð Qð Qð QÝ—’ÐLÈaÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøð	Qð 	Qs   ·0A(Á(
BÁ2BÂBc              ƒ   óø  K  — |                       ¦   «         }|sdS | j        rdnd}| j        rdnd}d|› d|› �}t          ¦   «         }|D �]¯}d}	 t          | dd¦  «        �M| j                             ¦   «          | j        j                             |¦  «        }|rt          |d	d¦  «        nd}n3# t          $ r&}	t           
                    d
||	¦  «         Y d}	~	nd}	~	ww xY w|�|j        j        }
|j        }|j        }n7t          |¦  «        }|sŒÇ|d         }
|d         }|                     d¦  «        }|
|f}||v rŒõ	 t!          |
¦  «        }| j                             |¦  «        }|s�Œ#|rd|ind}|                     |||¬¦  «        ƒ d{V —† |                     |¦  «         t                               d|
|¦  «         �Œ|# t          $ r(}	t           
                    d|
||	¦  «         Y d}	~	�Œ©d}	~	ww xY wdS )u&  Send a notification to every chat with an active agent.

        Called at the very start of stop() â€” adapters are still connected so
        messages can be delivered.  Best-effort: individual send failures are
        logged and swallowed so they never block the shutdown sequence.
        Nrh  ri  zpYour current task will be interrupted. Send any message after restart and I'll try to resume where you left off.z&Your current task will be interrupted.u   âš ï¸� Gateway õ    â€” r›  Úoriginz>Failed to load session origin for shutdown notification %s: %sr  rC  rF  ©rÌ  z#Sent shutdown notification to %s:%sz1Failed to send shutdown notification to %s:%s: %s)rÂ  rg  r½  rÜ   r›  Ú_ensure_loadedÚ_entriesr¸   r·   r³   rË   r  r!  rC  rF  rH  r�   r‡  Úsendr  rÊ   )r¿  ÚactiveÚactionÚhintÚmsgÚnotifiedrê   r$  rÒ   rÁ  Úplatform_strrC  rF  Ú_parsedÚ	dedup_keyr  rí   rÌ  s                     r!   Ú#_notify_active_sessions_of_shutdownz1GatewayRunner._notify_active_sessions_of_shutdownû  sÏ  è è € ð ×.Ò.Ñ0Ô0ˆØð 	ØˆFà!%Ô!8ÐM��¸oˆð Ô&ð:ð Xð Xð :ð	 	ð 4 Ð3Ð3¨TÐ3Ð3ˆå™œˆØ!ð 6	ñ 6	ˆKØˆFð
Ý˜4 °$Ñ7Ô7ÐCØÔ&×5Ò5Ñ7Ô7Ð7Ø Ô.Ô7×;Ò;¸KÑHÔH�EØ?DÐN�W U¨H°dÑ;Ô;Ð;È$�FøøÝð ð ð Ý—’ØTØØñô ð ð ð ð ð ð øøøøðøøøð Ð!Ø%œÔ4�Ø œ.�Ø"Ô,�	�	õ -¨[Ñ9Ô9�Øð ØØ& zÔ2�Ø! )Ô,�Ø#ŸKšK¨Ñ4Ô4�	ð & wÐ/ˆIØ˜HÐ$Ð$ØðÝ# LÑ1Ô1�Øœ-×+Ò+¨HÑ5Ô5�Øð Ùð 8AÐJ˜K¨Ð3Ð3Àd�à—l’l 7¨C¸(�lÑCÔCÐCÐCÐCÐCÐCÐCÐCØ—’˜YÑ'Ô'Ð'Ý—’Ø9Ø  'ñô ð ñ øõ ð ð ð Ý—’ØGØ  '¨1ñô ð ð ð ð ð ñ øøøøðøøøðe6	ð 6	s8   ÁAB.Â.
CÂ8CÃCÄ?+GÅ,AGÇ
G7ÇG2Ç2G7rƒ  c           	      óÈ   — |                      ¦   «         D ]L}	 ddlm}  |dt          |dd ¦  «        d¬¦  «         n# t          $ r Y nw xY w|                      |¦  «         ŒMd S )Nr   ©Úinvoke_hookÚon_session_finalizerM  Úgateway©rM  r  )ÚvaluesÚhermes_cli.pluginsr  rÜ   r·   Ú_cleanup_agent_resources)r¿  rƒ  rq   Ú_invoke_hooks       r!   Ú_finalize_shutdown_agentsz'GatewayRunner._finalize_shutdown_agentsH  sª   € Ø"×)Ò)Ñ+Ô+ð 
	1ð 
	1ˆEðØJÐJÐJÐJÐJÐJØ�Ø)Ý& u¨l¸DÑAÔAØ&ðñ ô ð ð øõ
 ð ð ð Ø�ðøøøà×)Ò)¨%Ñ0Ô0Ð0Ð0ð
	1ð 
	1s   ˜#<¼
A	ÁA	rq   c                 óê   — |€dS 	 t          |d¦  «        r|                     ¦   «          n# t          $ r Y nw xY w	 t          |d¦  «        r|                     ¦   «          dS dS # t          $ r Y dS w xY w)z<Best-effort cleanup for temporary or cached agent instances.NÚshutdown_memory_providerÚclose)r  r  r·   r   ©r¿  rq   s     r!   r  z&GatewayRunner._cleanup_agent_resourcesU  s«   € àˆ=ØˆFð	Ý�uÐ8Ñ9Ô9ð 1Ø×.Ò.Ñ0Ô0Ð0øøÝð 	ð 	ð 	ØˆDð	øøøð
	Ý�u˜gÑ&Ô&ð Ø—’‘”���ðð øåð 	ð 	ð 	ØˆDˆDð	øøøs   †$+ «
8·8¼$A$ Á$
A2Á1A2r@  z.restart_failure_countsÚactive_session_keysc                 ót  — ddl }t          | j        z  }	 |                     ¦   «         r" |j        |                     ¦   «         ¦  «        ni }n# t          $ r i }Y nw xY wi }|D ]}|                     |d¦  «        dz   ||<   Œ	 |                      |j	        |¦  «        ¦  «         dS # t          $ r Y dS w xY w)a  Increment restart-failure counters for sessions active at shutdown.

        Persists to a JSON file so counters survive across restarts.
        Sessions NOT in active_session_keys are removed (they completed
        successfully, so the loop is broken).
        r   Nr)   )
rÔ  rÅ   Ú_STUCK_LOOP_FILEr   rÕ  rî  r·   r¸   rû  rü  )r¿  r"  rÔ  r   ÚcountsÚ
new_countsrt  s          r!   Ú!_increment_restart_failure_countsz/GatewayRunner._increment_restart_failure_countsj  sñ   € ð 	ˆˆˆå˜dÔ3Ñ3ˆð	Ø59·[²[±]´]ÐJ�Z�T”Z §¢Ñ 0Ô 0Ñ1Ô1Ð1ÈˆFˆFøÝð 	ð 	ð 	ØˆFˆFˆFð	øøøð ˆ
Ø&ð 	5ð 	5ˆCØ$Ÿjšj¨¨aÑ0Ô0°1Ñ4ˆJ�s‰OˆOð	Ø�OŠO˜J˜DœJ zÑ2Ô2Ñ3Ô3Ð3Ð3Ð3øÝð 	ð 	ð 	ØˆDˆDð	øøøs#   •8A ÁAÁAÂ#B) Â)
B7Â6B7c                 óŠ  ‡ — ddl }t          ‰ j        z  }|                     ¦   «         sdS 	  |j        |                     ¦   «         ¦  «        }n# t          $ r Y dS w xY wd}ˆ fd„|                     ¦   «         D ¦   «         }|D ]i}	 ‰ j        j	         
                    |¦  «        }|r5|j        s.d|_        |dz  }t                               d|||         ¦  «         ŒZ# t          $ r Y Œfw xY w|r+	 ‰ j                             ¦   «          n# t          $ r Y nw xY w	 |                     d¬¦  «         n# t          $ r Y nw xY w|S )u,  Suspend sessions that have been active across too many restarts.

        Returns the number of sessions suspended.  Called on gateway startup
        AFTER suspend_recently_active() to catch the stuck-loop pattern:
        session loads â†’ agent gets stuck â†’ gateway restarts â†’ repeat.
        r   Nc                 ó0   •— g | ]\  }}|‰j         k    ¯|‘ŒS r  )Ú_STUCK_LOOP_THRESHOLD)r  ÚkrÏ  r¿  s      €r!   rÌ  z>GatewayRunner._suspend_stuck_loop_sessions.<locals>.<listcomp>˜  s*   ø€ ÐVÐVÐV™D˜A˜q°a¸4Ô;UÒ6UÐ6U�aÐ6UÐ6UÐ6Uré   Tr)   u_   Auto-suspended stuck session %s (active across %d consecutive restarts â€” likely a stuck loop)©Ú
missing_ok)rÔ  rÅ   r$  r   rÕ  rî  r·   rò  r›  r  r¸   Ú	suspendedr³   r´   Ú_saveÚunlink)r¿  rÔ  r   r%  r.  Ú
stuck_keysrê   rÒ   s   `       r!   Ú_suspend_stuck_loop_sessionsz*GatewayRunner._suspend_stuck_loop_sessions…  s¾  ø€ ð 	ˆˆˆå˜dÔ3Ñ3ˆØ�{Š{‰}Œ}ð 	Ø�1ð	Ø�T”Z §¢Ñ 0Ô 0Ñ1Ô1ˆFˆFøÝð 	ð 	ð 	Ø�1�1ð	øøøð ˆ	ØVÐVÐVÐV F§L¢L¡N¤NÐVÑVÔVˆ
à%ð 	ð 	ˆKðØÔ*Ô3×7Ò7¸ÑDÔD�Øð  ¤ð Ø&*�E”OØ ‘N�IÝ—N’NðHà# V¨KÔ%8ñô ð øøõ
 ð ð ð Ø�ðøøøð ð 	ðØÔ"×(Ò(Ñ*Ô*Ð*Ð*øÝð ð ð Ø�ðøøøð	Ø�KŠK 4ˆKÑ(Ô(Ð(Ð(øÝð 	ð 	ð 	ØˆDð	øøøð ÐsH   ¬"A Á
AÁAÂACÃ
C+Ã*C+Ã1D Ä
DÄDÄD3 Ä3
E Ä?E c                 óL  — ddl }t          | j        z  }|                     ¦   «         sdS 	  |j        |                     ¦   «         ¦  «        }||v rB||= |r%|                      |j        |¦  «        ¦  «         dS |                     d¬¦  «         dS dS # t          $ r Y dS w xY w)z—Clear the restart-failure counter for a session that completed OK.

        Called after a successful agent turn to signal the loop is broken.
        r   NTr,  )
rÔ  rÅ   r$  r   rÕ  rî  rû  rü  r0  r·   )r¿  rê   rÔ  r   r%  s        r!   Ú_clear_restart_failure_countz*GatewayRunner._clear_restart_failure_count¶  sÔ   € ð
 	ˆˆˆå˜dÔ3Ñ3ˆØ�{Š{‰}Œ}ð 	ØˆFð		Ø�T”Z §¢Ñ 0Ô 0Ñ1Ô1ˆFØ˜fÐ$Ð$Ø˜;Ð'Øð 1Ø—O’O J D¤J¨vÑ$6Ô$6Ñ7Ô7Ð7Ð7Ð7à—K’K¨4�KÑ0Ô0Ð0Ð0Ð0ð %Ð$øõ ð 	ð 	ð 	ØˆDˆDð	øøøs   «AB Á;B Â
B#Â"B#c              ƒ   ó´  K  — dd l }dd l}t          ¦   «         }|st                               d¦  «         d S t          j        ¦   «         }d                     d„ |D ¦   «         ¦  «        }d|› d|› d�}|                     d¦  «        }|r)| 	                    |d	d
|g|j
        |j
        d¬¦  «         d S | 	                    d	d
|g|j
        |j
        d¬¦  «         d S )Nr   z4Could not locate hermes binary for detached /restartrñ   c              3   ó>   K  — | ]}t          j        |¦  «        V — Œd S rr  ©r˜  Úquoter  s     r!   r  zAGatewayRunner._launch_detached_restart_command.<locals>.<genexpr>Õ  s,   è è € Ð@Ð@¨T•u”{ 4Ñ(Ô(Ð@Ð@Ð@Ð@Ð@Ð@ré   zwhile kill -0 z" 2>/dev/null; do sleep 0.2; done; z gateway restartÚsetsidÚbashz-lcT©ÚstdoutÚstderrÚstart_new_session)r1  Ú
subprocessr:  r³   rO  r   Úgetpidrâ   r2  ÚPopenÚDEVNULL)r¿  r1  r?  Ú
hermes_cmdÚcurrent_pidÚcmdÚ	shell_cmdÚ
setsid_bins           r!   Ú _launch_detached_restart_commandz.GatewayRunner._launch_detached_restart_commandË  s8  è è € ØˆˆˆØÐÐÐå(Ñ*Ô*ˆ
Øð 	Ý�LŠLÐOÑPÔPÐPØˆFå”i‘k”kˆØ�hŠhÐ@Ð@°ZÐ@Ñ@Ô@Ñ@Ô@ˆð%˜[ð %ð %Øð%ð %ð %ð 	ð —\’\ (Ñ+Ô+ˆ
Øð 	Ø×ÒØ˜V U¨IÐ6Ø!Ô)Ø!Ô)Ø"&ð	 ñ ô ð ð ð ð ×ÒØ˜ 	Ð*Ø!Ô)Ø!Ô)Ø"&ð	 ñ ô ð ð ð ré   ©ÚdetachedÚvia_servicerJ  rK  c                ó  ‡ ‡‡— ‰ j         rdS d‰ _        ‰‰ _        ‰‰ _        d‰ _         dˆˆ ˆfd„}t	          j         |¦   «         ¦  «        }‰ j                             |¦  «         |                     ‰ j        j	        ¦  «         dS )NFTr   c               “   ó|   •K  — t          j        d¦  «        ƒ d {V —† ‰                     d‰ ‰¬¦  «        ƒ d {V —† d S )Nçš™™™™™©?T©rc  Údetached_restartÚservice_restart)rž  rü  rX  )rJ  r¿  rK  s   €€€r!   Ú_run_restartz3GatewayRunner.request_restart.<locals>._run_restartò  sZ   øè è € Ý”- Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø—)’) D¸8ÐU`�)ÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaré   ©r   N)
rh  rg  ri  rj  rž  Úcreate_taskr¾  r  Úadd_done_callbackr  )r¿  rJ  rK  rR  Útasks   ```  r!   Úrequest_restartzGatewayRunner.request_restartê  s³   øøø€ ØÔ%ð 	Ø�5Ø"&ˆÔØ!)ˆÔØ$/ˆÔ!Ø%)ˆÔ"ð	bð 	bð 	bð 	bð 	bð 	bð 	bð 	bõ Ô" < <¡>¤>Ñ2Ô2ˆØÔ×"Ò" 4Ñ(Ô(Ð(Ø×Ò˜tÔ5Ô=Ñ>Ô>Ð>Øˆtré   c           
   ƒ   óœ  K  — t                                d¦  «         t                                d| j        j        ¦  «         	 ddlm}  |¦   «         }|r!|dk    rt                                d|¦  «         n# t          $ r Y nw xY w	 ddlm}  |dd	¬
¦  «         n# t          $ r Y nw xY wt          d„ dD ¦   «         ¦  «        }t          j        dd¦  «                             ¦   «         dv pt          d„ dD ¦   «         ¦  «        }|s|st                                d¦  «         	 ddlm}  |¦   «          n,# t          $ r t                                dd¬¦  «         Y nw xY w	 ddlm} ddlm}  | |¦   «         d¬¦  «         n,# t          $ r t                                dd¬¦  «         Y nw xY w| j                             ¦   «          	 ddlm}	 |	                     ¦   «         }
|
rt                                d|
¦  «         n2# t          $ r%}t                                d|¦  «         Y d	}~nd	}~ww xY wt4          dz  }|                     ¦   «         r@t                                d ¦  «         	 |                     ¦   «          nz# t          $ r Y nnw xY w	 | j                             ¦   «         }|rt                                d!|¦  «         n2# t          $ r%}t                                d"|¦  «         Y d	}~nd	}~ww xY w	 |                      ¦   «         }|rt                                d#|¦  «         n2# t          $ r%}t                                d$|¦  «         Y d	}~nd	}~ww xY wd}d}g }g }| j        j          !                    ¦   «         D �]^\  }}|j"        sŒ|d%z  }|  #                    ||¦  «        }|s!t                                d&|j$        ¦  «         ŒL| %                    | j&        ¦  «         | '                    | j(        ¦  «         | )                    | j        ¦  «         | *                    | j+        ¦  «         t                                d'|j$        ¦  «         |  ,                    |j$        d(d	d	¬)¦  «         	 | -                    ¦   «         ƒ d	{V —†}|rd|| j.        |<   |  /                    |¦  «         |d%z  }|  ,                    |j$        d*d	d	¬)¦  «         t                                d+|j$        ¦  «         �n*t                                d,|j$        ¦  «         |  0                    ||¦  «        ƒ d	{V —† |j1        rŠ|  ,                    |j$        |j2        rd-nd.|j3        |j4        ¬)¦  «         |j2        r|n|}| 5                    |j$        › d/|j4        › �¦  «         |j2        r"|d%tm          j7        ¦   «         d0z   d1œ| j8        |<   n]|  ,                    |j$        d-d	d2¬)¦  «         | 5                    |j$        › d3�¦  «         |d%tm          j7        ¦   «         d0z   d1œ| j8        |<   �ŒŸ# t          $ r´}t            9                    d4|j$        |¦  «         |  0                    ||¦  «        ƒ d	{V —† |  ,                    |j$        d-d	tu          |¦  «        ¬)¦  «         | 5                    |j$        › d/|› �¦  «         |d%tm          j7        ¦   «         d0z   d1œ| j8        |<   Y d	}~�ŒXd	}~ww xY w|dk    �r|rld5 ;                    |¦  «        }t            9                    d6|¦  «         	 ddlm}  |d7|¬
¦  «         n# t          $ r Y nw xY w|  <                    |¦  «         dS |dk    rYd5 ;                    |¦  «        pd8}t            9                    d9|¦  «         	 ddlm}  |d7|¬
¦  «         n# t          $ r Y nw xY wdS t                                d:¦  «         t                                d;¦  «         | j.        | j=        _.        d| _>        |  ?                    d<¦  «         t�          | j        jA        ¦  «        }|rt                                d=|¦  «         | j         B                    d>d?d@„ | j.         C                    ¦   «         D ¦   «         i¦  «        ƒ d	{V —† |dk    rt                                dA|¦  «         	 ddBlDmE}  || j.        ¦  «        ƒ d	{V —†}t�          dC„ | G                    d?i ¦  «         H                    ¦   «         D ¦   «         ¦  «        }t                                dD|¦  «         n2# t          $ r%}t                                dE|¦  «         Y d	}~nd	}~ww xY w|  I                    ¦   «         ƒ d	{V —†}|s?t          dF„ t4          dGz  t4          dHz  fD ¦   «         ¦  «        r|  J                    ¦   «          |  K                    ¦   «         ƒ d	{V —† 	 ddlm}	 |	jL        rv|	jL         M                    d¦  «        }t�          jO        |  P                    |¦  «        ¦  «         t                                dI| G                    dJ¦  «        ¦  «         |	jL        °vn2# t          $ r%}t            9                    dK|¦  «         Y d	}~nd	}~ww xY wt�          jO        |  Q                    ¦   «         ¦  «         | j8        rPt                                dLt�          | j8        ¦  «        dM ;                    dN„ | j8        D ¦   «         ¦  «        ¦  «         t�          jO        |  R                    ¦   «         ¦  «         t                                dO¦  «         dS )Pz—
        Start the gateway and all configured platform adapters.
        
        Returns True if at least one adapter connected successfully.
        zStarting Hermes Gateway...zSession storage: %sr   ©Úget_active_profile_namer+  zActive profile: %sr€  ÚstartingN)r~  r!  c              3   ó>   K  — | ]}t          j        |¦  «        V — Œd S rr  )r   r²   rÎ  s     r!   r  z&GatewayRunner.start.<locals>.<genexpr>  s>   è è € ð 
ð 
àõ ŒI�a‰LŒLð
ð 
ð 
ð 
ð 
ð 
ré   )ÚTELEGRAM_ALLOWED_USERSÚDISCORD_ALLOWED_USERSÚWHATSAPP_ALLOWED_USERSÚSLACK_ALLOWED_USERSÚSIGNAL_ALLOWED_USERSÚSIGNAL_GROUP_ALLOWED_USERSÚEMAIL_ALLOWED_USERSÚSMS_ALLOWED_USERSÚMATTERMOST_ALLOWED_USERSÚMATRIX_ALLOWED_USERSÚDINGTALK_ALLOWED_USERSÚFEISHU_ALLOWED_USERSÚWECOM_ALLOWED_USERSÚWECOM_CALLBACK_ALLOWED_USERSÚWEIXIN_ALLOWED_USERSÚBLUEBUBBLES_ALLOWED_USERSÚQQ_ALLOWED_USERSÚGATEWAY_ALLOWED_USERSÚGATEWAY_ALLOW_ALL_USERSrp   ©ÚtruerŒ   Úyesc              3   óh   K  — | ]-}t          j        |d ¦  «                             ¦   «         dv V — Œ.dS )rp   rp  N)r   r²   rõ   rÎ  s     r!   r  z&GatewayRunner.start.<locals>.<genexpr>!  s\   è è € ð e
ð e
àõ ŒI�a˜ÑÔ×"Ò"Ñ$Ô$Ð(<Ð<ðe
ð e
ð e
ð e
ð e
ð e
ré   )ÚTELEGRAM_ALLOW_ALL_USERSÚDISCORD_ALLOW_ALL_USERSÚWHATSAPP_ALLOW_ALL_USERSÚSLACK_ALLOW_ALL_USERSÚSIGNAL_ALLOW_ALL_USERSÚEMAIL_ALLOW_ALL_USERSÚSMS_ALLOW_ALL_USERSÚMATTERMOST_ALLOW_ALL_USERSÚMATRIX_ALLOW_ALL_USERSÚDINGTALK_ALLOW_ALL_USERSÚFEISHU_ALLOW_ALL_USERSÚWECOM_ALLOW_ALL_USERSÚWECOM_CALLBACK_ALLOW_ALL_USERSÚWEIXIN_ALLOW_ALL_USERSÚBLUEBUBBLES_ALLOW_ALL_USERSÚQQ_ALLOW_ALL_USERSz×No user allowlists configured. All unauthorized users will be denied. Set GATEWAY_ALLOW_ALL_USERS=true in ~/.hermes/.env to allow open access, or configure platform allowlists (e.g., TELEGRAM_ALLOWED_USERS=your_id).)Údiscover_pluginsz*plugin discovery failed at gateway startupTrÐ  r{  )Úregister_from_configF)Úaccept_hooksz1shell-hook registration failed at gateway startupro  z5Recovered %s background process(es) from previous runzProcess checkpoint recovery: %sú.clean_shutdownu?   Previous gateway exited cleanly â€” skipping session suspensionz3Suspended %d in-flight session(s) from previous runz(Session suspension on startup failed: %sz'Auto-suspended %d stuck-loop session(s)zStuck-loop detection failed: %sr)   zNo adapter available for %szConnecting to %s...Ú
connectingrG  rÚ  u   âœ“ %s connectedu   âœ— %s failed to connectrE  rF  ú: rK  rL  zfailed to connectz: failed to connectu   âœ— %s error: %sz; z0Gateway hit a non-retryable startup conflict: %sÚstartup_failedz4all configured messaging platforms failed to connectz?Gateway failed to connect any configured messaging platform: %szNo messaging platforms enabled.z5Gateway will continue running for cron job execution.Úrunningz%s hook(s) loadedzgateway:startuprU  c                 ó   — g | ]	}|j         ‘Œ
S r  rç  rÊ  s     r!   rÌ  z'GatewayRunner.start.<locals>.<listcomp>	  s   € Ð@Ð@Ð@ a˜!œ'Ð@Ð@Ð@ré   z#Gateway running with %s platform(s)©Úbuild_channel_directoryc              3   ó4   K  — | ]}t          |¦  «        V — Œd S rr  ©rÞ   )r  Úchss     r!   r  z&GatewayRunner.start.<locals>.<genexpr>"	  s(   è è € ÐWÐW¨�3˜s™8œ8ÐWÐWÐWÐWÐWÐWré   z%Channel directory built: %d target(s)z"Channel directory build failed: %sc              3   ó>   K  — | ]}|                      ¦   «         V — Œd S rr  )r   )r  r   s     r!   r  z&GatewayRunner.start.<locals>.<genexpr>*	  s>   è è € ð  
ð  
àð �KŠK‰MŒMð 
ð  
ð  
ð  
ð  
ð  
ré   ú.update_pending.jsonú.update_pending.claimed.jsonz(Resumed watcher for recovered process %srM  z!Recovered watcher setup error: %sz;Starting reconnection watcher for %d failed platform(s): %srÕ  c              3   ó$   K  — | ]}|j         V — Œd S rr  rç  rÊ  s     r!   r  z&GatewayRunner.start.<locals>.<genexpr>H	  s$   è è € ÐBÐB a˜!œ'ÐBÐBÐBÐBÐBÐBré   zPress Ctrl+C to stop)Sr³   rÊ   r)  rš  Úhermes_cli.profilesrZ  r·   r„  r�  r  r   r²   rõ   r´   r  r„  rË   r³  r|  Úagent.shell_hooksr…  rº  Údiscover_and_loadr™  rp  Úrecover_from_checkpointrÅ   r   r0  r›  Úsuspend_recently_activer2  rU  rò  r  Ú_create_adapterr!  Úset_message_handlerÚ_handle_messageÚset_fatal_error_handlerr[  Úset_session_storeÚset_busy_session_handlerrð  rR  Úconnectr‡  r  r  Úhas_fatal_errorrS  rP  rQ  rá   rV  rW  r®  rO  rò   râ   r_  rœ  r�  r…  rÞ   Úloaded_hooksÚemitr0  Úgateway.channel_directoryrŽ  Úsumr¸   r  Ú_send_update_notificationÚ#_schedule_update_notification_watchÚ_send_restart_notificationÚpending_watchersrT  rž  rT  Ú_run_process_watcherÚ_session_expiry_watcherÚ_platform_reconnect_watcher)r¿  rZ  Ú_profiler�  Ú_any_allowlistÚ
_allow_allr„  r|  r…  rp  Ú	recoveredrÁ  Ú_clean_markerr.  ÚstuckÚconnected_countÚenabled_platform_countÚstartup_nonretryable_errorsÚstartup_retryable_errorsr  rZ  rí   ÚsuccessÚtargetr\  Ú
hook_countrŽ  Ú	directoryÚch_countr  Úwatchers                                  r!   ÚstartzGatewayRunner.startû  sB  è è € õ 	�ŠÐ0Ñ1Ô1Ð1Ý�ŠÐ)¨4¬;Ô+CÑDÔDÐDð	ØCÐCÐCÐCÐCÐCØ.Ð.Ñ0Ô0ˆHØð <˜H¨	Ò1Ð1Ý—’Ð0°(Ñ;Ô;Ð;øøÝð 	ð 	ð 	ØˆDð	øøøð	Ø;Ð;Ð;Ð;Ð;Ð;Ø Ð ¨zÀtÐLÑLÔLÐLÐLøÝð 	ð 	ð 	ØˆDð	øøøõ ð 
ð 
ð0ð
ñ 
ô 
ñ 
ô 
ˆõ  ”YÐ8¸"Ñ=Ô=×CÒCÑEÔEÐI]Ð]ð 
Õadð e
ð e
ð
-ðe
ñ e
ô e
ñ b
ô b
ˆ
ð ð 	 jð 	Ý�NŠNð[ñô ð ð	Ø;Ð;Ð;Ð;Ð;Ð;ØÐÑÔÐÐøÝð 	ð 	ð 	Ý�LŠLØ<Àtð ñ ô ð ð ð ð	øøøð	Ø5Ð5Ð5Ð5Ð5Ð5Ø>Ð>Ð>Ð>Ð>Ð>Ø Ð   ¡¤¸UÐCÑCÔCÐCÐCøÝð 	ð 	ð 	Ý�LŠLØCØð ñ ô ð ð ð ð	øøøð 	Œ
×$Ò$Ñ&Ô&Ð&ð	AØ?Ð?Ð?Ð?Ð?Ð?Ø(×@Ò@ÑBÔBˆIØð `Ý—’ÐSÐU^Ñ_Ô_Ð_øøÝð 	Að 	Að 	AÝ�NŠNÐ<¸aÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøõ %Ð'8Ñ8ˆØ×ÒÑ!Ô!ð 	NÝ�KŠKÐYÑZÔZÐZðØ×$Ò$Ñ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøðNØ Ô.×FÒFÑHÔH�	Øð bÝ—K’KÐ UÐW`ÑaÔaÐaøøÝð Nð Nð NÝ—’ÐIÈ1ÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøð	?Ø×5Ò5Ñ7Ô7ˆEØð QÝ—’ÐHÈ%ÑPÔPÐPøøÝð 	?ð 	?ð 	?Ý�LŠLÐ:¸AÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð	?øøøð ˆØ!"ÐØ13Ð#Ø.0Ð ð *.¬Ô)>×)DÒ)DÑ)FÔ)Fð h	ñ h	Ñ%ˆH�oØ"Ô*ð ØØ" aÑ'Ð"à×*Ò*¨8°_ÑEÔEˆGØð Ý—’Ð<¸h¼nÑMÔMÐMØð ×'Ò'¨Ô(<Ñ=Ô=Ð=Ø×+Ò+¨DÔ,LÑMÔMÐMØ×%Ò% dÔ&8Ñ9Ô9Ð9Ø×,Ò,¨TÔ-UÑVÔVÐVõ �KŠKÐ-¨x¬~Ñ>Ô>Ð>Ø×0Ò0Ø”Ø+ØØ"ð	 1ñ ô ð ðPØ '§¢Ñ 1Ô 1Ð1Ð1Ð1Ð1Ð1Ð1�Øð ;Ø.5�D”M (Ñ+Ø×:Ò:¸7ÑCÔCÐCØ# qÑ(�OØ×8Ò8Ø œØ'2Ø#'Ø&*ð	 9ñ ô ð õ —K’KÐ 2°H´NÑCÔCÐCÑCå—N’NÐ#=¸x¼~ÑNÔNÐNð ×7Ò7¸ÀÑJÔJÐJÐJÐJÐJÐJÐJÐJØÔ.ð %Ø×<Ò<Ø$œNØ9@Ô9VÐ+c¨:¨:Ð\cØ'.Ô'?Ø*1Ô*Eð	 =ñ ô ð ð  'Ô<ð=Ð4Ð4à!<ð ð
 ŸšØ'œ~ÐNÐN°Ô1LÐNÐNñô ð ð #Ô8ð à*9Ø,-Ý.2¬nÑ.>Ô.>ÀÑ.Cð@ð @˜DÔ2°8Ñ<øð ×<Ò<Ø$œNØ+5Ø'+Ø*=ð	 =ñ ô ð ð 1×7Ò7Ø'œ~ÐBÐBÐBñô ð ð
 '6Ø()Ý*.¬.Ñ*:Ô*:¸RÑ*?ð<ð <˜Ô.¨xÑ8ùøõ
 ð ð ð Ý—’Ð/°´ÀÑCÔCÐCð ×3Ò3°G¸XÑFÔFÐFÐFÐFÐFÐFÐFÐFØ×4Ò4Ø”NØ#-Ø#Ý"% a¡&¤&ð	 5ñ ô ð ð )×/Ò/°8´>Ð0HÐ0HÀQÐ0HÐ0HÑIÔIÐIð .Ø !Ý"&¤.Ñ"2Ô"2°RÑ"7ð4ð 4�Ô& xÑ0Ð0Ð0Ð0Ð0Ñ0øøøøðøøøð( ˜aÒÑØ*ð 	ØŸšÐ#>Ñ?Ô?�Ý—’ÐOÐQWÑXÔXÐXðØCÐCÐCÐCÐCÐCØ(Ð(Ð7GÐU[Ð\Ñ\Ô\Ð\Ð\øÝ ð ð ð Ø�Dðøøøà×(Ò(¨Ñ0Ô0Ð0Ø�tØ%¨Ò)Ð)ØŸšÐ#;Ñ<Ô<ÐvÐ@v�Ý—’Ð^Ð`fÑgÔgÐgðØCÐCÐCÐCÐCÐCØ(Ð(Ð7GÐU[Ð\Ñ\Ô\Ð\Ð\øÝ ð ð ð Ø�Dðøøøà�uÝ�NŠNÐ<Ñ=Ô=Ð=Ý�KŠKÐOÑPÔPÐPð )-¬ˆÔÔ%àˆŒØ×#Ò# IÑ.Ô.Ð.õ ˜œÔ0Ñ1Ô1ˆ
Øð 	9Ý�KŠKÐ+¨ZÑ8Ô8Ð8ØŒj�oŠoÐ/ØÐ@Ð@¨4¬=×+=Ò+=Ñ+?Ô+?Ð@Ñ@Ô@ð2
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ˜QÒÐÝ�KŠKÐ=¸ÑOÔOÐOð	DØIÐIÐIÐIÐIÐIØ5Ð5°d´mÑDÔDÐDÐDÐDÐDÐDÐDˆIÝÐWÐW¨y¯}ª}¸[È"Ñ/MÔ/M×/TÒ/TÑ/VÔ/VÐWÑWÔWÑWÔWˆHÝ�KŠKÐ?ÀÑJÔJÐJÐJøÝð 	Dð 	Dð 	DÝ�NŠNÐ?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøð	Døøøð
 ×7Ò7Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9ˆØð 	7�Cð  
ð  
õ Ð5Ñ5ÝÐ=Ñ=ðð 
ñ  
ô  
ñ 
ô 
ð 	7ð ×4Ò4Ñ6Ô6Ð6ð ×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð	AØ?Ð?Ð?Ð?Ð?Ð?Ø"Ô3ð cØ*Ô;×?Ò?ÀÑBÔB�ÝÔ# D×$=Ò$=¸gÑ$FÔ$FÑGÔGÐGÝ—’ÐFÈÏÊÐT`ÑHaÔHaÑbÔbÐbð #Ô3ð cøøõ ð 	Að 	Að 	AÝ�LŠLÐ<¸aÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøõ 	Ô˜D×8Ò8Ñ:Ô:Ñ;Ô;Ð;ð Ô!ð 	Ý�KŠKØMÝ�DÔ*Ñ+Ô+Ø—	’	ÐBÐB¨4Ô+AÐBÑBÔBÑBÔBñô ð õ
 	Ô˜D×<Ò<Ñ>Ô>Ñ?Ô?Ð?å�ŠÐ*Ñ+Ô+Ð+àˆts  Á3A7 Á7
BÂBÂB Â
B)Â(B)Ä&D7 Ä7&E ÅE Å$!F Æ&F/Æ.F/Ç7H È
H3ÈH.È.H3É/J Ê
JÊJÊ6K Ë
K;ËK6Ë6K;Ë?1L1 Ì1
M Ì;MÍM Ñ<F*X(Ø(
[&Ø2B)[!Û![&Ü#\7 Ü7
]Ý]Þ^+ Þ+
^8Þ7^8â:A6d1 ä1
e ä;eåe çBi é
jé'jêjé,  Úintervalc           	   ƒ   ó6  K  — t          j        d¦  «        ƒ d{V —† i }d}| j        �rð	 | j                             ¦   «          g }t          | j        j                             ¦   «         ¦  «        D ]?\  }}|j        rŒ| j         	                    |¦  «        sŒ(| 
                    ||f¦  «         Œ@|r¿i }|D ]S\  }}	|                     d¦  «        }
t          |
¦  «        dk    r|
d         nd}|                     |d¦  «        dz   ||<   ŒTd	                     d
„ t          |                     ¦   «         ¦  «        D ¦   «         ¦  «        }t                                dt          |¦  «        |¦  «         |D �]‹\  }}	 	 ddlm} |                     d¦  «        }
t          |
¦  «        dk    r|
d         nd} |d|j        |¬¦  «         n# t*          $ r Y nw xY wd}t-          | dd¦  «        }|�W|5  | j                             |¦  «        }t1          |t2          ¦  «        r|d         n|r|nd}ddd¦  «         n# 1 swxY w Y   |€| j                             |¦  «        }|r|t6          ur|                      |¦  «         |                      |¦  «         | j        j        5  d|_        | j                             ¦   «          ddd¦  «         n# 1 swxY w Y   t                                 d|j        ¦  «         | !                    |j        d¦  «         �Œ¢# t*          $ rÞ}|                     |j        d¦  «        dz   }|||j        <   ||k    r‚t            "                    d||j        |¦  «         | j        j        5  d|_        | j                             ¦   «          ddd¦  «         n# 1 swxY w Y   | !                    |j        d¦  «         n#t                                 d|||j        |¦  «         Y d}~�Œ…d}~ww xY w|retG          d„ |D ¦   «         ¦  «        }t          |¦  «        |z
  }|rt                                d||¦  «         nt                                d|¦  «         	 |  $                    ¦   «         }|rt                                d|¦  «         n2# t*          $ r%}	t                                 d|	¦  «         Y d}	~	nd}	~	ww xY wt-          | dd¦  «        }d}tK          j%        ¦   «         |z
  |k    r®	 tM          t-          | j'        dd¦  «        pd¦  «        }|dk    r7| j         (                    |¦  «        }|rt                                d|¦  «         n2# t*          $ r%}	t                                 d|	¦  «         Y d}	~	nd}	~	ww xY wtK          j%        ¦   «         | _)        n2# t*          $ r%}t                                 d |¦  «         Y d}~nd}~ww xY wtU          |¦  «        D ]%}| j        s nt          j        d¦  «        ƒ d{V —† Œ&| j        �°îdS dS )!aˆ  Background task that finalizes expired sessions.

        Runs every ``interval`` seconds (default 5 min).  For each session
        whose reset policy has expired, invokes ``on_session_finalize``
        hooks, cleans up the cached AIAgent's tool resources, evicts the
        cache entry so it can be garbage-collected, and marks the session
        so it won't be finalized again.
        rÐ  Nr@  r<  r?  rN  r   r)   rÕ  c              3   ó*   K  — | ]\  }}|› d |› �V — ŒdS )r<  Nr  )r  rË  Úcs      r!   r  z8GatewayRunner._session_expiry_watcher.<locals>.<genexpr>p	  sA   è è € ð .ð .Ù'+ q¨!˜1˜
˜
˜q˜
˜
ð.ð .ð .ð .ð .ð .ré   z,Session expiry: %d sessions to finalize (%s)r  rp   r  r  r¬  TzSession expiry finalized for %szkSession finalize gave up after %d attempts for %s: %s. Marking as finalized to prevent infinite retry loop.z*Session finalize failed (%d/%d) for %s: %sc              3   ó.   K  — | ]\  }}|j         ¯d V — ŒdS )r)   N)Úexpiry_finalized)r  rû   rÁ  s      r!   r  z8GatewayRunner._session_expiry_watcher.<locals>.<genexpr>·	  sB   è è € ð  ð  Ù"˜a ¸!Ô:Lð Øð ð  ð  ð  ð  ð  ré   z3Session expiry done: %d finalized, %d pending retryz!Session expiry done: %d finalizedz+Agent cache idle sweep: evicted %d agent(s)zIdle agent sweep failed: %sÚ_last_session_store_prune_tsrò  r   Úsession_store_max_age_daysz,SessionStore prune: dropped %d stale entrieszSessionStore prune failed: %sz Session expiry watcher error: %s)+rž  rü  r�  r›  r  r¹   r  rò  rÅ  Ú_is_session_expiredrá   rô   rÞ   r¸   râ   Úsortedr³   rÊ   r  r  rM  r·   rÜ   rª  rÈ   r>  r¤  rÀ  r  Ú_evict_cached_agentÚ_lockr/  rË   rT  r´   r¦  Ú_sweep_idle_cached_agentsrV  rµ  r)  Úprune_old_entriesrÆ  Úrange)r¿  rÀ  Ú_finalize_failuresÚ_MAX_FINALIZE_RETRIESÚ_expired_entriesrt  rÒ   Ú
_platformsÚ_kÚ_eÚ_partsÚ_platÚ_plat_summaryr  Ú	_platformÚ_cached_agentÚ_cache_lockÚ_cachedrÁ  ÚfailuresÚ_doneÚ_failedÚ_idle_evictedÚ_last_prune_tsÚ_prune_intervalÚ_max_ageÚ_prunedrû   s                               r!   r¬  z%GatewayRunner._session_expiry_watcherP	  sL  è è € õ Œm˜BÑÔÐÐÐÐÐÐÐØ-/ÐØ !ÐØŒmñ T	'ðNDØÔ"×1Ò1Ñ3Ô3Ð3à#%Ð Ý"& tÔ'9Ô'B×'HÒ'HÑ'JÔ'JÑ"KÔ"Kð :ð :‘J�C˜ØÔ-ð !Ø ØÔ-×AÒAÀ%ÑHÔHð !Ø Ø$×+Ò+¨S°%¨LÑ9Ô9Ð9Ð9à#ð ð 24�JØ"2ð Ið I™˜˜BØ!#§¢¨#¡¤˜Ý-0°©[¬[¸1ª_¨_  q¤	 	À)˜Ø,6¯NªN¸5À!Ñ,DÔ,DÀqÑ,H˜
 5Ñ)Ð)Ø$(§I¢Ið .ð .Ý/5°j×6FÒ6FÑ6HÔ6HÑ/IÔ/Ið.ñ .ô .ñ %ô %�Mõ —K’KØFÝÐ,Ñ-Ô-¨}ñô ð ð
 #3ð <ñ <‘J�C˜ð;ð
!ØVÐVÐVÐVÐVÐVØ%(§Y¢Y¨s¡^¤^˜FÝ58¸±[´[À1²_°_¨¨q¬	¨	È"˜IØ(˜LØ 5Ø+0Ô+;Ø)2ðñ ô ð ð øõ
  )ð !ð !ð !Ø ˜Dð!øøøð
 )-˜Ý&-¨dÐ4GÈÑ&NÔ&N˜Ø&Ð2Ø!,ð {ð {Ø*.Ô*;×*?Ò*?ÀÑ*DÔ*D Ý>HÈÕRWÑ>XÔ>XÐ0z°¸´
°
ÐipÐ^zÐ^eÐ^eÐvz ð{ð {ð {ñ {ô {ð {ð {ð {ð {ð {ð {øøøð {ð {ð {ð {ð
 )Ð0Ø,0Ô,@×,DÒ,DÀSÑ,IÔ,I˜MØ(ð I¨]ÕBYÐ-YÐ-YØ ×9Ò9¸-ÑHÔHÐHð
 ×0Ò0°Ñ5Ô5Ð5ð "Ô/Ô5ð 7ð 7Ø59˜EÔ2Ø Ô.×4Ò4Ñ6Ô6Ð6ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7õ ŸšØ=Ø!Ô,ñô ð ð +×.Ò.¨uÔ/?ÀÑFÔFÐFÑFøÝ$ð ð ð Ø#5×#9Ò#9¸%Ô:JÈAÑ#NÔ#NÐQRÑ#R˜Ø?GÐ*¨5Ô+;Ñ<Ø#Ð'<Ò<Ð<Ý"ŸNšNð!Wà (¨%Ô*:¸Añô ð ð
 "&Ô!3Ô!9ð ;ð ;Ø9= Ô 6Ø $Ô 2× 8Ò 8Ñ :Ô :Ð :ð;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð /×2Ò2°5Ô3CÀTÑJÔJÐJÐJå"ŸLšLØ LØ (Ð*?ÀÔAQÐSTñô ð øøøøùøøøøðøøøð& $ð Ýð  ð  Ø&6ð ñ  ô  ñ ô �Eõ "Ð"2Ñ3Ô3°eÑ;�GØð ÝŸšØQØ! 7ñô ð ð õ
 ŸšØ?Àñô ð ðDØ$(×$BÒ$BÑ$DÔ$D�MØ$ð ÝŸšØIØ)ñô ð øøõ !ð Dð Dð DÝ—L’LÐ!>ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøõ ")¨Ð/MÈsÑ!SÔ!S�Ø"(�Ý”9‘;”; Ñ/°/ÒAÐAðJÝ#&Ý# D¤KÐ1MÈqÑQÔQÐVÐUVñ$ô $˜ð $ aš<˜<Ø&*Ô&8×&JÒ&JÈ8Ñ&TÔ&T˜GØ&ð "Ý &§¢Ø$RØ$+ñ!"ô !"ð !"øøõ %ð Jð Jð JÝŸšÐ%DÀbÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøå8<¼	¹¼�DÔ5øøÝð Dð Dð DÝ—’Ð?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøõ ˜8‘_”_ð 'ð '�Ø”}ð Ø�EÝ”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ði Œmñ T	'ð T	'ð T	'ð T	'ð T	's&  ªEV( Å;AGÇLÇ
GÇLÇGÇLÇ.>H8È,LÈ8H<	È<LÈ?H<	É A LÊ !KËLËK	ËLËK	Ë>LÌV( Ì
O=ÌAO8Í;!N(ÎO8Î(N,Î,O8Î/N,Î0AO8Ï2V( Ï8O=Ï=A*V( Ñ(1R ÒV( Ò
S	Ò$SÒ?V( ÓS	Ó	0V( Ó:A"U ÕV( Õ
VÕ'VÖV( ÖVÖV( Ö(
WÖ2W×Wc           
   ƒ   óÒ  K  — d}d}t          j        d¦  «        ƒ d{V —† | j        �r>| j        s7t	          d¦  «        D ]&}| j        s dS t          j        d¦  «        ƒ d{V —† Œ'ŒFt          j        ¦   «         }t          | j                             ¦   «         ¦  «        D �]…}| j        s dS | j        |         }||d         k     rŒ'|d         |k    r0t           
                    d	|j        |d         ¦  «         | j        |= Œc|d
         }|d         dz   }t                               d|j        ||¦  «         	 |                      ||¦  «        }	|	s)t           
                    d|j        ¦  «         | j        |= ŒÚ|	                     | j        ¦  «         |	                     | j        ¦  «         |	                     | j        ¦  «         |	                     | j        ¦  «         |	                     ¦   «         ƒ d{V —†}
|
r¤|	| j        |<   |                      |	¦  «         | j        | j        _        | j        |= |                      |j        ddd¬¦  «         t                               d|j        ¦  «         	 ddlm}  || j        ¦  «        ƒ d{V —† n÷# t:          $ r Y nëw xY w|	j        r^|	j        sW|                      |j        d|	j         |	j!        ¬¦  «         t           
                    d|j        |	j!        ¦  «         | j        |= n‚|                      |j        d|	j         |	j!        pd¬¦  «         tE          dd|dz
  z  z  |¦  «        }||d<   t          j        ¦   «         |z   |d<   t                               d|j        |¦  «         �Œë# t:          $ r�}|                      |j        ddtG          |¦  «        ¬¦  «         tE          dd|dz
  z  z  |¦  «        }||d<   t          j        ¦   «         |z   |d<   t           
                    d|j        ||¦  «         Y d}~�Œd}~ww xY wt	          d¦  «        D ]&}| j        s dS t          j        d¦  «        ƒ d{V —† Œ'| j        �°<dS dS )u  Background task that periodically retries connecting failed platforms.

        Uses exponential backoff: 30s â†’ 60s â†’ 120s â†’ 240s â†’ 300s (cap).
        Stops retrying a platform after 20 failed attempts or if the error
        is non-retryable (e.g. bad auth token).
        é   r¿  é
   NrK  r)   rN  rM  z+Giving up reconnecting %s after %d attemptsr)  z"Reconnecting %s (attempt %d/%d)...zGReconnect %s: adapter creation returned None, removing from retry queuerÚ  rG  u   âœ“ %s reconnected successfullyr   r�  rF  zAReconnect %s: non-retryable error (%s), removing from retry queuerE  zfailed to reconnectr?  z&Reconnect %s failed, next retry in %dsz)Reconnect %s error: %s, next retry in %ds)$rž  rü  r�  r®  rÎ  rV  rW  r¹   r0  r³   r´   r!  rÊ   r›  rœ  r�  rž  r[  rŸ  r›  r   rð  r¡  r‡  r  rœ  rR  r¥  rŽ  r·   r¢  rS  rP  rQ  Úminrò   )r¿  Ú_MAX_ATTEMPTSÚ_BACKOFF_CAPrû   rå  r  rÊ   rZ  Úattemptrí   r¸  rŽ  ÚbackoffrÁ  s                 r!   r­  z)GatewayRunner._platform_reconnect_watcherò	  s…  è è € ð ˆØˆåŒm˜BÑÔÐÐÐÐÐÐÐØŒmñ r	'ØÔ)ð å˜r™œð +ð +�AØœ=ð Ø˜˜Ý!œ-¨Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Øå”.Ñ"Ô"ˆCÝ  Ô!7×!<Ò!<Ñ!>Ô!>Ñ?Ô?ð bñ b�Ø”}ð Ø�F�FØÔ-¨hÔ7�Ø˜˜lÔ+Ò+Ð+Øà˜
Ô# }Ò4Ð4Ý—N’NØEØ œ¨¨ZÔ(8ñô ð ð Ô.¨xÐ8Øà"& x¤.�Ø˜zÔ*¨QÑ.�Ý—’Ø8Ø”N G¨]ñô ð ð
LØ"×2Ò2°8¸_ÑMÔM�GØ"ð !ÝŸšØeØ$œNñô ð ð !Ô2°8Ð<Ø à×/Ò/°Ô0DÑEÔEÐEØ×3Ò3°DÔ4TÑUÔUÐUØ×-Ò-¨dÔ.@ÑAÔAÐAØ×4Ò4°TÔ5]Ñ^Ô^Ð^à$+§O¢OÑ$5Ô$5Ð5Ð5Ð5Ð5Ð5Ð5�GØð .Ø29˜œ hÑ/Ø×>Ò>¸wÑGÔGÐGØ8<¼˜Ô,Ô5Ø Ô2°8Ð<Ø×<Ò<Ø$œNØ+6Ø'+Ø*.ð	 =ñ ô ð õ ŸšÐ$EÀxÄ~ÑVÔVÐVð!ØYÐYÐYÐYÐYÐYØ"9Ð"9¸$¼-Ñ"HÔ"HÐHÐHÐHÐHÐHÐHÐHÐHøÝ(ð !ð !ð !Ø ˜Dð!øøøð #Ô2ð ¸7Ô;Xð Ø ×@Ò@Ø (¤Ø/6Ø+2Ô+CØ.5Ô.Ið	 Añ ô ð õ #ŸNšNØ cØ (¤°Ô0Kñô ð ð !%Ô 6°xÐ @Ð @à ×@Ò@Ø (¤Ø/9Ø+2Ô+CØ.5Ô.IÐ.bÐMbð	 Añ ô ð õ '*¨"°°gÀ±kÑ0BÑ*CÀ\Ñ&RÔ&R˜GØ/6˜D Ñ,Ý15´Ñ1AÔ1AÀGÑ1K˜D Ñ.Ý"ŸKšKØ HØ (¤°ñô ð ùøõ !ð ð ð Ø×8Ò8Ø œØ'1Ø#'Ý&)¨!¡f¤fð	 9ñ ô ð õ " "¨¨g¸©kÑ(:Ñ";¸\ÑJÔJ�GØ'.�D˜Ñ$Ý)-¬Ñ)9Ô)9¸GÑ)C�D˜Ñ&Ý—N’NØCØ œ¨¨7ñô ð ð ð ð ð ñ øøøøðøøøõ  ˜2‘Y”Yð 'ð '�Ø”}ð Ø�F�FÝ”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ðe Œmñ r	'ð r	'ð r	'ð r	'ð r	'sF   Ä9A NÅ:C:NÉ5JÊNÊ
JÊNÊJÊC*NÎ
P$ÎBPÐP$rO  rc  rP  rQ  c             ƒ   óÎ   ‡ K  — |rd‰ _         |‰ _        |‰ _        ‰ j        �‰ j        ƒ d{V —† dS dˆ fd„}t	          j         |¦   «         ¦  «        ‰ _        ‰ j        ƒ d{V —† dS )z-Stop the gateway and disconnect all adapters.TNr   c               “   ó¼  •K  — dt           dd fd„} t                               d‰j        rdnd¦  «         d‰_        d‰_        ‰                     ¦   «         ƒ d {V —† ‰j        }‰                     |¦  «        ƒ d {V —†\  }}|�r¨t           	                    d	|‰ 
                    ¦   «         ¦  «         ‰j        rd
nd}t          ‰j                             ¦   «         ¦  «        D ]^\  }}|t          u rŒ	 ‰j                             ||¦  «         Œ,# t"          $ r&}t                               d||¦  «         Y d }~ŒWd }~ww xY w‰                     ‰j        rt(          nt*          ¦  «         t-          j        ¦   «                              ¦   «         dz   }‰j        rˆt-          j        ¦   «                              ¦   «         |k     r_‰                     d¦  «         t-          j        d¦  «        ƒ d {V —† ‰j        r)t-          j        ¦   «                              ¦   «         |k     °_ | d¦  «         ‰j        rU‰j        rN	 ‰                     ¦   «         ƒ d {V —† n2# t"          $ r%}	t                               d|	¦  «         Y d }	~	nd }	~	ww xY w‰                     |¦  «         t?          ‰dd ¦  «        }
t?          ‰dd ¦  «        }|
�Š|�ˆ|
5  t          |                      ¦   «         ¦  «        }| !                    ¦   «          d d d ¦  «         n# 1 swxY w Y   |D ]6}tE          |tF          ¦  «        r|d         n|}‰ $                    |¦  «         Œ7t          ‰j%                             ¦   «         ¦  «        D ]Ì\  }}	 | &                    ¦   «         ƒ d {V —† n8# t"          $ r+}	t                               d|j'        |	¦  «         Y d }	~	nd }	~	ww xY w	 | (                    ¦   «         ƒ d {V —† t                               d|j'        ¦  «         Œ•# t"          $ r+}	t                               d|j'        |	¦  «         Y d }	~	ŒÅd }	~	ww xY wt          ‰j)        ¦  «        D ] }|‰j*        u rŒ| +                    ¦   «          Œ!‰j)         !                    ¦   «          ‰j%         !                    ¦   «          ‰j         !                    ¦   «          ‰j,         !                    ¦   «          ‰j-         !                    ¦   «          ‰j.         !                    ¦   «          t_          ‰d¦  «        r‰j0         !                    ¦   «          ‰j1         2                    ¦   «           | d¦  «         ‰t?          ‰dd ¦  «        fD ]q}|rt?          |dd ¦  «        nd }|�t_          |d¦  «        sŒ*	 | 3                    ¦   «          Œ@# t"          $ r%}t                               d|¦  «         Y d }~Œjd }~ww xY wddl4m5}m6}  |¦   «           |¦   «          |s.	 tn          dz   8                    ¦   «          n*# t"          $ r Y nw xY wt                               d ¦  «         |r4‰ 9                    te          | :                    ¦   «         ¦  «        ¦  «         ‰j        r!‰j;        rtx          ‰_=        ‰j>        pd!‰_>        d‰_        ‰                     d"‰j>        ¦  «         t                               d#¦  «         d S )$NÚphaser   c                 óô  — 	 ddl m} |                     ¦   «         }|rt                               d| |¦  «         n3# t
          $ r&}t                               d| |¦  «         Y d}~nd}~ww xY w	 ddlm}  |¦   «          n3# t
          $ r&}t                               d| |¦  «         Y d}~nd}~ww xY w	 ddl	m
}  |¦   «          dS # t
          $ r'}t                               d	| |¦  «         Y d}~dS d}~ww xY w)
uw  Kill tool subprocesses + tear down terminal envs + browsers.

                Called twice in the shutdown path: once eagerly after a
                drain timeout forces agent interrupt (so we reclaim bash/
                sleep children before systemd TimeoutStopSec escalates to
                SIGKILL on the cgroup â€” #8202), and once as a final
                catch-all at the end of _stop_impl() for the graceful
                path or anything respawned mid-teardown.

                All steps are best-effort; exceptions are swallowed so
                one subsystem's failure doesn't block the rest.
                r   ro  z,Shutdown (%s): killed %d tool subprocess(es)z(process_registry.kill_all (%s) error: %sN)Úcleanup_all_environmentsz'cleanup_all_environments (%s) error: %s)Úcleanup_all_browsersz#cleanup_all_browsers (%s) error: %s)r™  rp  Úkill_allr³   rÊ   r·   rË   Útools.terminal_toolrð  Útools.browser_toolrñ  )rî  rp  Ú_killedrÔ  rð  rñ  s         r!   Ú_kill_tool_subprocesseszGGatewayRunner.stop.<locals>._stop_impl.<locals>._kill_tool_subprocesses‚
  s‹  € ð	XØGÐGÐGÐGÐGÐGØ.×7Ò7Ñ9Ô9�GØð ÝŸšØJØ! 7ñô ð øøõ !ð Xð Xð XÝ—L’LÐ!KÈUÐTVÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøðWØLÐLÐLÐLÐLÐLØ,Ð,Ñ.Ô.Ð.Ð.øÝ ð Wð Wð WÝ—L’LÐ!JÈEÐSUÑVÔVÐVÐVÐVÐVÐVÐVøøøøðWøøøðSØGÐGÐGÐGÐGÐGØ(Ð(Ñ*Ô*Ð*Ð*Ð*øÝ ð Sð Sð SÝ—L’LÐ!FÈÈrÑRÔRÐRÐRÐRÐRÐRÐRÐRøøøøðSøøøsE   ‚8; »
A+ÁA&Á&A+Á/B  Â 
B0Â
B+Â+B0Â4C Ã
C7ÃC2Ã2C7zStopping gateway%s...z for restartrp   FTzYGateway drain timed out after %.1fs with %d active agent(s); interrupting remaining work.Úrestart_timeoutÚshutdown_timeoutz%mark_resume_pending failed for %s: %sç      @rô  rú  zpost-interruptz-Failed to launch detached gateway restart: %sr¬  rª  r   u'   âœ— %s background-task cancel error: %su   âœ“ %s disconnectedu   âœ— %s disconnect error: %sr§  zfinal-cleanupr›  Ú_dbr   zSessionDB close error: %s)Úremove_pid_fileÚrelease_gateway_runtime_lockr‡  u€   Skipping .clean_shutdown marker â€” drain timed out with interrupted agents; next startup will suspend recently active sessions.zGateway restart requestedÚstoppedzGateway stopped)?rò   r³   rÊ   rg  r�  rf  r  rd  r   r´   ra  r¹   r¤  rò  rÀ  r›  Úmark_resume_pendingr·   rË   r  Ú!_INTERRUPT_REASON_GATEWAY_RESTARTÚ"_INTERRUPT_REASON_GATEWAY_SHUTDOWNrž  rõ  rV  r…  rü  ri  rH  rO  r  rÜ   r  r  rÈ   r>  r  r‡  Úcancel_background_tasksr!  r  r¾  rk  Úcancelra  r¥  r­  r  r§  r   r½  r   r„  rû  rü  rÅ   Útouchr'  r0  rj  r    re  r£  )rö  r6   rƒ  rÿ  Ú_resume_reasonÚ_skÚ_agentrÔ  Úinterrupt_deadlinerÁ  rÚ  Ú_cacheÚ_idle_agentsÚ_entryr  rí   Ú_taskÚ
_db_holderrú  rû  rü  r¿  s                        €r!   Ú
_stop_implz&GatewayRunner.stop.<locals>._stop_impl�
  so  øè è € ð S­sð  S°tð  Sð  Sð  Sð  SõD �KŠKØ'Ø"&Ô"9ÐA��¸rñô ð ð "ˆDŒMØ!ˆDŒNð ×:Ò:Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<àÔ1ˆGØ-1×-FÒ-FÀwÑ-OÔ-OÐ'OÐ'OÐ'OÐ'OÐ'OÐ'OÑ$ˆM˜9Øñ 8:Ý—’ØoØØ×-Ò-Ñ/Ô/ñô ð ð6 *.Ô)@ÐXÐ%Ð%ÐFXð õ $(¨Ô(<×(BÒ(BÑ(DÔ(DÑ#EÔ#Eð 	ð 	‘K�C˜ØÕ!8Ð8Ð8Ø ðØÔ*×>Ò>¸sÀNÑSÔSÐSÐSøÝ$ð ð ð ÝŸšØCØ ñô ð ð ð ð ð ð øøøøðøøøð
 ×.Ò.Ø9=Ô9PÐxÕ5Ð5ÕVxñô ð õ &-Ô%=Ñ%?Ô%?×%DÒ%DÑ%FÔ%FÈÑ%LÐ"ØÔ*ð -­wÔ/GÑ/IÔ/I×/NÒ/NÑ/PÔ/PÐSeÒ/eÐ/eØ×/Ò/°
Ñ;Ô;Ð;Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ð Ô*ð -­wÔ/GÑ/IÔ/I×/NÒ/NÑ/PÔ/PÐSeÒ/eÐ/eð (Ð'Ð(8Ñ9Ô9Ð9àÔ&ð U¨4Ô+Að UðUØ×?Ò?ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAøÝ ð Uð Uð UÝ—L’LÐ!PÐRSÑTÔTÐTÐTÐTÐTÐTÐTøøøøðUøøøð ×*Ò*¨=Ñ9Ô9Ð9õ " $Ð(;¸TÑBÔBˆKÝ˜T >°4Ñ8Ô8ˆFØÐ&¨6Ð+=Ø ð #ð #Ý#'¨¯ª©¬Ñ#8Ô#8�LØ—L’L‘N”N�Nð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð +ð :ð :�Få%/°½Ñ%>Ô%>ÐJ˜˜qœ	˜	ÀFð ð ×1Ò1°&Ñ9Ô9Ð9Ð9å%)¨$¬-×*=Ò*=Ñ*?Ô*?Ñ%@Ô%@ð 	Sð 	SÑ!�˜'ð_Ø!×9Ò9Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;øÝ ð _ð _ð _Ý—L’LÐ!JÈHÌNÐ\]Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^øøøøð_øøøðSØ!×,Ò,Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ý—K’KÐ 5°x´~ÑFÔFÐFÐFøÝ ð Sð Sð SÝ—L’LÐ!>ÀÄÐPQÑRÔRÐRÐRÐRÐRÐRÐRøøøøðSøøøõ ˜dÔ4Ñ5Ô5ð ð �Ø˜DœOÐ+Ð+ØØ—’‘”��ØÔ"×(Ò(Ñ*Ô*Ð*àŒM×ÒÑ!Ô!Ð!ØÔ ×&Ò&Ñ(Ô(Ð(ØÔ#×)Ò)Ñ+Ô+Ð+ØÔ"×(Ò(Ñ*Ô*Ð*ØÔ#×)Ò)Ñ+Ô+Ð+Ý�t˜^Ñ,Ô,ð *ØÔ!×'Ò'Ñ)Ô)Ð)ØÔ ×$Ò$Ñ&Ô&Ð&ð $Ð# OÑ4Ô4Ð4ð  $¥W¨T°?ÀDÑ%IÔ%IÐJð Bð B�
Ø:DÐN•g˜j¨%°Ñ6Ô6Ð6È$�Ø�;¥g¨c°7Ñ&;Ô&;�;ØðBØ—I’I‘K”K�K�KøÝ ð Bð Bð BÝ—L’LÐ!<¸bÑAÔAÐAÐAÐAÐAÐAÐAøøøøðBøøøð UÐTÐTÐTÐTÐTÐTÐTØˆOÑÔÐØ(Ð(Ñ*Ô*Ð*ð ð 
ðÝ!Ð$5Ñ5×<Ò<Ñ>Ô>Ð>Ð>øÝ ð ð ð Ø�Dðøøøõ —’ð'ñô ð ð ð RØ×6Ò6µs¸=×;MÒ;MÑ;OÔ;OÑ7PÔ7PÑQÔQÐQàÔ&ð U¨4Ô+Dð UÝ"C�”Ø$(Ô$5Ð$TÐ9T�Ô!à"ˆDŒNØ×'Ò'¨	°4Ô3DÑEÔEÐEÝ�KŠKÐ)Ñ*Ô*Ð*Ð*Ð*sœ   Ã4DÄ
E ÄD;Ä;E È<I É
JÉ!JÊJË6LÌLÌLÍ8NÎ
OÎ!OÏOÏ:PÐ
P<Ð!P7Ð7P<ÖV*Ö*
WÖ4W×W×;X Ø
X%Ø$X%rS  )rg  ri  rj  rk  rž  rT  )r¿  rc  rP  rQ  r  s   `    r!   rX  zGatewayRunner.stopq
  s¯   øè è € ð ð 	8Ø&*ˆDÔ#Ø%5ˆDÔ"Ø(7ˆDÔ%ØŒ?Ð&Ø”/Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØˆFðZ	+ð Z	+ð Z	+ð Z	+ð Z	+ð Z	+õx "Ô-¨j¨j©l¬lÑ;Ô;ˆŒØŒoÐÐÐÐÐÐÐÐÐré   c              ƒ   óH   K  — | j                              ¦   «         ƒ d{V —† dS )zWait for shutdown signal.N)r   Úwaitr  s    r!   Úwait_for_shutdownzGatewayRunner.wait_for_shutdown`  s3   è è € àÔ"×'Ò'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ré   c                 óê  — t          |d¦  «        rnt          |j        t          ¦  «        rT|j                             d| j        j        ¦  «         |j                             dt          | j        dd¦  «        ¦  «         |t          j	        k    r9ddl
m}m}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j        k    r9dd	lm}m}  |¦   «         st                               d
¦  «         dS  ||¦  «        S |t          j        k    r9ddlm}m}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j        k    r9ddlm}	m}
  |
¦   «         st                               d¦  «         dS  |	|¦  «        S |t          j        k    r9ddlm}m}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j        k    r9ddl m!}m"}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j#        k    r9ddl$m%}m&}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j'        k    r9ddl(m)}m*}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j+        k    r9ddl,m-}m.}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j/        k    r9ddl0m1}m2}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j3        k    r9ddl4m5}m6}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j7        k    r9ddl8m9}m:}  |¦   «         st                               d¦  «         dS  ||¦  «        S |t          j;        k    r9ddl<m=}m>}  |¦   «         st                               d ¦  «         dS  ||¦  «        S |t          j?        k    r9dd!l@mA}mB}  |¦   «         st                               d"¦  «         dS  ||¦  «        S |t          jC        k    r9dd#lDmE}mF}   | ¦   «         st                               d$¦  «         dS  ||¦  «        S |t          jG        k    r9dd%lHmI}!mJ}"  |"¦   «         st                               d&¦  «         dS  |!|¦  «        S |t          jK        k    rBdd'lLmM}#mN}$  |$¦   «         st                               d(¦  «         dS  |#|¦  «        }%| |%_O        |%S |t          jP        k    r9dd)lQmR}&mS}'  |'¦   «         st                               d*¦  «         dS  |&|¦  «        S |t          jT        k    r9dd+lUmV}(mW})  |)¦   «         st                               d,¦  «         dS  |(|¦  «        S dS )-z.Create the appropriate adapter for a platform.Úextrar&  r'  Fr   )ÚTelegramAdapterÚcheck_telegram_requirementsz+Telegram: python-telegram-bot not installedN)ÚDiscordAdapterÚcheck_discord_requirementsz!Discord: discord.py not installed)ÚWhatsAppAdapterÚcheck_whatsapp_requirementsz8WhatsApp: Node.js not installed or bridge not configured)ÚSlackAdapterÚcheck_slack_requirementszGSlack: slack-bolt not installed. Run: pip install 'hermes-agent[slack]')ÚSignalAdapterÚcheck_signal_requirementsz8Signal: SIGNAL_HTTP_URL or SIGNAL_ACCOUNT not configured)ÚHomeAssistantAdapterÚcheck_ha_requirementsz:HomeAssistant: aiohttp not installed or HASS_TOKEN not set)ÚEmailAdapterÚcheck_email_requirementszQEmail: EMAIL_ADDRESS, EMAIL_PASSWORD, EMAIL_IMAP_HOST, or EMAIL_SMTP_HOST not set)Ú
SmsAdapterÚcheck_sms_requirementszJSMS: aiohttp not installed or TWILIO_ACCOUNT_SID/TWILIO_AUTH_TOKEN not set)ÚDingTalkAdapterÚcheck_dingtalk_requirementszLDingTalk: dingtalk-stream not installed or DINGTALK_CLIENT_ID/SECRET not set)ÚFeishuAdapterÚcheck_feishu_requirementsz?Feishu: lark-oapi not installed or FEISHU_APP_ID/SECRET not set)ÚWecomCallbackAdapterÚ!check_wecom_callback_requirementsz*WeComCallback: aiohttp/httpx not installed)ÚWeComAdapterÚcheck_wecom_requirementsz;WeCom: aiohttp not installed or WECOM_BOT_ID/SECRET not set)ÚWeixinAdapterÚcheck_weixin_requirementsz*Weixin: aiohttp/cryptography not installed)ÚMattermostAdapterÚcheck_mattermost_requirementszJMattermost: MATTERMOST_TOKEN or MATTERMOST_URL not set, or aiohttp missing)ÚMatrixAdapterÚcheck_matrix_requirementsz\Matrix: mautrix not installed or credentials not set. Run: pip install 'mautrix[encryption]')ÚAPIServerAdapterÚcheck_api_server_requirementsz!API Server: aiohttp not installed)ÚWebhookAdapterÚcheck_webhook_requirementszWebhook: aiohttp not installed)ÚBlueBubblesAdapterÚcheck_bluebubbles_requirementsz`BlueBubbles: aiohttp/httpx missing or BLUEBUBBLES_SERVER_URL/BLUEBUBBLES_PASSWORD not configured)Ú	QQAdapterÚcheck_qq_requirementszIQQBot: aiohttp/httpx missing or QQ_APP_ID/QQ_CLIENT_SECRET not configured)Xr  rÈ   r  rÉ   rp  r)  r&  rÜ   r�   ÚTELEGRAMÚgateway.platforms.telegramr  r  r³   r´   ÚDISCORDÚgateway.platforms.discordr  r  ÚWHATSAPPÚgateway.platforms.whatsappr  r  ÚSLACKÚgateway.platforms.slackr  r  ÚSIGNALÚgateway.platforms.signalr  r  ÚHOMEASSISTANTÚgateway.platforms.homeassistantr  r  ÚEMAILÚgateway.platforms.emailr  r   ÚSMSÚgateway.platforms.smsr!  r"  ÚDINGTALKÚgateway.platforms.dingtalkr#  r$  ÚFEISHUÚgateway.platforms.feishur%  r&  ÚWECOM_CALLBACKÚ gateway.platforms.wecom_callbackr'  r(  ÚWECOMÚgateway.platforms.wecomr)  r*  ÚWEIXINÚgateway.platforms.weixinr+  r,  Ú
MATTERMOSTÚgateway.platforms.mattermostr-  r.  ÚMATRIXÚgateway.platforms.matrixr/  r0  rÈ  Úgateway.platforms.api_serverr1  r2  rÉ  Úgateway.platforms.webhookr3  r4  Úgateway_runnerÚBLUEBUBBLESÚgateway.platforms.bluebubblesr5  r6  ÚQQBOTÚgateway.platforms.qqbotr7  r8  )*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/  r0  r1  r2  r3  r4  rí   r5  r6  r7  r8  s*                                             r!   r›  zGatewayRunner._create_adapterd  s¹  € õ �6˜7Ñ#Ô#ð 	­
°6´<ÅÑ(FÔ(Fð 	ØŒL×#Ò#Ø)Ø”Ô3ñô ð ð ŒL×#Ò#Ø*Ý˜œÐ%?ÀÑGÔGñô ð ð
 •xÔ(Ò(Ð(Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ø.Ð.Ñ0Ô0ð Ý—’ÐLÑMÔMÐMØ�tØ"�? 6Ñ*Ô*Ð*à�Ô)Ò)Ð)Ø\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø-Ð-Ñ/Ô/ð Ý—’ÐBÑCÔCÐCØ�tØ!�> &Ñ)Ô)Ð)à�Ô*Ò*Ð*Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ø.Ð.Ñ0Ô0ð Ý—’ÐYÑZÔZÐZØ�tØ"�? 6Ñ*Ô*Ð*à�œÒ'Ð'ØVÐVÐVÐVÐVÐVÐVÐVØ+Ð+Ñ-Ô-ð Ý—’ÐhÑiÔiÐiØ�tØ�< Ñ'Ô'Ð'à�œÒ(Ð(ØYÐYÐYÐYÐYÐYÐYÐYØ,Ð,Ñ.Ô.ð Ý—’ÐYÑZÔZÐZØ�tØ �= Ñ(Ô(Ð(à�Ô/Ò/Ð/ØcÐcÐcÐcÐcÐcÐcÐcØ(Ð(Ñ*Ô*ð Ý—’Ð[Ñ\Ô\Ð\Ø�tØ'Ð'¨Ñ/Ô/Ð/à�œÒ'Ð'ØVÐVÐVÐVÐVÐVÐVÐVØ+Ð+Ñ-Ô-ð Ý—’ÐrÑsÔsÐsØ�tØ�< Ñ'Ô'Ð'à�œÒ%Ð%ØPÐPÐPÐPÐPÐPÐPÐPØ)Ð)Ñ+Ô+ð Ý—’ÐkÑlÔlÐlØ�tØ�:˜fÑ%Ô%Ð%à�Ô*Ò*Ð*Ø_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ø.Ð.Ñ0Ô0ð Ý—’ÐmÑnÔnÐnØ�tØ"�? 6Ñ*Ô*Ð*à�œÒ(Ð(ØYÐYÐYÐYÐYÐYÐYÐYØ,Ð,Ñ.Ô.ð Ý—’Ð`ÑaÔaÐaØ�tØ �= Ñ(Ô(Ð(à�Ô0Ò0Ð0ðð ð ð ð ð ð ð ð 5Ð4Ñ6Ô6ð Ý—’ÐKÑLÔLÐLØ�tØ'Ð'¨Ñ/Ô/Ð/à�œÒ'Ð'ØVÐVÐVÐVÐVÐVÐVÐVØ+Ð+Ñ-Ô-ð Ý—’Ð\Ñ]Ô]Ð]Ø�tØ�< Ñ'Ô'Ð'à�œÒ(Ð(ØYÐYÐYÐYÐYÐYÐYÐYØ,Ð,Ñ.Ô.ð Ý—’ÐKÑLÔLÐLØ�tØ �= Ñ(Ô(Ð(à�Ô,Ò,Ð,ØeÐeÐeÐeÐeÐeÐeÐeØ0Ð0Ñ2Ô2ð Ý—’ÐkÑlÔlÐlØ�tØ$Ð$ VÑ,Ô,Ð,à�œÒ(Ð(ØYÐYÐYÐYÐYÐYÐYÐYØ,Ð,Ñ.Ô.ð Ý—’Ð}Ñ~Ô~Ð~Ø�tØ �= Ñ(Ô(Ð(à�Ô,Ò,Ð,ØdÐdÐdÐdÐdÐdÐdÐdØ0Ð0Ñ2Ô2ð Ý—’ÐBÑCÔCÐCØ�tØ#Ð# FÑ+Ô+Ð+à�Ô)Ò)Ð)Ø\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ø-Ð-Ñ/Ô/ð Ý—’Ð?Ñ@Ô@Ð@Ø�tØ$�n VÑ,Ô,ˆGØ%)ˆGÔ"ØˆNà�Ô-Ò-Ð-ØhÐhÐhÐhÐhÐhÐhÐhØ1Ð1Ñ3Ô3ð Ý—’ð   Bñ  Cô  Cð  CØ�tØ%Ð% fÑ-Ô-Ð-à�œÒ'Ð'ØPÐPÐPÐPÐPÐPÐPÐPØ(Ð(Ñ*Ô*ð Ý—’ÐjÑkÔkÐkØ�tØ�9˜VÑ$Ô$Ð$àˆtré   c                 ó  — |j         t          j        t          j        fv rdS |j        }|sdS i t          j        d“t          j        d“t          j        d“t          j        d“t          j	        d“t          j
        d“t          j        d	“t          j        d
“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“}t          j        dt          j        di}i t          j        d“t          j        d“t          j        d“t          j        d“t          j	        d“t          j
        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d “t          j        d!“t          j        d"“t          j        d#“t          j        d$“}|                     |j         d%¦  «        }|r+t-          j        |d%¦  «                             ¦   «         d&v rdS |j         t          j        k    rPt3          |d'd¦  «        r?t-          j        d(d)¦  «                             ¦   «                              ¦   «         }|d*v rdS |j         t          j        k    r)t-          j        d+d%¦  «                             ¦   «         rdS |j         r|j         j        nd%}| j                             ||¦  «        rdS t-          j        |                     |j         d%¦  «        d%¦  «                             ¦   «         }	d%}
|j        d,v r@t-          j        |                     |j         d%¦  «        d%¦  «                             ¦   «         }
t-          j        d-d%¦  «                             ¦   «         }|	s-|
s+|s)t-          j        d.d%¦  «                             ¦   «         d&v S |
r>|j        d,v r5|j        r.d/„ |
                      d0¦  «        D ¦   «         }d1|v s	|j        |v rdS tC          ¦   «         }|	r2| "                    d2„ |	                      d0¦  «        D ¦   «         ¦  «         |r2| "                    d3„ |                      d0¦  «        D ¦   «         ¦  «         d1|v rdS |h}d4|v r.| #                    |                      d4¦  «        d5         ¦  «         |j         t          j        k    r�tC          ¦   «         }|D ]$}| "                    tI          |¦  «        ¦  «         Œ%|r|}| "                    tI          |¦  «        ¦  «         tK          |¦  «        }|r| #                    |¦  «         tM          ||z  ¦  «        S )6ao  
        Check if a user is authorized to use the bot.
        
        Checks in order:
        1. Per-platform allow-all flag (e.g., DISCORD_ALLOW_ALL_USERS=true)
        2. Environment variable allowlists (TELEGRAM_ALLOWED_USERS, etc.)
        3. DM pairing approved list
        4. Global allow-all (GATEWAY_ALLOW_ALL_USERS=true)
        5. Default: deny
        TFr]  r^  r_  r`  ra  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  ÚTELEGRAM_GROUP_ALLOWED_USERSÚQQ_GROUP_ALLOWED_USERSrt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r€  r�  r‚  rƒ  rp   rp  Úis_botÚDISCORD_ALLOW_BOTSr¦  )Úmentionsrê  ÚDISCORD_ALLOWED_ROLES>   ÚforumrØ  rn  ro  c                 ó^   — h | ]*}|                      ¦   «         ¯|                      ¦   «         ’Œ+S r  ©ró   )r  rC  s     r!   ú	<setcomp>z4GatewayRunner._is_user_authorized.<locals>.<setcomp>m  s=   € ð !ð !ð !Ø$+ÈWÏ]Ê]É_Ì_ð!Ø—’‘”ð!ð !ð !ré   Ú,Ú*c              3   óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S rr  rg  ©r  Úuids     r!   r  z4GatewayRunner._is_user_authorized.<locals>.<genexpr>v  s<   è è € ÐcÐc¨sÐWZ×W`ÒW`ÑWbÔWbÐc˜sŸyšy™{œ{ÐcÐcÐcÐcÐcÐcré   c              3   óf   K  — | ],}|                      ¦   «         ¯|                      ¦   «         V — Œ-d S rr  rg  rl  s     r!   r  z4GatewayRunner._is_user_authorized.<locals>.<genexpr>x  s<   è è € ÐaÐa¨sÐUX×U^ÒU^ÑU`ÔU`Ða˜sŸyšy™{œ{ÐaÐaÐaÐaÐaÐaré   ú@r   )'r  r�   rC  rÉ  Úuser_idr9  r;  r=  r?  rA  rE  rG  rS  rU  rI  rK  rO  rM  rQ  rZ  r\  r¸   r   r²   rõ   rÜ   ró   r!  r¸  Úis_approvedrB  rC  rô   r½  r  r  Ú_expand_whatsapp_auth_aliasesÚ_normalize_whatsapp_identifierr¶  )r¿  r$  rp  Úplatform_env_mapÚplatform_group_env_mapÚplatform_allow_all_mapÚplatform_allow_all_varÚ
allow_botsÚplatform_nameÚplatform_allowlistÚgroup_allowlistÚglobal_allowlistÚallowed_group_idsÚallowed_idsÚ	check_idsÚnormalized_allowed_idsÚ
allowed_idÚnormalized_user_ids                     r!   Ú_is_user_authorizedz!GatewayRunner._is_user_authorized   s  € ð  Œ?�xÔ5µxÔ7GÐHÐHÐHØ�4à”.ˆØð 	Ø�5ð
ÝÔÐ7ð
åÔÐ5ð
õ ÔÐ7ð
õ ŒNÐ1ð	
õ
 ŒOÐ3ð
õ ŒNÐ1ð
õ ŒLÐ-ð
õ ÔÐ!;ð
õ ŒOÐ3ð
õ ÔÐ7ð
õ ŒOÐ3ð
õ ŒNÐ1ð
õ Ô#Ð%Cð
õ ŒOÐ3ð
õ Ô Ð"=ð
õ  ŒNÐ.ð!
Ðõ& ÔÐ=ÝŒNÐ4ð"
Ðð"
ÝÔÐ9ð"
åÔÐ7ð"
õ ÔÐ9ð"
õ ŒNÐ3ð	"
õ
 ŒOÐ5ð"
õ ŒNÐ3ð"
õ ŒLÐ/ð"
õ ÔÐ!=ð"
õ ŒOÐ5ð"
õ ÔÐ9ð"
õ ŒOÐ5ð"
õ ŒNÐ3ð"
õ Ô#Ð%Eð"
õ ŒOÐ5ð"
õ Ô Ð"?ð"
õ  ŒNÐ0ð!"
Ðð( "8×!;Ò!;¸F¼OÈRÑ!PÔ!PÐØ!ð 	¥b¤iÐ0FÈÑ&KÔ&K×&QÒ&QÑ&SÔ&SÐWkÐ&kÐ&kØ�4ð Œ?�hÔ.Ò.Ð.µ7¸6À8ÈUÑ3SÔ3SÐ.ÝœÐ#7¸Ñ@Ô@×FÒFÑHÔH×NÒNÑPÔPˆJØÐ0Ð0Ð0Ø�tð ŒO�xÔ/Ò/Ð/Ý”	Ð1°2Ñ6Ô6×<Ò<Ñ>Ô>ð 0ð �4ð 28´ÐH˜œÔ-Ð-ÀbˆØÔ×)Ò)¨-¸ÑAÔAð 	Ø�4õ  œYÐ'7×';Ò';¸F¼OÈRÑ'PÔ'PÐRTÑUÔU×[Ò[Ñ]Ô]ÐØˆØÔÐ1Ð1Ð1Ý œiÐ(>×(BÒ(BÀ6Ä?ÐTVÑ(WÔ(WÐY[Ñ\Ô\×bÒbÑdÔdˆOÝœ9Ð%<¸bÑAÔA×GÒGÑIÔIÐà!ð 	\¨/ð 	\ÐBRð 	\å”9Ð6¸Ñ;Ô;×AÒAÑCÔCÐG[Ð[Ð[ð ð 	˜vÔ/Ð3EÐEÐEÈ&Ì.ÐEð!ð !Ø/>×/DÒ/DÀSÑ/IÔ/Ið!ñ !ô !Ðð Ð'Ð'Ð'¨6¬>Ð=NÐ+NÐ+NØ�tõ ‘e”eˆØð 	dØ×ÒÐcÐcÐ6H×6NÒ6NÈsÑ6SÔ6SÐcÑcÔcÑcÔcÐcØð 	bØ×ÒÐaÐaÐ6F×6LÒ6LÈSÑ6QÔ6QÐaÑaÔaÑaÔaÐað �+ÐÐØ�4à�Iˆ	Ø�'ˆ>ˆ>Ø�MŠM˜'Ÿ-š-¨Ñ,Ô,¨QÔ/Ñ0Ô0Ð0ð Œ?�hÔ/Ò/Ð/Ý%(¡U¤UÐ"Ø)ð Yð Y�
Ø&×-Ò-Õ.KÈJÑ.WÔ.WÑXÔXÐXÐXØ%ð 5Ø4�à×ÒÕ:¸7ÑCÔCÑDÔDÐDÝ!?ÀÑ!HÔ!HÐØ!ð 2Ø—’Ð0Ñ1Ô1Ð1å�I Ñ+Ñ,Ô,Ð,ré   c                 óº  — t          | dd¦  «        }|rht          |d¦  «        rX|rVt          |d¦  «        r|j                             |¦  «        nd}|r(dt          |di ¦  «        v r|                     |¦  «        S |r"t          |d¦  «        r|j        dk    r|j        S |�ri t          j        d“t          j        d	“t          j	        d
“t          j
        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“t          j        d“}t/          j        |                     |d¦  «        d¦  «                             ¦   «         rdS t/          j        dd¦  «                             ¦   «         rdS dS )u»  Return how unauthorized DMs should be handled for a platform.

        Resolution order:
        1. Explicit per-platform ``unauthorized_dm_behavior`` in config â€” always wins.
        2. Explicit global ``unauthorized_dm_behavior`` in config â€” wins when no per-platform.
        3. When an allowlist (``PLATFORM_ALLOWED_USERS`` or ``GATEWAY_ALLOWED_USERS``) is
           configured, default to ``"ignore"`` â€” the allowlist signals that the owner has
           deliberately restricted access; spamming unknown contacts with pairing codes
           is both noisy and a potential info-leak. (#9337)
        4. No allowlist and no explicit config â†’ ``"pair"`` (open-gateway default).
        r)  NÚget_unauthorized_dm_behaviorrU  Úunauthorized_dm_behaviorr  Úpairr]  r^  r_  r`  ra  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rp   Úignorern  )rÜ   r  rU  r¸   r…  r†  r�   r9  r;  r=  r?  rA  rE  rG  rS  rU  rI  rK  rO  rM  rQ  rZ  r\  r   r²   ró   )r¿  r  r)  Úplatform_cfgrt  s        r!   Ú_get_unauthorized_dm_behaviorz+GatewayRunner._get_unauthorized_dm_behavior’  s7  € õ ˜˜x¨Ñ.Ô.ˆð ð 	E•g˜fÐ&DÑEÔEð 	EÈ(ð 	EÝ=DÀVÈ[Ñ=YÔ=YÐc˜6Ô+×/Ò/°Ñ9Ô9Ð9Ð_cˆLØð EÐ :½gÀlÐT[Ð]_Ñ>`Ô>`Ð `Ð `à×:Ò:¸8ÑDÔDÐDð ð 	7•g˜fÐ&@ÑAÔAð 	7ØÔ.°&Ò8Ð8ØÔ6Ð6ð
 ñ 	 ð ÝÔ!Ð#;ð åÔ Ð#:ð õ Ô!Ð#;ð õ ”Ð#8ð	 õ
 ”Ð#9ð õ ”Ð#8ð õ ”Ð#6ð õ Ô#Ð%?ð õ ”Ð#9ð õ Ô!Ð#;ð õ ”Ð#9ð õ ”Ð#8ð õ Ô'Ð)Gð õ ”Ð#9ð õ Ô$Ð&Að õ  ”Ð#5ð! Ðõ$ ŒyÐ)×-Ò-¨h¸Ñ;Ô;¸RÑ@Ô@×FÒFÑHÔHð  Ø�xåŒ9Ð,¨bÑ1Ô1×7Ò7Ñ9Ô9ð 	Ø�8àˆvré   c              ƒ   ót6  K  — |j         }t          t          |dd¦  «        ¦  «        }|�s*	 ddlm}  |d|| | j        ¬¦  «        }n4# t          $ r'}t                               d|¦  «         g }Y d}~nd}~ww xY w|D ]×}t          |t          ¦  «        sŒ|                     d	¦  «        }|d
k    rMt                               d|                     d¦  «        |j        r|j        j        nd|j        pd¦  «          dS |dk    rI|                     d¦  «        }	t          |	t           ¦  «        rt#          j        ||	¬¦  «        }|j         } n	|dk    r nŒØ|r�n²|j        €'t                               d|j        j        ¦  «         dS |                      |¦  «        �snt                               d|j        |j        |j        j        ¦  «         |j        dk    �r/|                      |j        ¦  «        dk    �r|j        r|j        j        nd}
| j                             |
|j        ¦  «        rdS | j                             |
|j        |j        pd¦  «        }|rM| j                             |j        ¦  «        }|r+|                     |j        d|› d|
› d|› d�¦  «        ƒ d{V —† nb| j                             |j        ¦  «        }|r!|                     |j        d¦  «        ƒ d{V —† | j                             |
|j        ¦  «         dS |                      |¦  «        }t          | di ¦  «        }|                     |¦  «        �r|j         pd !                    ¦   «         }| "                    ¦   «         }|dv rd}n	|dv rd }n|}|rÀtF          d!z  }	 | $                    d"¦  «        }| %                    |¦  «         |                     |¦  «         n7# tL          $ r*}t                               d#|¦  «         d$|› �cY d}~S d}~ww xY w| '                    |d¦  «         tQ          |¦  «        d%k    r|n|dd%…         d&z   }d'|› d(�S tS          tU          j+        d)d*¦  «        ¦  «        }| j,                             |d¦  «        }|| j-        v �rz|�rwt]          j.        ¦   «         |z
  }| j-                             |¦  «        }tS          d+¦  «        }d}|r¤t_          |d,¦  «        r”	 | 0                    ¦   «         }|                     d-tS          d+¦  «        ¦  «        }d.|                     d/d¦  «        › d0|d1›d2|                     d3d¦  «        › d4|                     d5d¦  «        › �}n# t          $ r Y nw xY w|dk    rtc          |d6z  d7¦  «        ntS          d+¦  «        }|td          uo|dk    r||k    p||k    }|rKt                               d8|||||¦  «         |  3                    |d9¬:¦  «         |  4                    |¦  «         || j-        v �r{| "                    ¦   «         d;k    r|  5                    |¦  «        ƒ d{V —†S dd<l6m7}m8}  | "                    ¦   «         }!|!r | |!¦  «        nd}"|"r&|"j9        d=k    r|  :                    |¦  «        ƒ d{V —†S |"rL|"j9        d>k    rA|  ;                    ||tx          d?¬@¦  «        ƒ d{V —† t                               dA|¦  «         dBS |"rJ|"j9        dCk    r?|  ;                    ||tz          dD¬@¦  «        ƒ d{V —† |  >                    |¦  «        ƒ d{V —†S | "                    ¦   «         dEv rÑ| ?                    ¦   «          !                    ¦   «         }#|#sdFS | j                             |j        ¦  «        }|rDt�          |#t‚          jB        |j         |jC        |jD        ¬G¦  «        }$|  E                    ||$|¦  «         |  F                    || j                             |j        ¦  «        ¬H¦  «        }%|%dIk    rdJS dK|%› dL�S |"�rš|"j9        dMk    �rŽ| ?                    ¦   «          !                    ¦   «         }&|&sdNS | j-                             |¦  «        }'|'td          u rZ| j                             |j        ¦  «        }|r7t�          |&t‚          jB        |j         |jC        |jD        ¬G¦  «        }$|$|jG        |<   dOS |'r‹t_          |'dM¦  «        r{	 |' H                    |&¦  «        }(n8# t          $ r+})t                               dP||)¦  «         dQ|)› �cY d})~)S d})~)ww xY w|(r(|&ddR…         tQ          |&¦  «        dRk    rdSndz   }*dT|*› dU�S dVS | j                             |j        ¦  «        }|r7t�          |&t‚          jB        |j         |jC        |jD        ¬G¦  «        }$|$|jG        |<   dWS |"r|"j9        dXk    rdYS |"rJ|"j9        dZv rA|"j9        d[k    r|  I                    |¦  «        ƒ d{V —†S |  J                    |¦  «        ƒ d{V —†S |"r&|"j9        d\k    r|  K                    |¦  «        ƒ d{V —†S |"r&|"j9        d]k    r|  L                    |¦  «        ƒ d{V —†S |"rU|"j9        d^v rL|"j9        d_k    r|  M                    |¦  «        ƒ d{V —†S |"j9        d`k    r|  N                    |¦  «        ƒ d{V —†S |"r¡|"j9        |v r˜|"j9        dak    r|  O                    |¦  «        ƒ d{V —†S |"j9        dbk    r|  P                    |¦  «        ƒ d{V —†S |"j9        dck    r|  Q                    |¦  «        ƒ d{V —†S |"j9        ddk    r|  R                    |¦  «        ƒ d{V —†S |"rde|"j9        › df�S |jS        t‚          jT        k    rTt                               dg|¦  «         | j                             |j        ¦  «        }|rt«          |jG        ||¦  «         dS tS          tU          j+        dhdi¦  «        ¦  «        }+| j,                             |d¦  «        },|j        t¬          jW        k    r¢|jS        t‚          jB        k    r�|+dk    r‡|,r…t]          j.        ¦   «         |,z
  |+k    rkt                               djt]          j.        ¦   «         |,z
  |¦  «         | j                             |j        ¦  «        }|rt«          |jG        ||dk¬l¦  «         dS | j-                             |¦  «        }'|'td          u r…| "                    ¦   «         d>k    r2|  4                    |¦  «         t                               dm|¦  «         dnS | j                             |j        ¦  «        }|rt«          |jG        ||dk¬l¦  «         dS | jX        rn|  Y                    ¦   «         r|  Z                    ||¦  «         |  Y                    ¦   «         rdo|  [                    ¦   «         › dp�ndq|  [                    ¦   «         › dr�S | j\        dsk    r3t                               dt|¦  «         |  Z                    ||¦  «         dS t                               du|¦  «         |' ]                    |j         ¦  «         || jG        v r| jG        |xx         dv|j         z   z  cc<   n|j         | jG        |<   dS | "                    ¦   «         }-ddwl6m^}.m_}/m8}0 |-r |0|-¦  «        nd}1|1r|1j9        n|-}2|-�rg |/|2¦  «        �r[| ?                    ¦   «          !                    ¦   «         }3|j        r|j        j        nd|j        |2|-|3|3dxœ}4	 | j`         a                    dy|2› �|4¦  «        ƒ d{V —†}5n5# t          $ r(}6t                               dz|2|6¦  «         g }5Y d}6~6nd}6~6ww xY w|5D �]µ}7t          |7t          ¦  «        sŒt!          |7                     d{d¦  «        ¦  «         !                    ¦   «          b                    ¦   «         }8|8r|8dk    rŒi|8d|k    r8|7                     d}¦  «        }9t          |9t           ¦  «        r|9r|9c S d~|-› d�c S |8d€k    r2|7                     d}¦  «        }9t          |9t           ¦  «        r|9r|9ndc S |8dk    rÐt!          |7                     d�d¦  «        ¦  «         !                    ¦   «          c                    d4¦  «        }:|:s�Œ1t!          |7                     d‚d¦  «        ¦  «         !                    ¦   «         };d4|:› d|;› � !                    ¦   «         |_         | "                    ¦   «         }-|-r |0|-¦  «        nd}1|1r|1j9        n|-}2 n�Œ·|2dCk    r|  >                    |¦  «        ƒ d{V —†S |2dak    r|  O                    |¦  «        ƒ d{V —†S |2dbk    r|  P                    |¦  «        ƒ d{V —†S |2dck    r|  Q                    |¦  «        ƒ d{V —†S |2d;k    r|  5                    |¦  «        ƒ d{V —†S |2d\k    r|  K                    |¦  «        ƒ d{V —†S |2d=k    r|  :                    |¦  «        ƒ d{V —†S |2d>k    r|  d                    |¦  «        ƒ d{V —†S |2dƒk    r|  e                    |¦  «        ƒ d{V —†S |2d„k    r|  f                    |¦  «        ƒ d{V —†S |2d`k    r|  N                    |¦  «        ƒ d{V —†S |2d_k    r|  M                    |¦  «        ƒ d{V —†S |2dXk    r|  g                    |¦  «        ƒ d{V —†S |2d…k    r|  h                    |¦  «        ƒ d{V —†S |2d†k    r|  i                    |¦  «        ƒ d{V —†S |2d‡k    r|  j                    |¦  «        ƒ d{V —†S |2dˆk    r|  k                    |¦  «        ƒ d{V —†S |2d‰k    r|  l                    |¦  «        ƒ d{V —†S |2dŠk    r|  m                    |¦  «        ƒ d{V —†S |2d‹k    r|  n                    |¦  «        ƒ d{V —†S |2dŒk    r|  o                    |¦  «        ƒ d{V —†S |2d[k    r|  I                    |¦  «        ƒ d{V —†S |2d|k    r|  J                    |¦  «        ƒ d{V —†S |2ddk    r|  R                    |¦  «        ƒ d{V —†S |2d�k    r|  p                    |¦  «        ƒ d{V —†S |2dŽk    r|  q                    |¦  «        ƒ d{V —†S |2d�k    r|  r                    |¦  «        ƒ d{V —†S |2d�k    r|  s                    |¦  «        ƒ d{V —†S |2d‘k    r|  t                    |¦  «        ƒ d{V —†S |2d]k    r|  L                    |¦  «        ƒ d{V —†S |2dMk    rC| ?                    ¦   «          !                    ¦   «         }<|<sd’S 	 |<|_         n# t          $ r Y nw xY w|2d“k    r|  u                    |¦  «        ƒ d{V —†S | jX        rdq|  [                    ¦   «         › d”�S |-�r:t          | jv        t          ¦  «        r| jv                             d•i ¦  «        pi }=nt          | jv        d•i ¦  «        pi }=t          |=t          ¦  «        si }=|-|=v �rÎ|=|-         }>|>                     d–¦  «        d—k    ræ|>                     d˜d¦  «        }?|?rÈ	 tï          jx        |?tî          jy        jz        tî          jy        jz        ¬™¦  «        ƒ d{V —†}@tï          j{        |@ |                    ¦   «         dš¬›¦  «        ƒ d{V —†\  }A}B|Ap|B }                    ¦   «          !                    ¦   «         }C|Cr|CndœS # tî          j~        $ r Y d�S t          $ r}dž|› �cY d}~S d}~ww xY wdŸ|-› d �S |>                     d–¦  «        d¡k    r¨|>                     d¢d¦  «         !                    ¦   «         }D|Drx|D                     d4¦  «        r|Dnd4|D› �}D|D c                    d4¦  «        }E| ?                    ¦   «          !                    ¦   «         }F|D› d|F› � !                    ¦   «         |_         |E}-ndŸ|-› d£�S dŸ|-› d¤�S |-r»	 dd¥lm€}G  |G|-                     d¦d§¦  «        ¦  «        }H|Hr`| ?                    ¦   «          !                    ¦   «         }F |H|F¦  «        }Itï          j�        |I¦  «        r|Iƒ d{V —†}I|Irt!          |I¦  «        ndS n2# t          $ r%}t                               d¨|¦  «         Y d}~nd}~ww xY w|-�rF	 dd©l‚mƒ}Jm„}Km…}L  |J¦   «         }M |L|-¦  «        }N|N��|M|N                              dªd¦  «        }O|j        r|j        j        nd}P|Pr|Ordd«l†m‡}Q |O |Q|P¬¬¦  «        v r	d­|O› d®|P› d¯�S | ?                    ¦   «          !                    ¦   «         }R |K|N|R|¬°¦  «        }S|Sr|S|_         na�t          |-¦  «        }T|Tr|TS |-                     d¦d§¦  «        |.vr5t                               d±|-|j        r|j        j        nd²¦  «         d³|-› d´�S n2# t          $ r%}t                               dµ|¦  «         Y d}~nd}~ww xY wtd          | j-        |<   t]          j.        ¦   «         | j,        |<   |  ‰                    |¦  «        }U	 |  Š                    ||||U¦  «        ƒ d{V —†	 | j-                             |¦  «        td          u r|  4                    |¦  «         S | j,         '                    |d¦  «         t_          | d¶¦  «        r| j‹         '                    |d¦  «         S S # | j-                             |¦  «        td          u r|  4                    |¦  «         w | j,         '                    |d¦  «         t_          | d¶¦  «        r| j‹         '                    |d¦  «         w w xY w)·a‘  
        Handle an incoming message from any platform.
        
        This is the core message processing pipeline:
        1. Check user authorization
        2. Check for commands (/new, /reset, etc.)
        3. Check for running agent and interrupt if needed
        4. Get or create session
        5. Build context for agent
        6. Run agent conversation
        7. Return response
        ÚinternalFr   r  Úpre_gateway_dispatch)rã   r  r›  z*pre_gateway_dispatch invocation failed: %sNr  Úskipz8pre_gateway_dispatch skip: reason=%s platform=%s chat=%sr\  rN  Úrewriter]  ©r]  Úallowz(Ignoring message with no user_id from %sz Unauthorized user: %s (%s) on %srD  r‡  rp   z;Hi~ I don't recognize you yet!

Here's your pairing code: `z5`

Ask the bot owner to run:
`hermes pairing approve rñ   r	  z<Too many pairing requests right now~ Please try again later!r¯  )Úapproverr  Úy)ÚdenyÚnoÚnú.update_responseú.tmpz#Failed to write update response: %su/   âœ— Failed to send response to update process: rå  õ   â€¦u
   âœ“ Sent `z` to the update process.ru   é  Úinfrß  Úseconds_since_activityz | last_activity=Úlast_activity_descrÔ  ú.0fzs ago) | iteration=rÍ  r  rÎ  ræ  i   zWEvicting stale _running_agents entry for %s (age: %.0fs, idle: %.0fs, timeout: %.0fs)%sÚstale_running_agent_eviction©r\  Ústatus)ÚACTIVE_SESSION_BYPASS_COMMANDSÚresolve_commandrc  rX  Ústop_command©Úinterrupt_reasonÚinvalidation_reasonu@   STOP for session %s â€” agent interrupted, session lock releasedõ+   âš¡ Stopped. You can continue this session.ÚnewÚnew_command)rl  ÚqzUsage: /queue <prompt>)r]  rØ   r$  rÝ  Úchannel_promptrz  r)   zQueued for the next turn.zQueued for the next turn. (z queued)ÚsteerzUsage: /steer <prompt>u9   Agent still starting â€” /steer queued for the next turn.zSteer failed for session %s: %su   âš ï¸� Steer failed: rÐ  ú...u8   â�© Steer queued â€” arrives after the next tool call: 'ú'zSteer rejected (empty payload).u4   No active agent â€” /steer queued for the next turn.rb   u=   Agent is running â€” wait or /stop first, then switch models.)r’  r”  r’  ÚagentsÚ
background)ÚyoloÚverboser²  r³  ÚhelpÚcommandsÚprofiler  u   â�³ Agent is running â€” `/zE` can't run mid-turn. Wait for the current response or `/stop` first.uF   PRIORITY photo follow-up for session %s â€” queueing without interruptÚ&HERMES_TELEGRAM_FOLLOWUP_GRACE_SECONDSz3.0uV   Telegram follow-up arrived %.2fs after run start for %s â€” queueing without interruptT)Ú
merge_textu7   HARD STOP (pending) for session %s â€” sentinel cleareduE   âš¡ Force-stopped. The agent was still starting â€” session unlocked.rÆ  rÇ  rÈ  rÉ  rl  z'PRIORITY queue follow-up for session %sz!PRIORITY interrupt for session %srÛ   )ÚGATEWAY_KNOWN_COMMANDSÚis_gateway_known_commandr£  )r  rp  r¬   Úraw_commandr­   r–  zcommand:z/command:%s hook dispatch failed (non-fatal): %sÚdecisionr”  rï   z
Command `/z` was blocked by a hook.Úhandledrù   r–  Ú	reasoningrª  ÚpersonalityÚretryÚundoÚsethomeÚcompressÚusageÚinsightsz
reload-mcprË   ÚtitleÚresumeÚbranchÚrollbackzJUsage: /steer <prompt>  (no agent is running; sending as a normal message)r  z) and is not accepting new work right now.Úquick_commandsrK  Úexecr¬   )r<  r=  rK  ©r6   zCommand returned no output.zQuick command timed out (30s).zQuick command error: zQuick command '/z' has no command defined.Úaliasr¹  z' has no target defined.z4' has unsupported type (supported: 'exec', 'alias').)Úget_plugin_command_handlerrû   rü   z.Plugin command dispatch failed (non-fatal): %s)Úget_skill_commandsÚbuild_skill_invocation_messageÚresolve_skill_command_keyr  )Úget_disabled_skill_namesr"  r  z** skill is disabled for z(.
Enable it with: `hermes skills config`©Útask_iduO   Unrecognized slash command /%s from %s â€” replying with unknown-command noticerR  zUnknown command `/zl`. Type /commands to see what's available, or resend without the leading slash to send as a regular message.z*Skill command check failed (non-fatal): %sr§  )Œr$  r¶  rÜ   r  r  r›  r·   r³   r´   rÈ   rÉ   r¸   rÊ   r  r!  rC  rò   Údataclassesr
  rp  rË   rƒ  Ú	user_namerB  rŠ  r¸  Ú_is_rate_limitedÚgenerate_coder‡  r	  Ú_record_rate_limitr*  r]  ró   Úget_commandrÅ   Úwith_suffixrû  rñ  rT  rÞ   r³  r   r²   ra  r¤  rV  r  rß  ÚmaxrÀ  Ú"_invalidate_session_run_generationÚ_release_running_agent_stateÚ_handle_status_commandÚhermes_cli.commandsr¢  r£  r  Ú_handle_restart_commandÚ_interrupt_and_clear_sessionÚ_INTERRUPT_REASON_STOPÚ_INTERRUPT_REASON_RESETÚ_handle_reset_commandÚget_command_argsrœ   r�   ÚTEXTrÝ  r¬  rs  r}  r¥  r­  Ú_handle_approve_commandÚ_handle_deny_commandÚ_handle_agents_commandÚ_handle_background_commandÚ_handle_yolo_commandÚ_handle_verbose_commandÚ_handle_help_commandÚ_handle_commands_commandÚ_handle_profile_commandÚ_handle_update_commandrØ   rà   rž   r�   r9  rf  rm  rÄ  rj  rc  rb  r¹  rº  rº  Úemit_collectrõ   ÚlstripÚ_handle_stop_commandÚ_handle_reasoning_commandÚ_handle_fast_commandÚ_handle_model_commandÚ_handle_personality_commandÚ_handle_retry_commandÚ_handle_undo_commandÚ_handle_set_home_commandÚ_handle_compress_commandÚ_handle_usage_commandÚ_handle_insights_commandÚ_handle_reload_mcp_commandÚ_handle_debug_commandÚ_handle_title_commandÚ_handle_resume_commandÚ_handle_branch_commandÚ_handle_rollback_commandÚ_handle_voice_commandr)  rž  Úcreate_subprocess_shellr?  ÚPIPEÚwait_forÚcommunicateÚdecodeÚTimeoutErrorrß   rÎ  ÚiscoroutineÚagent.skill_commandsrÏ  rÐ  rÑ  r  rÒ  r  Ú_begin_session_run_generationÚ_handle_message_with_agentr§  )Vr¿  rã   r$  Úis_internalr  Ú_hook_resultsÚ	_hook_excÚ_resultÚ_actionÚ	_new_textry  Úcoderí   Ú
_quick_keyÚ_update_promptsr­  rE  Úresponse_textÚresponse_pathÚtmprÁ  ÚlabelÚ_raw_stale_timeoutÚ	_stale_tsÚ
_stale_ageÚ_stale_agentÚ_stale_idleÚ_stale_detailÚ_saÚ	_wall_ttlÚ_should_evictÚ_DEDICATED_HANDLERSÚ_resolve_cmd_innerÚ_evt_cmdÚ_cmd_def_innerÚqueued_textrn  r|  Ú
steer_textrã  Úacceptedr½   ÚpreviewÚ_telegram_followup_graceÚ_started_atr¬   r¹  rº  Ú_resolve_cmdÚ_cmd_defÚ	canonicalr–  Úhook_ctxÚhook_resultsÚ	_hook_errÚhook_resultr¼  rï   rª  Únew_argsÚsteer_payloadrÊ  ÚqcmdÚexec_cmdÚprocr<  r=  rS  r¹  Útarget_commandÚ	user_argsrÎ  Úplugin_handlerrG  rÏ  rÐ  rÑ  Ú
skill_cmdsÚcmd_keyÚ_skill_namerÖ  Ú_get_plat_disabledÚuser_instructionr  Ú_unavail_msgÚ_run_generationsV                                                                                         r!   r�  zGatewayRunner._handle_messageÊ  s�#  è è € ð ”ˆõ �7 5¨*°eÑ<Ô<Ñ=Ô=ˆð ñ  	ð
#ØJÐJÐJÐJÐJÐJØ , Ø*ØØ Ø"&Ô"4ð	!ñ !ô !��øõ ð #ð #ð #Ý—’ÐKÈYÑWÔWÐWØ "������øøøøð#øøøð )ð ð �Ý! '­4Ñ0Ô0ð ØØ!Ÿ+š+ hÑ/Ô/�Ø˜fÒ$Ð$Ý—K’KØRØŸš HÑ-Ô-Ø17´ÐO˜œÔ-Ð-ÀiØœÐ3¨)ñ	ô ð ð  ˜4˜4Ø˜iÒ'Ð'Ø '§¢¨FÑ 3Ô 3�IÝ! )­SÑ1Ô1ð .Ý +Ô 3°EÀ	Ð JÑ JÔ J˜Ø!&¤˜Ø�EØ˜gÒ%Ð%Ø�Eð &ð ð *	ÙØŒ^Ð#õ
 �LŠLÐCÀVÄ_ÔEZÑ[Ô[Ð[Ø�4Ø×)Ò)¨&Ñ1Ô1ñ !	Ý�NŠNÐ=¸v¼~ÈvÔO_ÐagÔapÔavÑwÔwÐwàÔ 4Ò'Ñ'¨D×,NÒ,NÈvÌÑ,_Ô,_ÐciÒ,iÑ,iØ9?¼Ð W ¤Ô 5Ð 5Èi�ð Ô%×6Ò6°}ÀfÄnÑUÔUð  Ø˜4ØÔ)×7Ò7Ø! 6¤>°6Ô3CÐ3IÀrñô �ð ð YØ"œm×/Ò/°´Ñ@Ô@�GØð Ø%ŸlšlØ"œNðOØ:>ðOð Oð 8EðOð Oð HLðOð Oð Oñô ð ð ð ð ð ð ð øð #œm×/Ò/°´Ñ@Ô@�GØð Ø%ŸlšlØ"œNð6ñô ð ð ð ð ð ð ð ð Ô&×9Ò9¸-ÈÌÑXÔXÐXØ�4ð ×1Ò1°&Ñ9Ô9ˆ
Ý! $Ð(@À"ÑEÔEˆØ×Ò˜zÑ*Ô*ñ 	DØ”:Ð# ×*Ò*Ñ,Ô,ˆCà×#Ò#Ñ%Ô%ˆCØÐ(Ð(Ð(Ø #��Ø˜Ð&Ð&Ø #��à #�Øð DÝ ,Ð/AÑ A�ðQØ'×3Ò3°FÑ;Ô;�CØ—N’N =Ñ1Ô1Ð1Ø—K’K Ñ.Ô.Ð.Ð.øÝð Qð Qð QÝ—N’NÐ#HÈ!ÑLÔLÐLØPÈQÐPÐPÐPÐPÐPÐPÐPÐPøøøøðQøøøð  ×#Ò# J°Ñ5Ô5Ð5Ý),¨]Ñ);Ô);¸rÒ)AÐ)A˜˜À}ÐUXÐVXÐUXÔGYÐ\aÑGa�ØC EÐCÐCÐCÐCõ #¥2¤9Ð-CÀTÑ#JÔ#JÑKÔKÐØÔ+×/Ò/°
¸AÑ>Ô>ˆ	Ø˜Ô-Ð-Ñ-°)Ñ-Ýœ™œ yÑ0ˆJØÔ/×3Ò3°JÑ?Ô?ˆLõ   ™,œ,ˆKØˆMØð 
¥¨Ð6LÑ MÔ Mð 
ð	Ø&×;Ò;Ñ=Ô=�CØ"%§'¢'Ð*BÅEÈ%ÁLÄLÑ"QÔ"Q�Kðe¨C¯GªGÐ4HÈ)Ñ,TÔ,Tð eð eØ'Ð4ðeð eà'*§w¢wÐ/?ÀÑ'CÔ'Cðeð eàFIÇgÂgÐN^Ð`aÑFbÔFbðeð eð "�Møõ
 !ð ð ð Ø�Dðøøøð
 ?QÐSTÒ>TÐ>T�Ð.°Ñ3°TÑ:Ô:Ð:ÕZ_Ð`eÑZfÔZfˆIàÕ$;Ð;ð à'¨!Ò+ÐQ°Ð?QÒ0Qð .Ø! IÒ-ð	 ð ð >Ý—’ðBà 
¨KØ&¨ñ	ô ð ð ×7Ò7ØØ9ð 8ñ ô ð ð ×1Ò1°*Ñ=Ô=Ð=à˜Ô-Ð-Ñ-Ø× Ò Ñ"Ô" hÒ.Ð.Ø!×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ðð ð ð ð ð ð ð ð ×(Ò(Ñ*Ô*ˆHØ=EÐOÐ/Ð/°Ñ9Ô9Ð9È4ˆNàð A .Ô"5¸Ò"BÐ"BØ!×9Ò9¸%Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ð ð E .Ô"5¸Ò"?Ð"?Ø×7Ò7ØØÝ%;Ø(6ð	 8ñ ô ð ð ð ð ð ð ð õ —’Ð^Ð`jÑkÔkÐkØDÐDð ð 
? .Ô"5¸Ò">Ð">à×7Ò7ØØÝ%<Ø(5ð	 8ñ ô ð ð ð ð ð ð ð ð "×7Ò7¸Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð × Ò Ñ"Ô" nÐ4Ð4Ø#×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>�Ø"ð 4Ø3Ð3Øœ-×+Ò+¨F¬OÑ<Ô<�Øð JÝ#/Ø(Ý%0Ô%5Ø$œ|Ø#(Ô#3Ø',Ô';ð$ñ $ô $�Lð ×&Ò& z°<ÀÑIÔIÐIØ×)Ò)¨*¸d¼m×>OÒ>OÐPVÔP_Ñ>`Ô>`Ð)ÑaÔa�Ø˜A’:�:Ø6Ð6ØD°UÐDÐDÐDÐDð ñ 'N .Ô"5¸Ò"@Ñ"@Ø"×3Ò3Ñ5Ô5×;Ò;Ñ=Ô=�
Ø!ð 4Ø3Ð3Ø $Ô 4× 8Ò 8¸Ñ DÔ D�Ø Õ$;Ð;Ð;à"œm×/Ò/°´Ñ@Ô@�GØð MÝ'3Ø!+Ý)4Ô)9Ø#(¤<Ø',Ô'7Ø+0Ô+?ð(ñ (ô (˜ð AM˜Ô1°*Ñ=ØVÐVØ ð 	=¥W¨]¸GÑ%DÔ%Dð 	=ð=Ø#0×#6Ò#6°zÑ#BÔ#B˜˜øÝ$ð =ð =ð =ÝŸšÐ'HÈ*ÐVYÑZÔZÐZØ<°sÐ<Ð<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð=øøøð  ð eØ",¨S¨b¨S¤/½cÀ*¹o¼oÐPRÒ>RÐ>R°U°UÐXZÑ"[˜ØdÐZaÐdÐdÐdÐdØ<Ð<àœ-×+Ò+¨F¬OÑ<Ô<�Øð IÝ#/Ø'Ý%0Ô%5Ø$œ|Ø#(Ô#3Ø',Ô';ð$ñ $ô $�Lð =I�GÔ-¨jÑ9ØMÐMð ð W .Ô"5¸Ò"@Ð"@ØVÐVð ð > .Ô"5Ð9LÐ"LÐ"LØ!Ô&¨)Ò3Ð3Ø!%×!=Ò!=¸eÑ!DÔ!DÐDÐDÐDÐDÐDÐDÐDØ!×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð ð @ .Ô"5¸Ò"AÐ"AØ!×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ð ð D .Ô"5¸Ò"EÐ"EØ!×<Ò<¸UÑCÔCÐCÐCÐCÐCÐCÐCÐCð ð E .Ô"5Ð9LÐ"LÐ"LØ!Ô&¨&Ò0Ð0Ø!%×!:Ò!:¸5Ñ!AÔ!AÐAÐAÐAÐAÐAÐAÐAØ!Ô&¨)Ò3Ð3Ø!%×!=Ò!=¸eÑ!DÔ!DÐDÐDÐDÐDÐDÐDÐDð ð D .Ô"5Ð9LÐ"LÐ"LØ!Ô&¨&Ò0Ð0Ø!%×!:Ò!:¸5Ñ!AÔ!AÐAÐAÐAÐAÐAÐAÐAØ!Ô&¨*Ò4Ð4Ø!%×!>Ò!>¸uÑ!EÔ!EÐEÐEÐEÐEÐEÐEÐEØ!Ô&¨)Ò3Ð3Ø!%×!=Ò!=¸eÑ!DÔ!DÐDÐDÐDÐDÐDÐDÐDØ!Ô&¨(Ò2Ð2Ø!%×!<Ò!<¸UÑ!CÔ!CÐCÐCÐCÐCÐCÐCÐCð ð ðQ°.Ô2Eð Qð Qð Qðð
 Ô!¥[Ô%6Ò6Ð6Ý—’ÐeÐgqÑrÔrÐrØœ-×+Ò+¨F¬OÑ<Ô<�Øð ^Ý/°Ô0IÈ:ÐW\Ñ]Ô]Ð]Ø�tå',Ý”	ÐBÀEÑJÔJñ(ô (Ð$ð Ô1×5Ò5°jÀ!ÑDÔDˆKà”¥8Ô#4Ò4Ð4ØÔ&­+Ô*:Ò:Ð:Ø,¨qÒ0Ð0Øð 1å”Y‘[”[ ;Ñ.Ð3KÒKÐKå—’ØlÝ”I‘K”K +Ñ-Øñô ð ð
 œ-×+Ò+¨F¬OÑ<Ô<�Øð Ý/ØÔ1Ø"ØØ#'ð	ñ ô ð ð �tà Ô0×4Ò4°ZÑ@Ô@ˆMØÕ 7Ð7Ð7à×$Ò$Ñ&Ô&¨&Ò0Ð0à×5Ò5°jÑAÔAÐAÝ—K’KÐ YÐ[eÑfÔfÐfØbÐbð œ-×+Ò+¨F¬OÑ<Ô<�Øð Ý/ØÔ1Ø"ØØ#'ð	ñ ô ð ð �tØŒ~ð Ø×3Ò3Ñ5Ô5ð LØ×8Ò8¸ÀUÑKÔKÐKð ×7Ò7Ñ9Ô9ðwÐs 4×#=Ò#=Ñ#?Ô#?ÐsÐsÐsÐsàv¨4×+EÒ+EÑ+GÔ+GÐvÐvÐvðð
 Ô$¨Ò/Ð/Ý—’ÐFÈ
ÑSÔSÐSØ×4Ò4°ZÀÑGÔGÐGØ�tÝ�LŠLÐ<¸jÑIÔIÐIØ×#Ò# E¤JÑ/Ô/Ð/Ø˜TÔ3Ð3Ð3ØÔ& zÐ2Ð2Ô2°d¸U¼ZÑ6GÑGÐ2Ð2Ñ2Ð2à5:´Z�Ô& zÑ2Ø�4ð ×#Ò#Ñ%Ô%ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð -4Ð=�<�< Ñ(Ô(Ð(¸ˆØ%-Ð:�H”M�M°7ˆ	ð ñ .	Ð/Ð/°	Ñ:Ô:ñ .	Ø×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆHà5;´_ÐL˜FœOÔ1Ð1È"Ø!œ>Ø$Ø&Ø Ø$ðð ˆHð	"Ø%)¤Z×%<Ò%<Ø*˜yÐ*Ð*¨Hñ&ô &ð  ð  ð  ð  ð  ð  ��øõ ð "ð "ð "Ý—’ØEØ˜yñô ð ð  "������øøøøð"øøøð  ,ð ñ �Ý! +­tÑ4Ô4ð ØÝ˜{Ÿš¨z¸2Ñ>Ô>Ñ?Ô?×EÒEÑGÔG×MÒMÑOÔO�Øð  8¨wÒ#6Ð#6ØØ˜vÒ%Ð%Ø)Ÿošo¨iÑ8Ô8�GÝ! '­3Ñ/Ô/ð '°Gð 'Ø&˜˜˜ØI¨ÐIÐIÐIÐIÐIÐIØ˜yÒ(Ð(Ø)Ÿošo¨iÑ8Ô8�GÝ&0°½#Ñ&>Ô&>ÐTÀ7ÐT˜7˜7ÐPTÐTÐTÐTØ˜yÒ(Ð(Ý"%Ø#Ÿš¨¸Ñ;Ô;ñ#ô #ç’e‘g”gŸfšf S™kœkð  ð 'ð !Ù Ý" ;§?¢?°:¸rÑ#BÔ#BÑCÔC×IÒIÑKÔK�HØ!= [Ð!=Ð!=°8Ð!=Ð!=×!CÒ!CÑ!EÔ!E�E”JØ#×/Ò/Ñ1Ô1�GØ8?ÐI˜|˜|¨GÑ4Ô4Ð4ÀT�HØ19Ð F ¤ ¸w�IØ�Eñ )ð ˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜
Ò"Ð"Ø×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à˜	Ò!Ð!Ø×5Ò5°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à˜Ò Ð Ø×4Ò4°UÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à˜Ò Ð Ø×4Ò4°UÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à˜	Ò!Ð!Ø×5Ò5°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜Ò#Ð#Ø×7Ò7¸Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜	Ò!Ð!Ø×5Ò5°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜Ò%Ð%Ø×9Ò9¸%Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@à˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜	Ò!Ð!Ø×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à˜
Ò"Ð"Ø×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜
Ò"Ð"Ø×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à˜Ò$Ð$Ø×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à˜	Ò!Ð!Ø×5Ò5°eÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à˜ÒÐØ×2Ò2°5Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à˜Ò Ð Ø×4Ò4°UÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:à˜Ò Ð Ø×4Ò4°UÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à˜Ò Ð Ø×4Ò4°UÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;à˜
Ò"Ð"Ø×6Ò6°uÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à˜Ò$Ð$Ø×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à˜ÒÐð "×2Ò2Ñ4Ô4×:Ò:Ñ<Ô<ˆMØ ð dØcÐcðØ*�”
�
øÝð ð ð Ø�ðøøøð ˜ÒÐØ×3Ò3°EÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:àŒ>ð 	mØl T×%?Ò%?Ñ%AÔ%AÐlÐlÐlÐlð ñ '	lÝ˜$œ+¥tÑ,Ô,ð RØ!%¤§¢Ð1AÀ2Ñ!FÔ!FÐ!LÈ"��å!(¨¬Ð6FÈÑ!KÔ!KÐ!QÈr�Ý˜n­dÑ3Ô3ð $Ø!#�Ø˜.Ð(Ñ(Ø% gÔ.�Ø—8’8˜FÑ#Ô# vÒ-Ð-Ø#Ÿxšx¨	°2Ñ6Ô6�HØð Uð?Ý)0Ô)HØ (Ý'.Ô'9Ô'>Ý'.Ô'9Ô'>ð*ñ *ô *ð $ð $ð $ð $ð $ð $˜Dõ
 4;Ô3CÀD×DTÒDTÑDVÔDVÐ`bÐ3cÑ3cÔ3cÐ-cÐ-cÐ-cÐ-cÐ-cÐ-c™N˜F FØ&,Ð&6°×%>Ò%>Ñ%@Ô%@×%FÒ%FÑ%HÔ%H˜FØ-3Ð#V 6 6Ð9VÐVøÝ&Ô3ð Dð Dð DØ#CÐ#CÐ#CÝ(ð ?ð ?ð ?Ø#>¸1Ð#>Ð#>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð?øøøð  U°'ÐTÐTÐTÐTØ—X’X˜fÑ%Ô%¨Ò0Ð0Ø!ŸXšX h°Ñ3Ô3×9Ò9Ñ;Ô;�FØð TØ+1×+<Ò+<¸SÑ+AÔ+AÐ!S  À|È6À|À|˜Ø)/¯ª°sÑ);Ô);˜Ø$)×$:Ò$:Ñ$<Ô$<×$BÒ$BÑ$DÔ$D˜	Ø(.Ð%<Ð%<°Ð%<Ð%<×%BÒ%BÑ%DÔ%D˜œ
Ø"0˜˜ð  T°'ÐSÐSÐSÐSàk¨gÐkÐkÐkÐkð ð 	RðRØIÐIÐIÐIÐIÐIð "<Ð!;¸G¿OºOÈCÐQTÑ<UÔ<UÑ!VÔ!V�Ø!ð ;Ø %× 6Ò 6Ñ 8Ô 8× >Ò >Ñ @Ô @�IØ+˜^¨IÑ6Ô6�FÝÔ*¨6Ñ2Ô2ð .Ø'-      ˜Ø*0Ð:�3˜v™;œ;˜;°dÐ:ð;øõ ð Rð Rð RÝ—’ÐMÈqÑQÔQÐQÐQÐQÐQÐQÐQøøøøðRøøøð ñ :	Nð9Nðð ð ð ð ð ð ð ð ð ð
 0Ð/Ñ1Ô1�
Ø3Ð3°GÑ<Ô<�ØÐ&ð
 #-¨WÔ"5×"9Ò"9¸&À"Ñ"EÔ"E�KØ5;´_ÐN˜FœOÔ1Ð1È$�EØð  ð ØdÐdÐdÐdÐdÐdØ&Ð*<Ð*<ÀeÐ*LÑ*LÔ*LÐLÐLð!J¨ð !Jð !JÈuð !Jð !Jð !Jðð (-×'=Ò'=Ñ'?Ô'?×'EÒ'EÑ'GÔ'GÐ$Ø8Ð8ØÐ!1¸:ðñ ô �Cð ð )Ø%(˜œ
øö
 $<¸GÑ#DÔ#D�LØ#ð ,Ø+Ð+ð —’ s¨CÑ0Ô0Ð8NÐNÐNÝŸšðCà#Ø5;´_ÐM˜FœOÔ1Ð1È#ñ	ô ð ð5°ð 5ð 5ð 5ðøøõ ð Nð Nð NÝ—’ÐIÈ1ÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøõ ,CˆÔ˜ZÑ(Ý.2¬i©k¬kˆÔ 
Ñ+Ø×<Ò<¸ZÑHÔHˆð	<Ø×8Ò8¸ÀÈ
ÐTcÑdÔdÐdÐdÐdÐdÐdÐdÐdð Ô#×'Ò'¨
Ñ3Ô3Õ7NÐNÐNØ×1Ò1°*Ñ=Ô=Ð=Ð=ð Ô'×+Ò+¨J¸Ñ=Ô=Ð=Ý˜4 Ñ0Ô0ð <ØÔ%×)Ò)¨*°dÑ;Ô;Ð;Ð;ð<øð Ô#×'Ò'¨
Ñ3Ô3Õ7NÐNÐNØ×1Ò1°*Ñ=Ô=Ð=Ð=ð Ô'×+Ò+¨J¸Ñ=Ô=Ð=Ý˜4 Ñ0Ô0ð <ØÔ%×)Ò)¨*°dÑ;Ô;Ð;Ð;ð<øøøs,  ¬A Á
A8ÁA3Á3A8Î?O Ï
PÏPÏ<PÐPÓ&BU) Õ)
U6Õ5U6ã#c9 ã9
d.ä d)ä#d.ä)d.ü$} ý
}4ý}/ý/}4ÁT?AU ÁU
AUÁUAUÁY BA[ Á[A\Á[,	A\Á[5A[?Á[9A\Á[?A\Á_BAa Áa
AbÁa)Ab	Áb	AbÁbA2Af( ÁdAAf( ÁeAAf( Áf(
AgÁf2AgÁgAgÁhAj7 Áj7B Al7Úhistoryc          	   ƒ   ó&
  ‡ K  — |pg }|j         pdŠ t          |t          | j        dd¦  «        t          | j        dd¦  «        ¬¦  «        }|r|j        rd|j        › d‰ › �Š |j        �r©g }g }t          |j        ¦  «        D ]´\  }}|t          |j        ¦  «        k     r|j        |         nd}	|	 	                    d	¦  «        s|j
        t          j        k    r|                     |¦  «         |	 	                    d
¦  «        s|j
        t          j        t          j        fv r|                     |¦  «         Œµ|r|                      ‰ |¦  «        ƒ d{V —†Š |r¼|                      ‰ |¦  «        ƒ d{V —†Š d}
t%          ˆ fd„|
D ¦   «         ¦  «        rƒ| j                             |j        ¦  «        }|j        r	d|j        ind}|rP	 d}|                      ¦   «         r|dz  }|                     |j        ||¬¦  «        ƒ d{V —† n# t4          $ r Y nw xY w|j        �rl|j
        t          j        k    �rVddl}h d£}t          |j        ¦  «        D �]8\  }}|t          |j        ¦  «        k     r|j        |         nd}	|	dv rZt:          j                             |¦  «        d                               ¦   «         }||v rd}	n| !                    |¦  «        \  }}|r|}	|	 	                    d¦  «        sŒ¡t:          j         "                    |¦  «        }| #                    dd¦  «        }t          |¦  «        dk    r|d         n|}tI          j%        dd|¦  «        }|	 	                    d¦  «        r
d|› d|› d�}n	d |› d!|› d"�}|› d#‰ › �Š �Œ:t          |d$d¦  «        r|j&        r|j'        dd%…         }d&|› d'‰ › �Š d(‰ v �rW	 dd)l(m)} dd*l*m+} t:          j,                             d+t:          j         -                    d,¦  «        ¦  «        }t]          ¦   «         } || j/        | j0        p|                     d-¦  «        pd|                     d.¦  «        pd¬/¦  «        } |‰ |||¬0¦  «        ƒ d{V —†}|j1        r^| j                             |j        ¦  «        }|r;|                     |j        d1 2                    |j3        ¦  «        pd2¦  «        ƒ d{V —† dS |j4        r|j5        Š n2# t4          $ r%}tl           7                    d3|¦  «         Y d}~nd}~ww xY w‰ S )4a  Prepare inbound event text for the agent.

        Keep the normal inbound path and the queued follow-up path on the same
        preprocessing pipeline so sender attribution, image enrichment, STT,
        document notes, reply context, and @ references all behave the same.
        rp   r&  Tr'  Fr(  ú[ú] r×   rÚ   N)úNo STT providerzSTT is disabledzcan't listenÚVOICE_TOOLS_OPENAI_KEYc              3   ó    •K  — | ]}|‰v V — Œ	d S rr  r  )r  ÚmarkerÚmessage_texts     €r!   r  z>GatewayRunner._prepare_inbound_message_text.<locals>.<genexpr>  s(   øè è € ÐNÐN°&�v Ð-ÐNÐNÐNÐNÐNÐNré   rF  u
  ðŸŽ¤ I received your voice message but can't transcribe it â€” no speech-to-text provider is configured.

To enable voice: install faster-whisper (`pip install faster-whisper` in the Hermes venv) and set `stt.enabled: true` in config.yaml, then /restart the gateway.z@

For full setup instructions, type: `/skill hermes-agent-setup`r  r   >   ú.mdú.cfgú.csvú.iniú.logú.txtú.xmlú.ymlú.jsonú.tomlú.yaml)rp   zapplication/octet-streamr)   z
text/plain)zapplication/útext/rû   r?  r@  z	[^\w.\- ]rZ  z![The user sent a text document: 'zC'. Its content has been included below. The file is also saved at: rÙ   z[The user sent a document: 'z'. The file is saved at: z3. Ask the user what they'd like you to do with it.]rÛ  Úreply_to_textéô  z[Replying to: "z"]

ro  )Ú#preprocess_context_references_async)Úget_model_context_lengthr5   Ú~rc   rd   ©rc   rd   )r4   Úcontext_lengthÚallowed_rootrÛ   zContext injection refused.z(@ context reference expansion failed: %s)8r]  r™   rÜ   r)  rÖ  rÕ   rÝ   rÞ   rÖ   rß   rØ   r�   rà   rá   ÚVOICEÚAUDIOÚ_enrich_message_with_visionÚ"_enrich_message_with_transcriptionr  r‡  r¸   r  rF  rå  r	  rC  r·   ÚDOCUMENTÚ	mimetypesr   r   Úsplitextrõ   Ú
guess_typeÚbasenamerô   ÚreÚsubÚreply_to_message_idr[  Úagent.context_referencesr]  Úagent.model_metadatar^  r   rŠ  r¾   Ú_modelÚ	_base_urlÚblockedrâ   ÚwarningsÚexpandedrï   r³   rË   )!r¿  rã   r$  rF  Ú_is_shared_multi_userÚimage_pathsÚaudio_pathsrå   r   rç   Ú_stt_fail_markersÚ_stt_adapterÚ	_stt_metaÚ_stt_msgÚ
_mimetypesÚ_TEXT_EXTENSIONSÚ_extÚguessedrû   rk  rä   Údisplay_nameÚcontext_noteÚreply_snippetr]  r^  Ú_msg_cwdÚ_msg_runtimeÚ_msg_ctx_lenÚ_ctx_resultÚ_adapterr½   rN  s!                                   @r!   Ú_prepare_inbound_message_textz+GatewayRunner._prepare_inbound_message_textØ  sò  øè è € ð �-˜RˆØ”zÐ' Rˆå <ØÝ$+¨D¬KÐ9RÐTXÑ$YÔ$YÝ%,¨T¬[Ð:TÐV[Ñ%\Ô%\ð!
ñ !
ô !
Ðð
 !ð 	B VÔ%5ð 	BØA˜vÔ/ÐAÐA°<ÐAÐAˆLàÔñ 0	!ØˆKØˆKÝ$ UÔ%5Ñ6Ô6ð -ð -‘��4Ø01µC¸Ô8IÑ4JÔ4JÒ0JÐ0J˜Ô)¨!Ô,Ð,ÐPR�Ø×#Ò# HÑ-Ô-ð -°Ô1CÅ{ÔGXÒ1XÐ1XØ×&Ò& tÑ,Ô,Ð,Ø×#Ò# HÑ-Ô-ð -°Ô1CÍÔHYÕ[fÔ[lÐGmÐ1mÐ1mØ×&Ò& tÑ,Ô,Ð,øàð Ø%)×%EÒ%EØ Øñ&ô &ð  ð  ð  ð  ð  ð  �ð
 ð  !Ø%)×%LÒ%LØ Øñ&ô &ð  ð  ð  ð  ð  ð  �ð%Ð!õ ÐNÐNÐNÐNÐ<MÐNÑNÔNÑNÔNð !Ø#'¤=×#4Ò#4°V´_Ñ#EÔ#E�LØCIÔCSÐ ] ¨fÔ.>Ð ?Ð ?ÐY]�IØ#ð !ð!ð!=ð %ð  $×4Ò4Ñ6Ô6ð qØ (Ð,pÑ p Ø".×"3Ò"3Ø &¤Ø (Ø)2ð #4ñ #ô #ð ð ð ð ð ð ð ð øõ
  )ð !ð !ð !Ø ˜Dð!øøøð Ôñ "	C Ô 2µkÔ6JÒ JÑ JØ*Ð*Ð*Ð*àyÐyÐyÐÝ$ UÔ%5Ñ6Ô6ð Cñ C‘��4Ø01µC¸Ô8IÑ4JÔ4JÒ0JÐ0J˜Ô)¨!Ô,Ð,ÐPR�ØÐ<Ð<Ð<Ýœ7×+Ò+¨DÑ1Ô1°!Ô4×:Ò:Ñ<Ô<�DØÐ/Ð/Ð/Ø ,˜˜à%/×%:Ò%:¸4Ñ%@Ô%@™
˜ Ø"ð ,Ø$+˜EØ×'Ò'Ð(AÑBÔBð Øåœ7×+Ò+¨DÑ1Ô1�Ø Ÿš s¨AÑ.Ô.�Ý+.¨u©:¬:¸ª?¨?˜u Qœx˜xÀ�Ý!œv l°C¸ÑFÔF�à×#Ò# GÑ,Ô,ð ð>¸Lð >ð >à6:ð>ð >ð >ð !�LðM°|ð Mð MØ15ðMð Mð Mð !ð
 #/ÐBÐB°LÐBÐB�‘å�5˜/¨4Ñ0Ô0ð 	Q°UÔ5Nð 	Qð "Ô/°°°Ô5ˆMØP¨]ÐPÐPÀ,ÐPÐPˆLà�,ÐÑðNØXÐXÐXÐXÐXÐXØIÐIÐIÐIÐIÐIåœ:Ÿ>š>¨.½"¼'×:LÒ:LÈSÑ:QÔ:QÑRÔR�Ý<Ñ>Ô>�Ø7Ð7Ø”KØ!œ^ÐQ¨|×/?Ò/?À
Ñ/KÔ/KÐQÈrØ(×,Ò,¨YÑ7Ô7Ð=¸2ð ñ  ô  �ð
 %HÐ$GØ Ø Ø#/Ø!)ð	%ñ %ô %ð ð ð ð ð ð �ð Ô&ð  Ø#œ}×0Ò0°´ÑAÔA�HØð Ø&ŸmšmØ"œNØ ŸIšI kÔ&:Ñ;Ô;Ð[Ð?[ñô ð ð ð ð ð ð ð ð  ˜4ØÔ'ð 7Ø#.Ô#6�LøøÝð Nð Nð NÝ—’ÐGÈÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøð Ðs1   Ç>H È
HÈHÎ;DS ÓS Ó
TÓ)T	Ô	Tr  Úrun_generationc              ƒ   ó:3  ‡ˆ‡‰‡Š‡‹K  — t          j         ¦   «         }t          |j        d¦  «        r|j        j        nt	          |j        ¦  «        }|j        pddd…                              dd¦  «        }t                               d||j	        p|j
        pd|j        pd|¦  «         | j                             |¦  «        }|j        }	t          |d	d
¦  «        r|                      |	d¦  «         |j        |j        k    pt          |d	d
¦  «        }
|
rC| j                             d|j        r|j        j        nd|j
        |j        |	dœ¦  «        ƒ d{V —† t-          || j        |¦  «        }|                      |¦  «        }d
}	 ddl}t5          t6          d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   t;          |                     d¦  «        pi                      dd
¦  «        ¦  «        }n# t>          $ r Y nw xY wtA          ||¬¦  «        }t          |d	d
¦  «        �r¸t          |dd¦  «        pd}|dk    rd}n|dk    rd}nd}|dz   |z   }	 | j        j         !                    |j        t          |dd¦  «        ¬¦  «        }|j        r|j        j        nd}t          |dd
¦  «        }|dk    p|j"        o
|o||j#        v}|rÒ| j$                             |j        ¦  «        }|r±|dk    rd}nA|dk    rd |j%        › d!�}n/|j&        d"z  }|j&        d"z  }|s|› d#�n|r|› d$|› d%�n|› d%�}d&|› �}d'|› d(�}	 |  '                    ¦   «         }|r|› d|› �}n# t>          $ r Y nw xY w| (                    |j        |t          |d)d¦  «        ¬*¦  «        ƒ d{V —† n2# t>          $ r%}t           )                    d+|¦  «         Y d}~nd}~ww xY wd
|_*        d|_+        t          |d,d¦  «        } |
�r2| �r/tY          | t          ¦  «        r| gnt[          | ¦  «        }!	 dd-l.m/}"m0}# g }$g }%|!D ]r}& |"|&|¬.¦  «        }'|'rF|'\  }(})}*d/|*› d0�}+ |#|(|)|+¦  «        },|,r*|$ 1                    |,¦  «         |% 1                    |&¦  «         ŒWt           2                    d1|&¦  «         Œs|$rP|$ 1                    |j        ¦  «         d 3                    |$¦  «        |_        t                               d2|%|	¦  «         n3# t>          $ r&}t           2                    d3|!|¦  «         Y d}~nd}~ww xY w| j         4                    |j        ¦  «        }-|-�r[tk          |-¦  «        d4k    �rGdd5l6m7}.m8}/ d6}0d7}1d8}2d}3d}4d}5d}6i }7	 tr          d9z  }8|8 :                    ¦   «         �r‚ddl}9t5          |8d¬¦  «        5 }:|9                     |:¦  «        pi }7ddd¦  «         n# 1 swxY w Y   |7                     d:i ¦  «        };tY          |;t          ¦  «        r|;}0n®tY          |;tv          ¦  «        r™|;                     d;¦  «        p|;                     d:¦  «        p|0}0|;                     d<¦  «        }<|<�(	 ty          |<¦  «        }3n# tz          t|          f$ r Y nw xY w|;                     d=¦  «        pd}4|;                     d>¦  «        pd}5|7                     d?i ¦  «        }=tY          |=tv          ¦  «        r7t	          |=                     d@d8¦  «        ¦  «         ?                    ¦   «         dAv }2	 |  @                    ||	tY          |7tv          ¦  «        r|7nd¬B¦  «        \  }0}>|>                     d=¦  «        p|4}4|>                     d>¦  «        p|5}5|>                     dC¦  «        p|6}6n# t>          $ r Y nw xY w|3�€I|5�rF	 	 ddDlAmB}?  |?|7¦  «        }@n<# t>          $ r/ |7                     dE¦  «        }@tY          |@tZ          ¦  «        sg }@Y nw xY w|@D ]Û}AtY          |Atv          ¦  «        sŒ|A                     d>¦  «        pd C                    dF¦  «        }B|Br—|B|5 C                    dF¦  «        k    r~|A                     dGi ¦  «        }CtY          |Ctv          ¦  «        rQ|C                     |0i ¦  «        }DtY          |Dtv          ¦  «        r&|D                     d<¦  «        }E|E�ty          |E¦  «        }3 nŒÜn# tz          t|          f$ r Y nw xY wn# t>          $ r Y nw xY w|2�r¤ |/|0|5pd|6pd|3|4pd¬H¦  «        }Fty          |F|1z  ¦  «        }Gty          |FdIz  ¦  «        }Htk          |-¦  «        }I|jD        }J|Jdk    r|JŠˆdJ}Kn |.|-¦  «        ŠˆdK}KdL}L‰ˆ|Gk    p|I|Lk    }M|M�r+t                               dM|I‰ˆdN›|Kty          |1dOz  ¦  «        |FdN›|GdN›¦  «         |jE        r	dP|jE        ind}N	 ddQlFmG}O |  @                    ||	tY          |7tv          ¦  «        r|7nd¬B¦  «        \  }0}>|>                     dC¦  «        �radR„ |-D ¦   «         ŠŠtk          ‰Š¦  «        d4k    �rA |Od¼i |>¤|0d4d8d8dSg|j        dTœ¤ŽŠ‰	 dU„ ‰‰_H        t“          jJ        ¦   «         }P|P K                    dˆˆˆ‰ˆŠfdV„¦  «        ƒ d{V —†\  }Q}R‰‰j        }S|S|j        k    r |S|_        | j         L                    ¦   «          | j         M                    |j        |Q¦  «         d|_D        |Q}-tk          |Q¦  «        }T |.|Q¦  «        }Ut                               dW|I|T‰ˆdN›|UdN›¦  «         |U|Hk    rt           2                    dX|UdN›¦  «         |  N                    ‰‰¦  «         n# |  N                    ‰‰¦  «         w xY wn2# t>          $ r%}t           2                    dY|¦  «         Y d}~nd}~ww xY w|-s| j         O                    ¦   «         s|dZz  }|-sÜ|j        rÕ|j        t           jQ        k    rÀ|j        t           jR        k    r«|j        j        }| S                    ¦   «         › d[�}Vt©          jU        |V¦  «        st| j$                             |j        ¦  «        }|rS|j        t           jV        k    rd\nd]}W| (                    |j        d^| W                    ¦   «         › d_|W› d`�¦  «        ƒ d{V —† |j        t           jX        k    rl| j$                             t           jX        ¦  «        }|  Y                    |¦  «        }X|Xr1|r/t          |da¦  «        r| Z                    |X¦  «        }Y|Yr|d|Y› �z  }|  [                    |||-¬b¦  «        ƒ d{V —†}Z|Z€dS |  \                    | j$                             |j        ¦  «        |	|¦  «         	 |j        r|j        j        nd|j
        |j        |Zddc…         ddœ}[| j                             de|[¦  «        ƒ d{V —† |  ]                    |Z||-||j        |	||j^        |j_        ¬f¦	  «	        ƒ d{V —†}\	 | j$                             |j        ¦  «        }]|]r0t          |]dg¦  «        r |] `                    |j        ¦  «        ƒ d{V —† n# t>          $ r Y nw xY w|  a                    ||¦  «        s¸t                               dh|pdi|¦  «         | j$                             |j        ¦  «        }^t          tÅ          |^¦  «        djd¦  «        �|^ c                    ||¬k¦  «         n-|^r+t          |^dl¦  «        r|^jd         e                    |d¦  «         	 |  f                    |¦  «         dS |\                     dm¦  «        pd}_|_dnk    rdo}_|\                     dpg ¦  «        }`t          j         ¦   «         |z
  }a|\                     dqd¦  «        }btk          |_¦  «        }ct                               dr||j        pd|a|b|c¦  «         |	rd|  g                    |	¦  «         	 | j         h                    |	¦  «         n3# t>          $ r&}dt           )                    ds|	|d¦  «         Y d}d~dnd}d~dww xY w|_sž|\                     dt¦  «        r‰|\                     dudv¦  «        }et	          |e¦  «         ?                    ¦   «         Š‹tÓ          ˆ‹fdw„dxD ¦   «         ¦  «        pdy‰‹v otk          |-¦  «        dzk    }f|frd{}_nd|t	          |e¦  «        dd}…         › d~�}_|\                     d¦  «        r|\d         |j        k    r|\d         |_        	 dd€ljmk}g  |gtÙ          ¦   «         tÛ          |j        ¦  «        d�t          | d‚d
¦  «        ¦  «        }hn!# t>          $ r t          | d‚d
¦  «        }hY nw xY w|hr¥|_r£|\                     dƒ¦  «        }i|irŒ|i n                    ¦   «          o                    ¦   «         }jtk          |j¦  «        d„k    r7d 3                    |jdd„…         ¦  «        }k|kd…tk          |j¦  «        d„z
  › d†�z  }kn|i n                    ¦   «         }kd‡|k› dˆ|_› �}_| j                             d‰i |[¥dŠ|_pdddc…         i¥¦  «        ƒ d{V —† 	 dd‹lpmq}l |ljr        rH|ljr         e                    d¦  «        }mt“          js        |  t                    |m¦  «        ¦  «         |ljr        °Hn2# t>          $ r%}t           u                    dŒ|¦  «         Y d}~nd}~ww xY w	 dd‹lpmq}n g }o|njv         w                    ¦   «         sa|njv         x                    ¦   «         }p|p                     d�dŽ¦  «        }q|qd�v r|o 1                    |p¦  «         |njv         w                    ¦   «         ¯a|oD ]c}ptó          |p¦  «        }r|rrP	 |  z                    |r|p¦  «        ƒ d{V —† Œ1# t>          $ r%}st           u                    d�|s¦  «         Y d}s~sŒ[d}s~sww xY wŒdn2# t>          $ r%}t           )                    d‘|¦  «         Y d}~nd}~ww xY wt;          |\                     dt¦  «        ¦  «        }t|tr t                               d’|j        ¦  «         |\                     d“¦  «        r‹|r‰|	r‡t                               d”|j        ¦  «         | j         {                    |	¦  «         |  |                    |	¦  «         | j}         e                    |	d¦  «         |                      |	d¦  «         |_pdd•z   }_tý          j        ¦   «          €                    ¦   «         }u|trn`|-s^|\                     d–g ¦  «        }v| j         �                    |j        d—|vpg �t          ¦   «         |j        r|j        j        nd|ud˜œ¦  «         |tsá|\                     d™tk          |-¦  «        ¦  «        }wtk          |`¦  «        |wk    r
|`|wd…         ng }x|xsK| j         �                    |j        dš|Z|ud›œ¦  «         |_r$| j         �                    |j        dœ|_|ud›œ¦  «         nR| jƒ        du}y|xD ]F}z|z                     d�¦  «        džk    rŒi |z¥dŸ|ui¥}{| j         �                    |j        |{|y¬ ¦  «         ŒG| j         „                    |j        |\                     d¡d¦  «        ¬¢¦  «         t;          |\                     d£¦  «        ¦  «        }||  …                    ||_|`||¬¤¦  «        r|  †                    ||_¦  «        ƒ d{V —† |\                     d£¦  «        rm|\                     dt¦  «        sX|_r>| j$                             |j        ¦  «        }}|}r|  ‡                    |_||}¦  «        ƒ d{V —† 	 |  f                    |¦  «         dS |_|  f                    |¦  «         S # t>          $ �r}	 | j$                             |j        ¦  «        }~|~r0t          |~dg¦  «        r |~ `                    |j        ¦  «        ƒ d{V —† n# t>          $ r Y nw xY wt           ˆ                    d¥|	¦  «         tÅ          |¦  «        j‰        }t	          |¦  «        rt	          |¦  «        dd}…         nd¦}ed}€t          |d§d¦  «        }�d¨�t          ¦   «         v rtk          |-¦  «        nd}‚|�d©k    rdª}€nô|�d«k    rd¬}€në|�d­k    r®t          |dŠd¦  «        }ƒi }„	 |ƒ�(|ƒ ‹                    ¦   «                              dui ¦  «        }„n# t>          $ r Y nw xY w|„                     d�¦  «        d®k    rC|„                     d¯¦  «        }…|…r)|…dk    r#ddlŒ}†|† �                    |…d°z  ¦  «        }‡d±|‡› d²�}€n=d³}€n:d´}€n7|�dµk    rd¶}€n.|�d·v r*|‚dzk    r	 Y d}~|  f                    |¦  «         d{S |�dLk    rd¸}€d¹|› dº|e› d|€› d»�cY d}~|  f                    |¦  «         S d}~ww xY w# |  f                    |¦  «         w xY w)½zAInner handler that runs under the _running_agents sentinel guard.r!  rp   NéP   rÛ   rñ   z3inbound message: platform=%s user=%s chat=%s msg=%rrN  Úwas_auto_resetFzsession:start)r  rp  rM  rê   r   r-   r.   ÚprivacyÚ
redact_pii)r�  Úauto_reset_reasonÚidler.  zy[System note: The user's previous session was stopped and suspended. This is a fresh conversation with no prior context.]Údailyz„[System note: The user's session was automatically reset by the daily schedule. This is a fresh conversation with no prior context.]zy[System note: The user's previous session expired due to inactivity. This is a fresh conversation with no prior context.]rÛ  rB  rD  )r  Úsession_typeÚreset_had_activityz+previous session was stopped or interruptedzdaily schedule at z:00rÐ  Úhzh Úmzinactive for u!   â—� Session automatically reset (zŽ). Conversation history cleared.
Use /resume to browse and restore a previous session.
Adjust reset timing in config.yaml under session_reset.rÌ  r  z.Auto-reset notification failed (non-fatal): %sÚ
auto_skill)Ú_load_skill_payloadÚ_build_skill_messagerÓ  z[IMPORTANT: The "zB" skill is auto-loaded. Follow its instructions for this session.]z#[Gateway] Auto-skill '%s' not foundz0[Gateway] Auto-loaded skill(s) %s for session %sz-[Gateway] Failed to auto-load skill(s) %s: %srA  )Úestimate_messages_tokens_roughr^  zanthropic/claude-sonnet-4.6g333333ë?Tr,   rb   r+  ra  ra   rc   Úcompressionr  rp  r+  rd   ©Úget_compatible_custom_providersÚcustom_providersr  Úmodels)rc   rd   Úconfig_context_lengthra   gffffffî?ÚactualÚ	estimatedé�  uf   Session hygiene: %s messages, ~%s tokens (%s) â€” auto-compressing (threshold: %s%% of %s = %s tokens)ri  éd   rF  ©ÚAIAgentc                 ó¼   — g | ]Y}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|                      d ¦  «        |                      d¦  «        dœ‘ŒZS ©Úrole©ÚuserÚ	assistantrÊ  ©r©  rÊ  rV  ©r  r–  s     r!   rÌ  z<GatewayRunner._handle_message_with_agent.<locals>.<listcomp>¼  sk   € ð )ð )ð )à$%Ø#$§5¢5¨¡=¤=Ð4IÐ#IÐ#IØ$%§E¢E¨)Ñ$4Ô$4ð $Jð *+¯ª¨v©¬À1Ç5Â5ÈÑCSÔCSÐ TÐ Tà#IÐ#IÐ#Iré   Úmemory©rb   rÎ  Ú
quiet_modeÚskip_memoryÚenabled_toolsetsrM  c                  ó   — d S rr  r  ©ÚaÚkws     r!   ru  z:GatewayRunner._handle_message_with_agent.<locals>.<lambda>Î  s   € ÈD€ ré   c                  ó4   •— ‰                      ‰d‰ ¬¦  «        S )Nrp   )Úapprox_tokens©Ú_compress_context)Ú_approx_tokensÚ
_hyg_agentÚ	_hyg_msgss   €€€r!   ru  z:GatewayRunner._handle_message_with_agent.<locals>.<lambda>Ó  s%   ø€ °
×0LÒ0LØ,5°rØ:Hð 1Mñ 1*ô 1*€ ré   u>   Session hygiene: compressed %s â†’ %s msgs, ~%s â†’ ~%s tokensz3Session hygiene: still ~%s tokens after compressionz(Session hygiene auto-compress failed: %szÃ

[System note: This is the user's very first message ever. Briefly introduce yourself and mention that /help shows available commands. Keep the introduction concise -- one or two sentences max.]Ú_HOME_CHANNELz/hermes sethomez/sethomeu    ðŸ“¬ No home channel is set for z^. A home channel is where Hermes delivers cron job results and cross-platform messages.

Type z8 to make this chat your home channel, or ignore to skip.Úget_voice_channel_context©rã   r$  rF  r\  )r  rp  rM  rï   zagent:start)	rï   Úcontext_promptrF  r$  rM  rê   rŠ  Úevent_message_idr¬  Ústop_typinguK   Discarding stale agent result for %s â€” generation %d is no longer currentrR  Úpop_post_delivery_callback©Ú
generationÚ_post_delivery_callbacksÚfinal_responseú(empty)uŽ   âš ï¸� The model returned no response after processing tool results. This can happen with some models â€” try again or rephrase your question.ÚmessagesÚ	api_callszMresponse ready: platform=%s chat=%s time=%.1fs api_calls=%d response=%d charsz&clear_resume_pending failed for %s: %sÚfailedrO  rD  c              3   ó    •K  — | ]}|‰v V — Œ	d S rr  r  )r  rË  Ú	error_strs     €r!   r  z;GatewayRunner._handle_message_with_agent.<locals>.<genexpr>­  s7   øè è € ð #ð #°a 1¨	 >ð #ð #ð #ð #ð #ð #ré   )Úcontextr�  z	too largeztoo longÚexceedÚpayloadÚ400é2   u}   âš ï¸� Session too large for the model's context window.
Use /compact to compress the conversation, or /reset to start fresh.zThe request failed: r¿  z2
Try again or use /reset to start a fresh session.rM  ©Úresolve_display_settingr¯  r’  Úlast_reasoningé   z
_... (z more lines)_u   ðŸ’­ **Reasoning:**
```
z
```

z	agent:endÚresponsero  zProcess watcher setup error: %srK  rL  )rP  rO  ú&Watch notification injection error: %szWatch queue drain error: %sz`Skipping transcript persistence for failed request in session %s to prevent session growth loop.Úcompression_exhaustedz7Auto-resetting session %s after compression exhaustion.u£   

ðŸ”„ Session auto-reset â€” the conversation exceeded the maximum context size and could not be compressed further. Your next message will start a fresh session.ÚtoolsÚsession_meta)r©  rÜ  rb   r  Ú	timestampÚhistory_offsetr«  )r©  rÊ  rÞ  r¬  r©  ÚsystemrÞ  )Úskip_dbÚlast_prompt_tokens©râ  Úalready_sent)rä  zAgent error in session %szno details availableÚstatus_coderF  i‘  zH Check your API key or run `claude /login` to refresh OAuth credentials.i’  zG Your API balance or quota is exhausted. Check your provider dashboard.i­  Úusage_limit_reachedÚresets_in_secondsi  z9 Your plan's usage limit has been reached. It resets in ~zh.zG Your plan's usage limit has been reached. Please wait until it resets.z@ You are being rate-limited. Please wait a moment and try again.i  z= The API is temporarily overloaded. Please try again shortly.)r£  r\  z% The request was rejected by the API.zSorry, I encountered an error (z).
z1Try again or use /reset to start a fresh session.r  )ŽrV  r  r  r!  rò   r]  r
  r³   rÊ   rÖ  rp  rC  r›  Úget_or_create_sessionrê   rÜ   r¤  Ú
created_atÚ
updated_atrº  r¤  rM  r–   r)  Ú_set_session_envrÄ   rÆ   Ú_config_pathrÇ   r¶  r¸   r·   r—   Úget_reset_policyÚnotifyÚnotify_exclude_platformsr‡  Úat_hourÚidle_minutesÚ_format_session_infor	  rË   r�  r�  rÈ   r¹   r  r˜  r™  rá   r´   râ   Úload_transcriptrÞ   rp  rš  r^  rÅ   r   rÉ   rµ  r´  r™  rõ   r8  r³  r�  Úrstriprâ  rF  Ú	run_agentr¦  Ú	_print_fnrž  rõ  Úrun_in_executorr/  Úrewrite_transcriptr  Úhas_any_sessionsr�   r   rÉ  Úupperr   r²   r?  rÆ  r;  Ú_get_guild_idrÀ  r‰  Ú_bind_adapter_run_generationÚ
_run_agentrÝ  r¬  rÄ  Ú_is_session_run_currentrK  rÅ  rÈ  rT  Ú_clear_session_envr4  Úclear_resume_pendingr  Úgateway.display_configrÖ  r(  r#  ró   Ú
splitlinesr™  rp  rª  rT  r«  rO  Úcompletion_queueÚemptyÚ
get_nowaitr^  Ú_inject_watch_notificationÚreset_sessionrÊ  rl  r   rå  Ú	isoformatÚappend_to_transcriptr-  r±  Úupdate_sessionÚ_should_send_voice_replyÚ_send_voice_replyÚ_deliver_media_from_responseÚ	exceptionÚ__name__ÚlocalsrÔ  ÚmathÚceil)Œr¿  rã   r$  r  rŠ  Ú_msg_start_timeÚ_platform_nameÚ_msg_previewÚsession_entryrê   Ú_is_new_sessionrÐ  Ú_session_env_tokensÚ_redact_piiÚ	_pii_yamlÚ_pfÚ_pcfgrÂ  Úreset_reasonr‚  Úpolicyry  Úhad_activityÚshould_notifyrí   Úreason_textÚhoursÚminsÚdurationÚnoticeÚsession_inforÁ  Ú_autoÚ_skill_namesr˜  r™  Ú_combined_partsÚ_loaded_namesÚ_snameÚ_loadedÚ_loaded_skillÚ
_skill_dirÚ_display_nameÚ_noteÚ_partrF  rš  r^  Ú
_hyg_modelÚ_hyg_threshold_pctÚ_hyg_compression_enabledÚ_hyg_config_context_lengthÚ_hyg_providerÚ_hyg_base_urlÚ_hyg_api_keyÚ	_hyg_dataÚ_hyg_cfg_pathÚ	_hyg_yamlÚ_hyg_fÚ
_model_cfgÚ_raw_ctxÚ	_comp_cfgÚ_hyg_runtimeÚ_gw_gcpÚ_hyg_custom_providersÚ_cpÚ_cp_urlÚ
_cp_modelsÚ_cp_model_cfgÚ_cp_ctxÚ_hyg_context_lengthÚ_compress_token_thresholdÚ_warn_token_thresholdÚ
_msg_countÚ_stored_tokensÚ_token_sourceÚ_HARD_MSG_LIMITÚ_needs_compressÚ	_hyg_metar¦  ÚloopÚ_compressedrû   Ú_hyg_new_sidÚ
_new_countÚ_new_tokensÚenv_keyÚsethome_cmdÚguild_idÚ
vc_contextrN  r3  Úagent_resultÚ_typing_adapterÚ_stale_adapterrÙ  Úagent_messagesÚ_response_timeÚ
_api_callsÚ	_resp_lenrÔ  Úerror_detailÚ_is_ctx_failÚ_rdsÚ_show_reasoning_effectiver×  ÚlinesÚdisplay_reasoningrp  r½  Ú_prÚ_watch_eventsrI  rW  Ú
synth_textÚe2Úagent_failed_earlyÚtsÚ	tool_defsÚhistory_lenÚnew_messagesÚagent_persistedr  rÒ   Ú_already_sentÚ_media_adapterÚ_err_adapterÚ
error_typeÚstatus_hintrå  Ú	_hist_lenÚ	_err_bodyÚ	_err_jsonÚ
_resets_inr  Ú_hoursr¼  r½  r¾  rÏ  sŒ                                                                                                                                           @@@@r!   r  z(GatewayRunner._handle_message_with_agentq  s˜"  øøøøè è € åœ)™+œ+ˆÝ29¸&¼/È7Ñ2SÔ2SÐm˜œÔ.Ð.ÕY\Ð]cÔ]lÑYmÔYmˆØœ
Ð( b¨#¨2¨#Ô.×6Ò6°t¸SÑAÔAˆÝ�ŠØAØ˜FÔ,ÐK°´ÐKÀ)ØŒNÐ'˜i¨ñ	
ô 	
ð 	
ð Ô*×@Ò@ÀÑHÔHˆØ#Ô/ˆÝ�=Ð"2°EÑ:Ô:ð 	DØ×0Ò0°¸dÑCÔCÐCð Ô$¨Ô(@Ò@ð ?Ý�}Ð&6¸Ñ>Ô>ð 	ð ð 	Ø”*—/’/ /Ø5;´_ÐL˜FœOÔ1Ð1È"Ø!œ>Ø+Ô6Ø*ð	4ð 4ñ ô ð ð ð ð ð ð ð õ (¨°´¸]ÑKÔKˆð #×3Ò3°GÑ<Ô<Ðð ˆð	Ø$Ð$Ð$Ð$Ý•l¨WÐ5Ñ5Ô5ð 7¸Ø!×+Ò+¨CÑ0Ô0Ð6°B�ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7å §	¢	¨)Ñ 4Ô 4Ð :¸×?Ò?ÀÈeÑTÔTÑUÔUˆKˆKøÝð 	ð 	ð 	ØˆDð	øøøõ 6°gÈ+ÐVÑVÔVˆõ �=Ð"2°EÑ:Ô:ñ <	3Ý" =Ð2EÀtÑLÔLÐVÐPVˆLØ˜{Ò*Ð*ð  [��Ø Ò(Ð(ð  f��ð  [�Ø)¨FÑ2°^ÑCˆNð+RØÔ+Ô2×CÒCØ#œ_Ý!(¨°¸dÑ!CÔ!Cð Dñ ô �ð :@¼Ð P ¤Ô 5Ð 5Èb�Ý& }Ð6JÈEÑRÔR�ð !-°Ò ;ð !Ø”Mð MØ$ðMà%¨VÔ-LÐLð ð
 !ð Ø"œm×/Ò/°´Ñ@Ô@�GØð Ø'¨;Ò6Ð6Ø*W˜K˜KØ)¨WÒ4Ð4Ø*R¸v¼~Ð*RÐ*RÐ*R˜K˜Kà$*Ô$7¸2Ñ$=˜EØ#)Ô#6¸Ñ#;˜DØ:>Ð'p¨% { { { {Ð[`ÐDpÀuÐDWÐDWÐPTÐDWÐDWÐDWÐDWÐimÐfpÐfpÐfp˜HØ*D¸(Ð*DÐ*D˜KðWÀð Wð Wð Wð ð!Ø+/×+DÒ+DÑ+FÔ+F˜LØ+ð GØ,2Ð)FÐ)F¸Ð)FÐ)F øøÝ(ð !ð !ð !Ø ˜Dð!øøøà%ŸlšlØ"œN¨FÝ%,¨U°JÀÑ%EÔ%Eð +ñ ô ð ð ð ð ð ð ð øøõ ð Rð Rð RÝ—’ÐMÈqÑQÔQÐQÐQÐQÐQÐQÐQøøøøðRøøøð ,1ˆMÔ(Ø.2ˆMÔ+õ ˜˜|¨TÑ2Ô2ˆØñ 	a˜uñ 	aÝ&0°½Ñ&<Ô&<ÐM˜E˜7˜7Å$ÀuÁ+Ä+ˆLðaØZÐZÐZÐZÐZÐZÐZÐZØ-/�Ø+-�Ø*ð Vð V�FØ1Ð1°&À*ÐMÑMÔM�GØð VØCJÑ@˜ z°=ðJ°ð Jð Jð Jð ð !5Ð 4°]ÀJÐPUÑ VÔ V˜Ø ð 9Ø+×2Ò2°5Ñ9Ô9Ð9Ø)×0Ò0°Ñ8Ô8Ð8øåŸšÐ'LÈfÑUÔUÐUÐUØ"ð à#×*Ò*¨5¬:Ñ6Ô6Ð6Ø!'§¢¨_Ñ!=Ô!=�E”JÝ—K’KØJØ% {ñô ð øøõ ð að að aÝ—’ÐNÐP\Ð^_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`øøøøðaøøøð Ô$×4Ò4°]Ô5MÑNÔNˆð" ñ h	•s˜7‘|”| qÒ(Ñ(ðð ð ð ð ð ð ð ð 7ˆJØ!%ÐØ'+Ð$Ø)-Ð&Ø ˆMØ ˆMØˆLØˆIðJÝ ,¨}Ñ <�Ø ×'Ò'Ñ)Ô)ñ :Ø,Ð,Ð,Ð,Ý˜m°gÐ>Ñ>Ô>ð FÀ&Ø$-×$7Ò$7¸Ñ$?Ô$?Ð$EÀ2˜	ðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fð "+§¢¨w¸Ñ!;Ô!;�JÝ! *­cÑ2Ô2ð KØ%/˜
˜
Ý# JµÑ5Ô5ð KØ%/§^¢^°IÑ%>Ô%>Ð%gÀ*Ç.Â.ÐQXÑBYÔBYÐ%gÐ]g˜
ð $.§>¢>Ð2BÑ#CÔ#C˜Ø#Ð/ð%Ý=@À¹]¼]Ð :Ð :øÝ$-­zÐ#:ð %ð %ð %Ø $ ð%øøøð )3¯ª°zÑ(BÔ(BÐ(JÀd˜Ø(2¯ª°zÑ(BÔ(BÐ(JÀd˜ð
 !*§¢¨m¸RÑ @Ô @�IÝ! )­TÑ2Ô2ð :Ý36Ø%ŸMšM¨)°TÑ:Ô:ñ4ô 4çš%™'œ'Ð%9ð4:Ð0ð
Ø/3×/RÒ/RØ%Ø$/Ý1;¸IÅtÑ1LÔ1LÐ$V I IÐRVð 0Sñ 0ô 0Ñ,�J ð
 %1×$4Ò$4°ZÑ$@Ô$@Ð$QÀM�MØ$0×$4Ò$4°ZÑ$@Ô$@Ð$QÀM�MØ#/×#3Ò#3°IÑ#>Ô#>Ð#NÀ,�L�LøÝ ð ð ð Ø�Dðøøøð .Ñ5¸-Ñ5ðð;ØdÐdÐdÐdÐdÐdØ4;°G¸IÑ4FÔ4FÐ1Ð1øÝ(ð ;ð ;ð ;Ø4=·M²MÐBTÑ4UÔ4UÐ1Ý#-Ð.CÅTÑ#JÔ#Jð ;Ø8:Ð 5øøð;øøøð $9ð &ð &˜CÝ#-¨cµ4Ñ#8Ô#8ð )Ø (Ø'*§w¢w¨zÑ':Ô':Ð'@¸b×&HÒ&HÈÑ&MÔ&M˜GØ&ð &¨7°m×6JÒ6JÈ3Ñ6OÔ6OÒ+OÐ+OØ-0¯WªW°X¸rÑ-BÔ-B 
Ý#-¨j½$Ñ#?Ô#?ð !VØ4>·N²NÀ:ÈrÑ4RÔ4R MÝ'1°-ÅÑ'FÔ'Fð %VØ2?×2CÒ2CÐDTÑ2UÔ2U¨Ø+2Ð+>ÝILÈWÉÌÐ,FØ % øøøÝ%¥zÐ2ð ð ð Ø˜ðøøøøøåð ð ð Ø�ðøøøð (ñ FØ&>Ð&>ØØ*Ð0¨bØ(Ð.¨BØ*DØ*Ð0¨bð'ñ 'ô 'Ð#õ -0Ø'Ð*<Ñ<ñ-ô -Ð)õ ),Ð,?À$Ñ,FÑ(GÔ(GÐ%å  ™\œ\�
ð "/Ô!A�Ø! AÒ%Ð%Ø%3�NØ$,�M�Mà%CÐ%CÀGÑ%LÔ%L�NØ$/�Mð  #&�à"Ð&?Ò?ð 5Ø! _Ò4ð  ð
 #ñ YÝ—K’Kð>à" ~Ð$9Ð$9¸=ÝÐ.°Ñ4Ñ5Ô5Ø.Ð2Ð2Ø4Ð8Ð8ñô ð ð DJÔCSÐ ] ¨fÔ.>Ð ?Ð ?ÐY]�IðMØ5Ð5Ð5Ð5Ð5Ð5à37×3VÒ3VØ#)Ø(3Ý5?À	Í4Ñ5PÔ5PÐ(Z¨	¨	ÐVZð 4Wñ 4ô 4Ñ0˜
 Lð
 (×+Ò+¨IÑ6Ô6ñ @Nð)ð )à)0ð)ñ )ô )˜Iõ  # 9™~œ~°Ò2Ñ2Ø-4¨Wð ."ð ."Ø&2ð."à*4Ø34Ø/3Ø04Ø6>°ZØ/<Ô/Gð."ð ."ð ."ð ." 
ð.!NØ;PÐ;P JÔ$8å+2Ô+CÑ+EÔ+E DØ;?×;OÒ;OØ(,ð)*ð )*ð )*ð )*ð )*ð )*ñ<&ô <&ð 6&ð 6&ð 6&ð 6&ð 6&ð 6&¡N K°ð 4>Ô3H LØ'3°}Ô7OÒ'OÐ'OØCO¨Ô(@Ø(,Ô(:×(@Ò(@Ñ(BÔ(BÐ(Bà$(Ô$6×$IÒ$IØ(5Ô(@À+ñ%&ô %&ð %&ð HI MÔ$DØ.9 GÝ14°[Ñ1AÔ1A JØ2PÐ2PØ(3ñ3&ô 3& Kõ %+§K¢Kð)=à(2°JØ+9Ð(=Ð(=À+Ð?QÐ?Qñ	%&ô %&ð %&ð (3Ð6KÒ'KÐ'KÝ(.¯ªð-:à/:Ð,>Ð,>ñ)*ô )*ð )*ð %)×$AÒ$AÀ*Ñ$MÔ$MÐ$MÐ$Mø D×$AÒ$AÀ*Ñ$MÔ$MÐ$MÐ$Møøøøøå$ð ð ð ÝŸšØFÈñô ð ð ð ð ð ð øøøøðøøøð ð 	˜tÔ1×BÒBÑDÔDð 	ØðNñˆNð ð 	˜6œ?ð 	¨v¬Å(Ä.Ò/PÐ/PÐU[ÔUdÕhpÔhxÒUxÐUxØ"œOÔ1ˆMØ&×,Ò,Ñ.Ô.Ð=Ð=Ð=ˆGÝ”9˜WÑ%Ô%ð Øœ-×+Ò+¨F¬OÑ<Ô<�Øð ð "œ?­h¬nÒ<Ð<ð *Ð)à'ð  ð
 "Ÿ,š,Øœð.¸=×;NÒ;NÑ;PÔ;Pð .ð .ð !,ð.ð .ð .ñô ð ð ð ð ð ð ð ð Œ?�hÔ.Ò.Ð.Ø”m×'Ò'­Ô(8Ñ9Ô9ˆGØ×)Ò)¨%Ñ0Ô0ˆHØð :˜Gð :­°Ð9TÑ(UÔ(Uð :Ø$×>Ò>¸xÑHÔH�
Øð :Ø"Ð&9¨ZÐ&9Ð&9Ñ9�Nð "×?Ò?ØØØð @ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 ÐØˆFð
 	×)Ò)ØŒM×Ò˜fœoÑ.Ô.ØØñ	
ô 	
ð 	
ðw	9ð 6<´_ÐL˜FœOÔ1Ð1È"Ø!œ>Ø+Ô6Ø'¨¨¨Ô-ð	ð ˆHð ”*—/’/ -°Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð "&§¢Ø$Ø-ØØØ(Ô3Ø'Ø-Ø!&Ô!1Ø$Ô3ð "1ñ 
"ô 
"ð 
ð 
ð 
ð 
ð 
ð 
ˆLðØ"&¤-×"3Ò"3°F´OÑ"DÔ"D�Ø"ð F¥w¨ÀÑ'NÔ'Nð FØ)×5Ò5°f´nÑEÔEÐEÐEÐEÐEÐEÐEÐEøøÝð ð ð Ø�ðøøøð ×/Ò/°
¸NÑKÔKð Ý—’ØaØÐ% #Ø"ñô ð ð
 "&¤×!2Ò!2°6´?Ñ!CÔ!C�Ý�4 Ñ/Ô/Ð1MÈtÑTÔTÐ`Ø"×=Ò=Ø"Ø#1ð >ñ ô ð ð ð $ð R­°Ð@ZÑ([Ô([ð RØ"Ô;×?Ò?À
ÈDÑQÔQÐQØðT
 ×#Ò#Ð$7Ñ8Ô8Ð8Ð8Ð8ðQ
 $×'Ò'Ð(8Ñ9Ô9Ð?¸RˆHð ˜9Ò$Ð$ð.ð ð
 *×-Ò-¨j¸"Ñ=Ô=ˆNÝ!œY™[œ[¨?Ñ:ˆNØ%×)Ò)¨+°qÑ9Ô9ˆJÝ˜H™œˆIÝ�KŠKØ_Ø ¤Ð ;°)Ø 
¨Iñô ð ð ð Ø×1Ò1°+Ñ>Ô>Ð>ðØÔ&×;Ò;¸KÑHÔHÐHÐHøÝ ð ð ð Ý—L’LØ@Ø# Rñô ð ð ð ð ð ð øøøøðøøøð ð  × 0Ò 0°Ñ :Ô :ð Ø+×/Ò/°¸ÑIÔI�Ý Ñ-Ô-×3Ò3Ñ5Ô5�	õ
  #ð #ð #ð #ð #ð <ð #ñ #ô #ñ  ô  ð  ð ˜YÐ&ð *Ý˜G™œ rÒ)ð ð  ð 
ð1ð �HðL­s°<Ñ/@Ô/@ÀÀ#ÀÔ/Fð Lð Lð Lð ð ×Ò Ñ-Ô-ð F°,¸|Ô2LÐP]ÔPhÒ2hÐ2hØ+7¸Ô+E�Ô(ð	TØRÐRÐRÐRÐRÐRØ,0¨DÝ(Ñ*Ô*Ý(¨¬Ñ9Ô9Ø$Ý˜DÐ"3°UÑ;Ô;ñ	-ô -Ð)Ð)øõ ð Tð Tð TÝ,3°DÐ:KÈUÑ,SÔ,SÐ)Ð)Ð)ðTøøøà(ð 
c¨Xð 
cØ!-×!1Ò!1Ð2BÑ!CÔ!C�Ø!ð cà*×0Ò0Ñ2Ô2×=Ò=Ñ?Ô?�EÝ˜5‘z”z B’�Ø,0¯IªI°e¸C¸R¸C´jÑ,AÔ,AÐ)Ø)Ð-V½¸E¹
¼
ÀR¹Ð-VÐ-VÐ-VÑVÐ)Ð)à,:×,@Ò,@Ñ,BÔ,BÐ)ØbÐ<MÐbÐbÐX`ÐbÐb�Hð ”*—/’/ +ð 0Øð0à˜X˜^¨¨T¨c¨TÔ2ð0ð 0ñ ô ð ð ð ð ð ð ð ðCØCÐCÐCÐCÐCÐCØ&Ô7ð LØ.Ô?×CÒCÀAÑFÔF�GÝÔ'¨×(AÒ(AÀ'Ñ(JÔ(JÑKÔKÐKð 'Ô7ð Løøõ ð Cð Cð CÝ—’Ð>ÀÑBÔBÐBÐBÐBÐBÐBÐBøøøøðCøøøð?ØJÐJÐJÐJÐJÐJØ "�ØÔ.×4Ò4Ñ6Ô6ð 2ØÔ.×9Ò9Ñ;Ô;�CØ"Ÿwšw v¨|Ñ<Ô<�HØÐ#DÐDÐDØ%×,Ò,¨SÑ1Ô1Ð1ð	 Ô.×4Ò4Ñ6Ô6ð 2ð )ð Wð W�CÝ!EÀcÑ!JÔ!J�JØ!ð WðWØ"&×"AÒ"AÀ*ÈcÑ"RÔ"RÐRÐRÐRÐRÐRÐRÐRÐRøÝ(ð Wð Wð WÝ"ŸLšLÐ)QÐSUÑVÔVÐVÐVÐVÐVÐVÐVøøøøðWøøøðWðWøõ ð ?ð ?ð ?Ý—’Ð:¸AÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>øøøøð?øøøõ& "& l×&6Ò&6°xÑ&@Ô&@Ñ!AÔ!AÐØ!ð Ý—’ðAà!Ô,ñô ð ð ×ÒÐ 7Ñ8Ô8ð ¸]ð È{ð Ý—’ØMØ!Ô,ñô ð ð Ô"×0Ò0°Ñ=Ô=Ð=Ø×(Ò(¨Ñ5Ô5Ð5ØÔ-×1Ò1°+¸tÑDÔDÐDØ×4Ò4°[À$ÑGÔGÐGØ$˜N¨ðDñ�õ ”‘”×)Ò)Ñ+Ô+ˆBð
 "ð ØØð Ø(×,Ò,¨W°bÑ9Ô9�	ØÔ"×7Ò7Ø!Ô,à .Ø!* ¨bÞ!7Ñ!9Ô!9Ø=C¼_Ð$T F¤OÔ$9Ð$9ÐRTØ%'ðð ñ	ô 	ð 	ð &ð Ø*×.Ò.Ð/?ÅÀWÁÄÑNÔN�Ý?BÀ>Ñ?RÔ?RÐU`Ò?`Ð?`˜~¨k¨l¨lÔ;Ð;Ðfh�ð $ð ØÔ&×;Ò;Ø%Ô0Ø!'°LÈrÐRÐRñô ð ð  ð ØÔ*×?Ò?Ø)Ô4Ø%0¸XÐTVÐWÐWñô ð øð '+Ô&6¸dÐ&B�OØ+ð 	ð 	˜àŸ7š7 6™?œ?¨hÒ6Ð6Ø$à 8 3Ð 8¨°RÐ 8Ð 8˜ØÔ*×?Ò?Ø)Ô4°eØ$3ð @ñ ô ð ð ð Ô×-Ò-ØÔ)Ø#/×#3Ò#3Ð4HÈ!Ñ#LÔ#Lð .ñ ô ð õ ! ×!1Ò!1°.Ñ!AÔ!AÑBÔBˆMØ×,Ò,¨U°H¸nÐ[hÐ,ÑiÔið >Ø×,Ò,¨U°HÑ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð ×Ò Ñ/Ô/ð ¸×8HÒ8HÈÑ8RÔ8Rð Øð Ø%)¤]×%6Ò%6°v´Ñ%GÔ%G�NØ%ð Ø"×?Ò?Ø$ e¨^ñô ð ð ð ð ð ð ð ð ð~ ×#Ò#Ð$7Ñ8Ô8Ð8Ð8Ð8ð{ ðz ×#Ò#Ð$7Ñ8Ô8Ð8Ð8øõw ð 8	ñ 8	ð 8	ðØ#œ}×0Ò0°´ÑAÔA�Øð C¥G¨L¸-Ñ$HÔ$Hð CØ&×2Ò2°6´>ÑBÔBÐBÐBÐBÐBÐBÐBÐBøøÝð ð ð Ø�ðøøøå×ÒÐ8¸+ÑFÔFÐFÝ˜a™œÔ)ˆJÝ+.¨q©6¬6ÐM�3˜q™6œ6 $ 3 $œ<˜<Ð7MˆLØˆKÝ! ! ]°DÑ9Ô9ˆKØ(1¶V±X´XÐ(=Ð(=�˜G™œ˜À1ˆIØ˜cÒ!Ð!Øh��Ø Ò#Ð#Øg��Ø Ò#Ð#å# A z°4Ñ8Ô8�	Ø�	ðØ Ð,Ø$-§N¢NÑ$4Ô$4×$8Ò$8¸À"Ñ$EÔ$E˜	øøÝ ð ð ð Ø�Dðøøøà—=’= Ñ(Ô(Ð,AÒAÐAØ!*§¢Ð/BÑ!CÔ!C�JØ!ð p j°1¢n nØ#˜˜˜Ø!%§¢¨:¸Ñ+<Ñ!=Ô!=˜Ø&lÐbhÐ&lÐ&lÐ&l˜˜à&o˜˜à"d�K�KØ Ò#Ð#Ø]��Ø 
Ð*Ð*ð ˜r’>�>ð1ðð ð ð ð ×#Ò#Ð$7Ñ8Ô8Ð8Ð8Ð8ð ! CÒ'Ð'Ø"I�KðD°*ð Dð DØðDð DàðDð Dð Dðð ð ð ð ð ×#Ò#Ð$7Ñ8Ô8Ð8Ð8øøøøðw8	øøøøðv ×#Ò#Ð$7Ñ8Ô8Ð8Ð8øøøs{  ÆH ÆGÆ5H ÇGÇH ÇGÇ	;H È
HÈHÉ(C&N0 ÍM- Í,N0 Í-
M:Í7N0 Í9M:Í:5N0 Î0
OÎ:OÏOÐ/CT Ô
T3ÔT.Ô.T3Ö4c< Ö9W×c< ×W!×!c< ×$W!×%B	c< Ù/Y? Ù>c< Ù?ZÚc< ÚZÚBc< Ü'A7^ Þc< Þ
^,Þ)c< Þ+^,Þ,	c< Þ7_	 ßc$ ß	6`ß?c$ à`àC!c$ ã#c< ã$c8ã5c< ã7c8ã8c< ã<
d	äd	çBn éC9m& ín í&m=í=n î
n0în+î+n0ö	B A] ø
Ay ùA] ù
y)ù&A] ù(y)ù)B9A] ü:B-A] ÿ(A@ Á@A] Á@
A@3Á@A@.Á@)A] Á@.A@3Á@3CA] ÁD
AAE ÁEA] ÁEAE*ÁE'A] ÁE)AE*ÁE*CA] ÁIAAJ ÁJA] ÁJ
AKÁJ&AKÁKA] ÁKAKÁKA] ÁKBAN8 ÁM'ANÁNAN8 ÁN
AN3ÁNAN.ÁN)AN8 ÁN.AN3ÁN3AN8 ÁN7A] ÁN8
AO'ÁOAO"ÁOA] ÁO"AO'ÁO'MA] Á]A] Á]Af Á]*AA^<Á^;Ae;Á^<
A_	Á_Ae;Á_A_	Á_	B:Ae;Áb*Ab/Áb.Ae;Áb/
Ab<Áb9Ae;Áb;Ab<Áb<A6Ae;Ád2Af ÁeAe;Áe Af Áe!Af Áe;Af Áf Af ÁfAfc                 óÜ  — ddl m}m} t          ¦   «         }d}d}d}d}d}	 t          dz  }	|	                     ¦   «         �rddl}
t          |	d¬¦  «        5 }|
                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   | 	                    di ¦  «        }t          |t          ¦  «        rm| 	                    d¦  «        }|�(	 t          |¦  «        }n# t          t          f$ r Y nw xY w| 	                    d	¦  «        pd}| 	                    d
¦  «        pd}	 ddlm}  ||¦  «        }n%# t"          $ r | 	                    d¦  «        }Y nw xY wn# t"          $ r Y nw xY w	 t%          ¦   «         }|p| 	                    d	¦  «        }|p| 	                    d
¦  «        }| 	                    d¦  «        }n# t"          $ r Y nw xY w |||pd|pd||pd|¬¦  «        }|�d}n||k    rd}nd}|dk    r
|dz  d›d�}n|dk    r	|dz  › d�}nt'          |¦  «        }d|› d�d|pd› �d|› d|› d�g}|r$d|v sd |v sd!|v r|                     d"|› �¦  «         d#                     |¦  «        S )$a  Resolve current model config and return a formatted info block.

        Surfaces model, provider, context length, and endpoint so gateway
        users can immediately see if context detection went wrong (e.g.
        local models falling to the 128K default).
        r   )r^  ÚDEFAULT_FALLBACK_CONTEXTNr,   r-   r.   rb   ra  ra   rc   rœ  rž  rd   rp   )rc   rd   r   ra   rž  r)  u:   default â€” set model.context_length in config to overrideÚdetectedi@B z.1fÚMiè  ÚKu   â—† Model: `r	  u   â—† Provider: Ú
openrouteru   â—† Context: z	 tokens (rÖ  Ú	localhostz	127.0.0.1z0.0.0.0u   â—† Endpoint: rÛ   )rp  r^  r|  r-  rÅ   r   rÄ   rÆ   rÇ   r¸   rÈ   rÉ   rµ  r´  r™  r³  r�  r·   r¾   rò   rá   râ   )r¿  r^  r|  rb   r   ra   rc   rd   Úcustom_provsrÍ   Ú
_info_yamlr'  ró  r,  Úraw_ctxr�  rº   ra  Ú
ctx_sourceÚctx_displayre  s                        r!   rò  z"GatewayRunner._format_session_infoÆ  sÂ  € ð 	\Ð[Ð[Ð[Ð[Ð[Ð[Ð[å&Ñ(Ô(ˆØ $ÐØˆØˆØˆØˆð	Ý# mÑ3ˆHØ�ŠÑ Ô ñ @Ø)Ð)Ð)Ð)Ý˜(¨WÐ5Ñ5Ô5ð 9¸Ø%×/Ò/°Ñ2Ô2Ð8°b�Dð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9à ŸHšH W¨bÑ1Ô1�	Ý˜i­Ñ.Ô.ð AØ'ŸmšmÐ,<Ñ=Ô=�GØÐ*ð!Ý47¸±L´LÐ1Ð1øÝ )­:Ð6ð !ð !ð !Ø ˜Dð!øøøà(Ÿ}š}¨ZÑ8Ô8Ð@¸D�HØ(Ÿ}š}¨ZÑ8Ô8Ð@¸D�Hð@ØQÐQÐQÐQÐQÐQØ#BÐ#BÀ4Ñ#HÔ#H�L�LøÝ ð @ð @ð @Ø#'§8¢8Ð,>Ñ#?Ô#?�L�L�Lð@øøøøøåð 	ð 	ð 	ØˆDð	øøøð	Ý3Ñ5Ô5ˆGØÐ: 7§;¢;¨zÑ#:Ô#:ˆHØÐ: 7§;¢;¨zÑ#:Ô#:ˆHØ—k’k )Ñ,Ô,ˆGˆGøÝð 	ð 	ð 	ØˆDð	øøøð 2Ð1ØØ�^ Ø�M˜rØ"7Ø�^ Ø)ð
ñ 
ô 
ˆð !Ð,Ø!ˆJˆJØÐ7Ò7Ð7ØUˆJˆJà#ˆJð ˜YÒ&Ð&Ø+¨iÑ7Ð>Ð>Ð>Ð>ˆKˆKØ˜uÒ$Ð$Ø+¨uÑ4Ð7Ð7Ð7ˆKˆKå˜nÑ-Ô-ˆKð $˜5Ð#Ð#Ð#Ø7˜XÐ5¨Ð7Ð7Ø?˜KÐ?Ð?°*Ð?Ð?Ð?ð
ˆð ð 	6˜¨Ð0Ð0°KÀ8Ð4KÐ4KÈyÐ\dÐOdÐOdØ�LŠLÐ4¨(Ð4Ð4Ñ5Ô5Ð5à�yŠy˜ÑÔÐs‘   ¢4E ÁA:Á.E Á:A>Á>E ÂA>ÂAE ÃC ÃE ÃC,Ã)E Ã+C,Ã,1E ÄD0 Ä/E Ä0EÅE ÅEÅE Å
E#Å"E#Å'AF9 Æ9
GÇGc              ƒ   óz  K  — |j         }|                      |¦  «        }|                      |d¬¦  «         | j        j                             |¦  «        }t          | dd¦  «        }|�n|5  | j                             |¦  «        }t          |t          ¦  «        r|d         n|r|nd}ddd¦  «         n# 1 swxY w Y   |�|  
                    |¦  «         |                      |¦  «         t          | dd¦  «        }|�|                     |d¦  «         	 ddlm}	  |	¦   «          n# t          $ r Y nw xY w	 ddlm}
  |
¦   «          n# t          $ r Y nw xY w| j                             |¦  «        }| j                             |d¦  «         |                      |d¦  «         |                      |¦  «         	 dd	lm} |r|j        nd} |d
||j        r|j        j        nd¬¦  «         n# t          $ r Y nw xY w| j                             d|j        r|j        j        nd|j        |dœ¦  «        ƒ d{V —† | j                             d|j        r|j        j        nd|j        |dœ¦  «        ƒ d{V —† 	 |                      ¦   «         }n# t          $ r d}Y nw xY w|rd}n| j                             |d¬¦  «        }d}	 dd	lm} |r|j        nd} |d||j        r|j        j        nd¬¦  «         n# t          $ r Y nw xY w	 ddl m!} d |¦   «         › �}n# t          $ r d}Y nw xY w|r	|› d|› |› �S |› |› �S )zHandle /new or /reset command.Úsession_resetr   r¬  Nr   r¦  )Úclear_env_passthrough)Úclear_credential_filesr  r  rp   r  zsession:end)r  rp  rê   zsession:resetu"   âœ¨ Session reset! Starting fresh.T)Ú	force_newu   âœ¨ New session started!Úon_session_reset)Úget_random_tipu
   
âœ¦ Tip: rÛ  )"r$  r*  rÝ  r›  r  r¸   rÜ   rª  rÈ   r>  r  rÊ  rT  Útools.env_passthroughr‰  r·   Útools.credential_filesrŠ  r  rl  r¤  Ú&_clear_session_boundary_security_stater  r  rM  r  r!  rº  r¤  rp  rò  rè  Úhermes_cli.tipsr�  )r¿  rã   r$  rê   Ú	old_entryrÚ  rÛ  Ú
_old_agentÚ_qer‰  rŠ  Ú	new_entryr  Ú_old_sidr&  ÚheaderÚ_new_sidr�  Ú	_tip_lines                      r!   rå  z#GatewayRunner._handle_reset_command  s)  è è € à”ˆð ×2Ò2°6Ñ:Ô:ˆØ×/Ò/°ÀOÐ/ÑTÔTÐTð Ô&Ô/×3Ò3°KÑ@Ô@ˆ	õ
 ˜dÐ$7¸Ñ>Ô>ˆØÐ"Øð hð hØÔ+×/Ò/°Ñ<Ô<�Ý+5°g½uÑ+EÔ+EÐg˜W QœZ˜ZÐV]ÐKgÈ7È7Ðcg�
ðhð hð hñ hô hð hð hð hð hð hð høøøð hð hð hð hð Ð%Ø×-Ò-¨jÑ9Ô9Ð9Ø× Ò  Ñ-Ô-Ð-õ
 �dÐ,¨dÑ3Ô3ˆØˆ?Ø�GŠG�K Ñ&Ô&Ð&ð	ØCÐCÐCÐCÐCÐCØ!Ð!Ñ#Ô#Ð#Ð#øÝð 	ð 	ð 	ØˆDð	øøøð	ØEÐEÐEÐEÐEÐEØ"Ð"Ñ$Ô$Ð$Ð$øÝð 	ð 	ð 	ØˆDð	øøøð Ô&×4Ò4°[ÑAÔAˆ	ð 	Ô%×)Ò)¨+°tÑ<Ô<Ð<Ø×,Ò,¨[¸$Ñ?Ô?Ð?ð
 	×3Ò3°KÑ@Ô@Ð@ð	ØFÐFÐFÐFÐFÐFØ/8ÐB�yÔ+Ð+¸dˆHØˆLÐ.¸8Ø;A¼?Ð"R &¤/Ô"7Ð"7ÐPRðTñ Tô Tð Tð Tøåð 	ð 	ð 	ØˆDð	øøøð Œj�oŠo˜mØ17´ÐH˜œÔ-Ð-ÀbØ”~Ø&ð.
ð .
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð Œj�oŠo˜oØ17´ÐH˜œÔ-Ð-ÀbØ”~Ø&ð0
ð 0
ñ ô ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð	Ø×4Ò4Ñ6Ô6ˆLˆLøÝð 	ð 	ð 	ØˆLˆLˆLð	øøøð ð 	0Ø9ˆFˆFð Ô*×@Ò@ÀÐSWÐ@ÑXÔXˆIØ/ˆFð	ØFÐFÐFÐFÐFÐFØ/8ÐB�yÔ+Ð+¸dˆHØˆLÐ+¸Ø;A¼?Ð"R &¤/Ô"7Ð"7ÐPRðTñ Tô Tð Tð Tøåð 	ð 	ð 	ØˆDð	øøøð	Ø6Ð6Ð6Ð6Ð6Ð6Ø8 n nÑ&6Ô&6Ð8Ð8ˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøð ð 	<ØÐ;Ð; ,Ð;°	Ð;Ð;Ð;ØÐ%˜)Ð%Ð%Ð%s~   Á*>B4Â4B8Â;B8ÄD& Ä&
D3Ä2D3Ä7E Å
EÅEÆ92G, Ç,
G9Ç8G9É7J ÊJÊJË2K5 Ë5
LÌLÌL ÌL)Ì(L)c              ƒ   óˆ   K  — ddl m} ddlm}  |¦   «         } |¦   «         }d|› d�d|› d�g}d                     |¦  «        S )u@   Handle /profile â€” show active profile name and home directory.r   ©Údisplay_hermes_homerY  u   ðŸ‘¤ **Profile:** `r	  u   ðŸ“‚ **Home:** `rÛ   )r  rœ  r–  rZ  râ   )r¿  rã   rœ  rZ  r|   Úprofile_namere  s          r!   rð  z%GatewayRunner._handle_profile_commandŒ  s   è è € à8Ð8Ð8Ð8Ð8Ð8Ø?Ð?Ð?Ð?Ð?Ð?à%Ð%Ñ'Ô'ˆØ.Ð.Ñ0Ô0ˆð 2 ,Ð1Ð1Ð1Ø)˜wÐ)Ð)Ð)ð
ˆð
 �yŠy˜ÑÔÐré   c              ƒ   ó`  K  — |j         }| j                             |¦  «        }d„ | j                             ¦   «         D ¦   «         }|j        }|| j        v }|r| j                             |j        ¦  «        nd}|  	                    ||¬¦  «        }d}	| j
        r3	 | j
                             |j        ¦  «        }	n# t          $ r d}	Y nw xY wddd|j        › d�g}
|	r|
                     d|	› �¦  «         |
                     d	|j                             d
¦  «        › �d|j                             d
¦  «        › �d|j        d›�d|rdnd› �g¦  «         |r|
                     d|› �¦  «         |
                     ddd                     |¦  «        › �g¦  «         d                     |
¦  «        S )zHandle /status command.c                 ó   — g | ]	}|j         ‘Œ
S r  rç  rÊ  s     r!   rÌ  z8GatewayRunner._handle_status_command.<locals>.<listcomp>   s   € ÐEÐEÐE¨1˜qœwÐEÐEÐEré   Nrz  u   ðŸ“Š **Hermes Gateway Status**rp   z**Session ID:** `r	  z**Title:** z**Created:** z%Y-%m-%d %H:%Mz**Last Activity:** z**Tokens:** ri  z**Agent Running:** u   Yes âš¡ÚNoz**Queued follow-ups:** z**Connected Platforms:** rÕ  rÛ   )r$  r›  rè  r‡  r0  rê   r¤  r¸   r  r}  r±  Úget_session_titlerM  r·   rá   Úextendré  Ústrftimerê  Útotal_tokensrâ   )r¿  rã   r$  r  Úconnected_platformsrê   Ú
is_runningrí   Úqueue_depthrÆ  re  s              r!   rß  z$GatewayRunner._handle_status_command›  s  è è € à”ˆØÔ*×@Ò@ÀÑHÔHˆàEÐE°´×0BÒ0BÑ0DÔ0DÐEÑEÔEÐð $Ô/ˆØ  DÔ$8Ð8ˆ
ð 9?ÐH�$”-×#Ò# F¤OÑ4Ô4Ð4ÀDˆØ×'Ò'¨¸WÐ'ÑEÔEˆàˆØÔð 	ðØÔ(×:Ò:¸=Ô;SÑTÔT��øÝð ð ð Ø���ðøøøð -ØØ; Ô 8Ð;Ð;Ð;ð
ˆð
 ð 	0Ø�LŠLÐ. uÐ.Ð.Ñ/Ô/Ð/Ø�ŠØQ˜MÔ4×=Ò=Ð>NÑOÔOÐQÐQØW -Ô":×"CÒ"CÐDTÑ"UÔ"UÐWÐWØ9˜=Ô5Ð9Ð9Ð9ØE¨zÐ"C ) )¸tÐEÐEð	
ñ 	ô 	ð 	ð ð 	BØ�LŠLÐ@°;Ð@Ð@ÑAÔAÐAØ�ŠØØH¨¯	ª	Ð2EÑ(FÔ(FÐHÐHð
ñ 	ô 	ð 	ð
 �yŠy˜ÑÔÐs   ÂB; Â;C
Ã	C
c              ƒ   óx  K  — ddl m}m} t          j        ¦   «         }|                      |j        ¦  «        }t          | di ¦  «        pi }t          | di ¦  «        pi }g }|                     ¦   «         D ]´\  }	}
t          | 	                    |	|¦  «        ¦  «        }t          dt          ||z
  ¦  «        ¦  «        }|
t          u }|                     |	||rdnd|rdnt          t          |
dd¦  «        pd¦  «        |rdnt          t          |
d	d¦  «        pd¦  «        d
œ¦  «         Œµ|                     d„ d¬¦  «         g }	 d„ |                     ¦   «         D ¦   «         }n# t"          $ r g }Y nw xY wd„ t          | dt%          ¦   «         ¦  «        pt%          ¦   «         D ¦   «         }dddt'          |¦  «        › �g}|r×t)          |dd…         d¦  «        D ]‚\  }}|d         |k    rdnd}|d         rd|d         › d�nd}|d	         rd|d	         › d�nd}|                     |› d|d         › d|d         › d ||d         ¦  «        › |› |› |› �
¦  «         Œƒt'          |¦  «        dk    r)|                     dt'          |¦  «        dz
  › d �¦  «         |                     dd!t'          |¦  «        › �g¦  «         |�r|dd…         D ]Ç}d"                     t          | 	                    d#d¦  «        ¦  «                             ¦   «         ¦  «        }t'          |¦  «        d$k    r|dd%…         d&z   }|                     d'| 	                    dd(¦  «        › d |t          | 	                    d)d¦  «        ¦  «        ¦  «        › d|› d�¦  «         ŒÈt'          |¦  «        dk    r)|                     dt'          |¦  «        dz
  › d �¦  «         |                     dd*t'          |¦  «        › �g¦  «         |s.|s,|s*|                     d¦  «         |                     d+¦  «         d,                     |¦  «        S )-z>Handle /agents command - list active agents and running tasks.r   )Úformat_uptime_shortrp  r¤  ra  r[  r‹  rp   rM  rb   )rê   ÚelapsedÚstaterM  rb   c                 ó   — | d         S )Nrª  r  )Úrows    r!   ru  z6GatewayRunner._handle_agents_command.<locals>.<lambda>à  s
   € ¨¨I¬€ ré   T)rt  Úreversec                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS )r¡  r‹  rV  rÊ  s     r!   rÌ  z8GatewayRunner._handle_agents_command.<locals>.<listcomp>ä  s7   € ð !ð !ð !ØØ—5’5˜‘?”? iÒ/Ð/ð Ø/Ð/Ð/ré   c                 óZ   — g | ](}t          |d ¦  «        ¯|                     ¦   «         °&|‘Œ)S )Údone)r  r±  )r  Úts     r!   rÌ  z8GatewayRunner._handle_agents_command.<locals>.<listcomp>ë  sH   € ð 
ð 
ð 
ØÝ�q˜&Ñ!Ô!ð
à*+¯&ª&©(¬(ð
Øð
ð 
ð 
ré   r¾  u   ðŸ¤– **Active Agents & Tasks**z**Active agents:** Né   r)   rê   u    Â· this chatu    Â· `r	  z. `u   ` Â· r«  u    Â· rª  z... and z morez"**Running background processes:** rñ   r¬   r€  éW   r®  z- `rR  Úuptime_secondsz**Gateway async jobs:** z"No active agents or running tasks.rÛ   )r™  r©  rp  rV  r*  r$  rÜ   rò  r³  r¸   rÜ  rµ  rÀ  rá   rò   ÚsortÚlist_sessionsr·   r½  rÞ   rÝ   r¢  râ   rô   )r¿  rã   r©  rp  rå  Úcurrent_session_keyÚrunning_agentsÚrunning_startedÚ
agent_rowsrê   rq   Ústartedrª  Ú
is_pendingÚrunning_processesÚbackground_tasksre  Úidxr­  ÚcurrentÚsidrb   r;  rE  s                           r!   rê  z$GatewayRunner._handle_agents_commandÇ  sy  è è € àPÐPÐPÐPÐPÐPÐPÐPåŒi‰kŒkˆØ"×:Ò:¸5¼<ÑHÔHÐå& tÐ->ÀÑCÔCÐIÀrˆÝ '¨Ð.BÀBÑ GÔ GÐ MÈ2ˆà!#ˆ
Ø"0×"6Ò"6Ñ"8Ô"8ð 	ð 	ÑˆK˜Ý˜O×/Ò/°¸SÑAÔAÑBÔBˆGÝ˜!�S  w¡Ñ/Ô/Ñ0Ô0ˆGØÕ"9Ð9ˆJØ×Òà#.Ø&Ø+5ÐD˜Z˜Z¸9Ø(2Ð"c " "½½GÀEÈ<ÐY[Ñ<\Ô<\Ð<bÐ`bÑ8cÔ8cØ#-ÐY˜R˜Rµ3µw¸uÀgÈrÑ7RÔ7RÐ7XÐVXÑ3YÔ3Yðð ñô ð ð ð 	�ŠÐ6Ð6ÀˆÑEÔEÐEà(*Ðð	#ð!ð !Ø+×9Ò9Ñ;Ô;ð!ñ !ô !ÐÐøõ ð 	#ð 	#ð 	#Ø "ÐÐÐð	#øøøð
ð 
Ý Ð&9½3¹5¼5ÑAÔAÐJÅSÁUÄUð
ñ 
ô 
Ðð -ØØ3¥# j¡/¤/Ð3Ð3ð
ˆð ð 
	EÝ% j°°"°¤o°qÑ9Ô9ð ð ‘��SØ-0°Ô-?ÐCVÒ-VÐ-V˜/˜/Ð\^�Ø69¸,Ô6GÐOÐ2˜c ,Ô/Ð2Ð2Ð2Ð2ÈR�Ø36°w´<ÐGÐ/  G¤Ð/Ð/Ð/Ð/ÀR�Ø—’Øð Rð R˜s =Ô1ð Rð R¸¸G¼ð Rð RØ*Ð*¨3¨y¬>Ñ:Ô:ðRØ<?ðRØAFðRØHOðRð Rñô ð ð õ �:‰Œ Ò#Ð#Ø—’ÐC­¨J©¬¸"Ñ(<ÐCÐCÐCÑDÔDÐDà�ŠàØMµSÐ9JÑ5KÔ5KÐMÐMðñ	
ô 	
ð 	
ð ñ 
	LØ)¨#¨2¨#Ô.ð ð �Ø—h’h�s 4§8¢8¨I°rÑ#:Ô#:Ñ;Ô;×AÒAÑCÔCÑDÔD�Ý�s‘8”8˜b’=�=Ø˜c˜r˜cœ( UÑ*�CØ—’ð\˜$Ÿ(š( <°Ñ5Ô5ð \ð \Ø*Ð*­3¨t¯xªxÐ8HÈ!Ñ/LÔ/LÑ+MÔ+MÑNÔNð\ð \ØUXð\ð \ð \ñô ð ð õ Ð$Ñ%Ô%¨Ò*Ð*Ø—’ÐJ­Ð,=Ñ(>Ô(>ÀÑ(CÐJÐJÐJÑKÔKÐKà�ŠàØB­3Ð/?Ñ+@Ô+@ÐBÐBðñ	
ô 	
ð 	
ð ð 	?Ð"3ð 	?Ð<Lð 	?Ø�LŠL˜ÑÔÐØ�LŠLÐ=Ñ>Ô>Ð>à�yŠy˜ÑÔÐs   ÅE# Å#E2Å1E2c              ƒ   ór  K  — |j         }| j                             |¦  «        }|j        }| j                             |¦  «        }|t          u rA|                      ||t          d¬¦  «        ƒ d{V —† t           
                    d|¦  «         dS |r&|                      ||t          d¬¦  «        ƒ d{V —† dS dS )	að  Handle /stop command - interrupt a running agent.

        When an agent is truly hung (blocked thread that never checks
        _interrupt_requested), the early intercept in _handle_message()
        handles /stop before this method is reached.  This handler fires
        only through normal command dispatch (no running agent) or as a
        fallback.  Force-clean the session lock in all cases for safety.

        The session is preserved so the user can continue the conversation.
        Ústop_command_pendingr¥  Nu2   STOP (pending) for session %s â€” sentinel cleareduL   âš¡ Stopped. The agent hadn't started yet â€” you can continue this session.Ústop_command_handlerr¨  zNo active task to stop.)r$  r›  rè  rê   r¤  r¸   rÀ  râ  rã  r³   rÊ   )r¿  rã   r$  r  rê   rq   s         r!   rô  z"GatewayRunner._handle_stop_command!  s  è è € ð ”ˆØÔ*×@Ò@ÀÑHÔHˆØ#Ô/ˆàÔ$×(Ò(¨Ñ5Ô5ˆØÕ+Ð+Ð+à×3Ò3ØØÝ!7Ø$:ð	 4ñ ô ð ð ð ð ð ð ð õ �KŠKÐLÈkÑZÔZÐZØaÐaØð 	-ð ×3Ò3ØØÝ!7Ø$:ð	 4ñ ô ð ð ð ð ð ð ð ð AÐ@à,Ð,ré   c              ƒ   ó®  K  — |                       |¦  «        rGt                               d|j        r|j        j        r|j        j        j        nd|j        ¦  «         dS | j        s| j        r|  	                    ¦   «         }|rd|› d�S dS 	 |j        j        r|j        j        j        nd|j        j
        dœ}|j        j        r|j        j        |d	<   t          d
z                       t          j        |¦  «        ¦  «         n2# t           $ r%}t                               d|¦  «         Y d}~nd}~ww xY w	 |j        j        r|j        j        j        ndt%          j        ¦   «         dœ}|j        �
|j        |d<   t          dz                       t          j        |¦  «        ¦  «         n2# t           $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|  	                    ¦   «         }t'          t(          j                             d¦  «        ¦  «        }|r|                      dd¬¦  «         n|                      dd¬¦  «         |rd|› d�S dS )zFHandle /restart command - drain active work, then restart the gateway.uo   Ignoring redelivered /restart (platform=%s, update_id=%s) â€” already processed by a previous gateway instance.rR  rp   u   â�³ Draining z" active agent(s) before restart...u*   â�³ Gateway restart already in progress...N)r  rC  rF  ú.restart_notify.jsonz'Failed to write restart notify file: %s)r  Úrequested_atÚ	update_idú.restart_last_processed.jsonz(Failed to write restart dedup marker: %sÚINVOCATION_IDFTrI  uy   â™» Restarting gateway. If you aren't notified within 60 seconds, restart from the console with `hermes gateway restart`.)Ú_is_stale_restart_redeliveryr³   rÊ   r$  r  r!  Úplatform_update_idrg  rf  ra  rC  rF  rÅ   rû  rÔ  rü  r·   rË   rV  r¶  r   r   r¸   rW  )r¿  rã   ÚcountÚnotify_datarÁ  Ú
dedup_datarƒ  Ú_under_services           r!   rá  z%GatewayRunner._handle_restart_commandH  sØ  è è € ð ×,Ò,¨UÑ3Ô3ð 	Ý�KŠKðDà/4¬|Ð^ÀÄÔ@UÐ^�”Ô%Ô+Ð+Ð[^ØÔ(ñ	ô ð ð �2àÔ"ð 	@ d¤nð 	@Ø×-Ò-Ñ/Ô/ˆEØð QØP uÐPÐPÐPÐPØ?Ð?ð	Gà;@¼<Ô;PÐZ˜EœLÔ1Ô7Ð7ÐVZØ œ<Ô/ðð ˆKð Œ|Ô%ð BØ+0¬<Ô+A�˜KÑ(ÝÐ2Ñ2×>Ò>Ý”
˜;Ñ'Ô'ñô ð ð øõ ð 	Gð 	Gð 	GÝ�LŠLÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøð	Gøøøð	Hà;@¼<Ô;PÐZ˜EœLÔ1Ô7Ð7ÐVZÝ $¤	¡¤ðð ˆJð Ô'Ð3Ø*/Ô*B�
˜;Ñ'ÝÐ:Ñ:×FÒFÝ”
˜:Ñ&Ô&ñô ð ð øõ ð 	Hð 	Hð 	HÝ�LŠLÐCÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøð	Høøøð ×1Ò1Ñ3Ô3ˆõ �bœjŸnšn¨_Ñ=Ô=Ñ>Ô>ˆØð 	CØ× Ò ¨%¸TÐ ÑBÔBÐBÐBà× Ò ¨$¸EÐ ÑBÔBÐBØð 	UØT =ÐTÐTÐTÐTð Kð  Ks2   ÂA6D Ä
D2ÄD-Ä-D2Ä6A3F* Æ*
GÆ4GÇGc                 óŽ  — |�|j         €dS |j        €dS |j         j        €dS 	 |j         j        j        }n# t          $ r Y dS w xY w|dk    rdS 	 t
          dz  }|                     ¦   «         sdS t          j        | 	                    ¦   «         ¦  «        }n# t          $ r Y dS w xY w| 
                    d¦  «        |k    rdS | 
                    d¦  «        }t          |t          ¦  «        sdS | 
                    d¦  «        }t          |t          t          f¦  «        rt          j        ¦   «         |z
  dk    rdS |j        |k    S )	aB  Return True if this /restart is a Telegram re-delivery we already handled.

        The previous gateway wrote ``.restart_last_processed.json`` with the
        triggering platform + update_id when it processed the /restart.  If
        we now see a /restart on the same platform with an update_id <= that
        recorded value AND the marker is recent (< 5 minutes), it's a
        redelivery and should be ignored.

        Only applies to Telegram today (the only platform that exposes a
        numeric cross-session update ordering); other platforms return False.
        NFÚtelegramrÊ  r  rÉ  rÈ  r¿  )r$  rÍ  r  r!  r·   rÅ   r   rÔ  rÕ  rî  r¸   rÈ   rµ  r³  rV  )r¿  rã   Úplatform_valueÚmarker_pathró  Úrecorded_uidrÈ  s          r!   rÌ  z*GatewayRunner._is_stale_restart_redelivery”  sy  € ð ˆ=˜EœLÐ0Ø�5ØÔ#Ð+Ø�5ØŒ<Ô Ð(Ø�5ð	Ø"œ\Ô2Ô8ˆNˆNøÝð 	ð 	ð 	Ø�5�5ð	øøøà˜ZÒ'Ð'Ø�5ð	Ý&Ð)GÑGˆKØ×%Ò%Ñ'Ô'ð Ø�uÝ”:˜k×3Ò3Ñ5Ô5Ñ6Ô6ˆDˆDøÝð 	ð 	ð 	Ø�5�5ð	øøøð �8Š8�JÑÔ >Ò1Ð1Ø�5Ø—x’x Ñ,Ô,ˆÝ˜,­Ñ,Ô,ð 	Ø�5ð —x’x Ñ/Ô/ˆÝ�l¥S­% LÑ1Ô1ð 	ÝŒy‰{Œ{˜\Ñ)¨CÒ/Ð/Ø�uØÔ'¨<Ò7Ð7s'   ¤6 ¶
AÁAÁB Á0&B Â
B%Â$B%c              ƒ   óè  K  — ddl m} dg |¦   «         ¢}	 ddlm}  |¦   «         }|r¥|                     dt          |¦  «        › d�¦  «         t          |¦  «        }|dd…         D ])}|                     d	|› d
||         d         › �¦  «         Œ*t          |¦  «        dk    r)|                     dt          |¦  «        dz
  › d�¦  «         n# t          $ r Y nw xY wd                     |¦  «        S )z/Handle /help command - list available commands.r   ©Úgateway_help_linesu   ðŸ“– **Hermes Commands**
©rÏ  u   
âš¡ **Skill Commands** (z	 active):Nræ  r	  õ   ` â€” Údescriptionz	
... and z3 more. Use `/commands` for the full paginated list.rÛ   )	rà  rÙ  r  rÏ  rá   rÞ   rÉ  r·   râ   )r¿  rã   rÙ  re  rÏ  r?  Úsorted_cmdsrE  s           r!   rî  z"GatewayRunner._handle_help_commandÆ  sL  è è € à:Ð:Ð:Ð:Ð:Ð:à(ð
àÐÑ!Ô!ð
ˆð	Ø?Ð?Ð?Ð?Ð?Ð?Ø+Ð+Ñ-Ô-ˆJØð zØ—’ÐT½#¸j¹/¼/ÐTÐTÐTÑUÔUÐUå$ ZÑ0Ô0�Ø& s¨ sÔ+ð Rð R�CØ—L’LÐ!P SÐ!PÐ!P°
¸3´ÀÔ0NÐ!PÐ!PÑQÔQÐQÐQÝ�{Ñ#Ô# bÒ(Ð(Ø—L’LÐ!x­c°+Ñ.>Ô.>ÀÑ.CÐ!xÐ!xÐ!xÑyÔyÐyøøÝð 	ð 	ð 	ØˆDð	øøøà�yŠy˜ÑÔÐs   —B7C Ã
CÃCc              ƒ   óº  K  — ddl m} |                     ¦   «                              ¦   «         }|r"	 t	          |¦  «        }n# t
          $ r Y dS w xY wd}t           |¦   «         ¦  «        }	 ddlm}  |¦   «         }|r‡| 	                    d¦  «         | 	                    d¦  «         t          |¦  «        D ]M}||                              dd¦  «                             ¦   «         pd	}	| 	                    d
|› d|	› �¦  «         ŒNn# t          $ r Y nw xY w|sdS ddlm}
 |j        j        |
j        k    rdnd}t%          dt'          |¦  «        |z   dz
  |z  ¦  «        }t%          dt)          ||¦  «        ¦  «        }|dz
  |z  }||||z   …         }dt'          |¦  «        › d|› d|› d�dg|¢}|dk    rpg }|dk    r| 	                    d|dz
  › d�¦  «         ||k     r| 	                    d|dz   › d
�¦  «         |                     dd                     |¦  «        g¦  «         ||k    r| 	                    d|› d|› d�¦  «         d                     |¦  «        S )zDHandle /commands [page] - paginated list of all commands and skills.r   rØ  zUsage: `/commands [page]`r)   rÚ  rp   u   âš¡ **Skill Commands**:rÜ  zSkill commandr	  rÛ  zNo commands available.©r�   rØ  rå  u   ðŸ“š **Commands** (z total, page r  rÖ  z`/commands u
   ` â†� prevu   next â†’ `/commands z | z_(Requested page z  was out of range, showing page z.)_rÛ   )rà  rÙ  ræ  ró   rµ  r™  r¹   r  rÏ  rá   rÉ  r¸   r·   Úgateway.configr�   r$  r  r9  rÜ  rÞ   rç  r¢  râ   )r¿  rã   rÙ  r–  Úrequested_pageÚentriesrÏ  r?  rE  Údescr�   Ú	page_sizeÚtotal_pagesÚpager¾  Úpage_entriesre  Ú	nav_partss                     r!   rï  z&GatewayRunner._handle_commands_commandÜ  s  è è € à:Ð:Ð:Ð:Ð:Ð:à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØð 	ð3Ý!$ X¡¤��øÝð 3ð 3ð 3Ø2Ð2Ð2ð3øøøð ˆNõ Ð)Ð)Ñ+Ô+Ñ,Ô,ˆð
	Ø?Ð?Ð?Ð?Ð?Ð?Ø+Ð+Ñ-Ô-ˆJØð :Ø—’˜rÑ"Ô"Ð"Ø—’Ð8Ñ9Ô9Ð9Ý! *Ñ-Ô-ð :ð :�CØ% cœ?×.Ò.¨}¸bÑAÔA×GÒGÑIÔIÐ\È_�DØ—N’NÐ#8 sÐ#8Ð#8°$Ð#8Ð#8Ñ9Ô9Ð9Ð9øøÝð 	ð 	ð 	ØˆDð	øøøð ð 	,Ø+Ð+à+Ð+Ð+Ð+Ð+Ð+Øœ,Ô/°8Ô3DÒDÐD�B�BÈ"ˆ	Ý˜!�c '™lœl¨YÑ6¸Ñ:¸yÑHÑIÔIˆÝ�1•c˜.¨+Ñ6Ô6Ñ7Ô7ˆØ˜‘˜YÑ&ˆØ˜u U¨YÑ%6Ð6Ô7ˆð S¥# g¡,¤,ÐRÐR¸TÐRÐRÀKÐRÐRÐRØð
ð ð
ˆð
 ˜Š?ˆ?ØˆIØ�aŠxˆxØ× Ò Ð!C¨t°a©xÐ!CÐ!CÐ!CÑDÔDÐDØ�kÒ!Ð!Ø× Ò Ð!C¸¸q¹Ð!CÐ!CÐ!CÑDÔDÐDØ�LŠL˜"˜eŸjšj¨Ñ3Ô3Ð4Ñ5Ô5Ð5Ø�>Ò!Ð!Ø�LŠLÐf¨^ÐfÐfÐ]aÐfÐfÐfÑgÔgÐgØ�yŠy˜ÑÔÐs$   ²A Á
AÁAÁ-BD Ä
DÄDc              ƒ   ó€  ‡*‡+‡,‡-‡.‡/‡0‡1‡2‡3‡4K  — ddl }ddlmŠ0m}m} ddlm} |                     ¦   «                              ¦   «         } ||¦  «        \  }}}	d}
d}dŠ2dŠ1dŠ4dŠ3t          dz  }	 | 
                    ¦   «         rút          |d¬	¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     d
i ¦  «        }t          |t          ¦  «        rB|                     dd¦  «        }
|                     d|¦  «        }|                     dd¦  «        Š2|                     d¦  «        Š4	 ddlm}  ||¦  «        Š3n%# t$          $ r |                     d¦  «        Š3Y nw xY wn# t$          $ r Y nw xY w|j        }|                      |¦  «        }| j                             |i ¦  «        }|rX|                     d
|
¦  «        }
|                     d|¦  «        }|                     d‰2¦  «        Š2|                     d‰1¦  «        Š1|�s‡|�s„| j                             |j        ¦  «        }|duot1          t3          |¦  «        dd¦  «        du}|r 	  ||‰2‰4‰3d¬¦  «        }n# t$          $ r g }Y nw xY w|rz| Š.|Š/|
Š,|Š-‰2Š+‰1Š*dt4          dt4          dt4          dt4          fˆ*ˆ+ˆ,ˆ-ˆ.ˆ/ˆ0ˆ1ˆ2ˆ3ˆ4fd„}|j        r	d|j        ind}|                     |j        ||
||||¬¦  «        ƒ d{V —†}|j        rdS  ||¦  «        }d|
pd› d|› �dg}	  ||‰2‰4‰3d¬¦  «        }|D �]}|d          rd!nd}|                     d"|d#         › d$|d%         › d&|› d'�¦  «         |d(         rƒd)                      d*„ |d(         D ¦   «         ¦  «        }|d+         tC          |d(         ¦  «        k    r"d,|d+         tC          |d(         ¦  «        z
  › d-�nd}|                     d.|› |› �¦  «         n4|                     d/¦  «        r|                     d0|d/         › d&�¦  «         |                     d¦  «         �Œn# t$          $ r Y nw xY w|                     d1¦  «         |                     d2¦  «         |                     d3¦  «         d4                      |¦  «        S  ‰0|||
‰2‰1|	|‰4‰3¬5¦	  «	        }|j        s
d6|j"        › �S d} t1          | d7d¦  «        }!t1          | d8d¦  «        }"|!r1|"�/|!5  |"                     |¦  «        } ddd¦  «         n# 1 swxY w Y   | ru| d         �m	 | d                              |j#        |j$        |j%        |j&        |j'        ¬9¦  «         n2# t$          $ r%}#tP           )                    d:|#¦  «         Y d}#~#nd}#~#ww xY wtU          | d;¦  «        si | _+        d<|
› d=|j#        › d>|j,        p|j$        › d?�| j+        |<   |j#        |j$        |j%        |j&        |j'        d@œ| j        |<   |  -                    |¦  «         |	r×	 | 
                    ¦   «         rAt          |d¬	¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   ni }| .                    d
i ¦  «        }|j#        |d<   |j$        |d<   |j&        r
|j&        |d<   ddAlm/}$  |$|¦  «         n2# t$          $ r%}%tP           )                    dB|%¦  «         Y d}%~%nd}%~%ww xY w|j,        p|j$        }dC|j#        › d&�g}|                     dD|› �¦  «         |j0        }&ddElm1}'  |'|j#        |j$        |j&        p‰2pd|j%        p‰1pd|&‰3¬F¦  «        }(|(r|                     dG|(dH›dI�¦  «         |&rŽ|&j2        r|                     dJ|&j2        dH›dI�¦  «         |& 3                    ¦   «         r*|                     dK|& 4                    ¦   «         › �¦  «         |                     dL|& 5                    ¦   «         › �¦  «         tm          |j&        pddM¦  «        rdN|j#         7                    ¦   «         v p
|j'        dOk    })|)r|                     dP¦  «         |j8        r|                     dQ|j8        › �¦  «         |	r|                     dR¦  «         n|                     dS¦  «         d4                      |¦  «        S )Tuþ  Handle /model command â€” switch model for this session.

        Supports:
          /model                              â€” interactive picker (Telegram/Discord) or text list
          /model <name>                       â€” switch for this session only
          /model <name> --global              â€” switch and persist to config.yaml
          /model <name> --provider <provider> â€” switch provider + model
          /model --provider <provider>        â€” switch to provider, auto-detect model
        r   N)Úswitch_modelÚparse_model_flagsÚlist_authenticated_providers)Ú	get_labelrp   r€  r,   r-   r.   rb   r+  ra   rc   Ú	providersrœ  rž  rd   Úsend_model_pickerrÔ  )Úcurrent_providerÚcurrent_base_urlÚuser_providersrž  Ú
max_modelsÚ_chat_idÚmodel_idÚprovider_slugr   c              “   óf  •K  —  ‰|‰‰‰‰d|‰‰¬¦	  «	        }|j         s
d|j        › �S d}t          ‰dd¦  «        }t          ‰dd¦  «        }|r1|�/|5  |                     ‰¦  «        }ddd¦  «         n# 1 swxY w Y   |ru|d         �m	 |d                              |j        |j        |j        |j        |j	        ¬¦  «         n2# t          $ r%}t                               d	|¦  «         Y d}~nd}~ww xY wt          ‰d
¦  «        si ‰_        d‰› d|j        › d|j        p|j        › d�‰j        ‰<   |j        |j        |j        |j        |j	        dœ‰j        ‰<   ‰                     ‰¦  «         |j        p|j        }d|j        › d�g}	|	                     d|› �¦  «         |j        }
ddlm}  ||j        |j        |j        p‰pd|j        p‰pd|
‰¬¦  «        }|r|	                     d|d›d�¦  «         |
rŽ|
j        r|	                     d|
j        d›d�¦  «         |
                     ¦   «         r*|	                     d|
                     ¦   «         › �¦  «         |	                     d|
                     ¦   «         › �¦  «         |	                     d¦  «         d                     |	¦  «        S )z6Perform the model switch and return confirmation text.F©	Ú	raw_inputrð  Úcurrent_modelrñ  Úcurrent_api_keyÚ	is_globalÚexplicit_providerrò  rž  úError: Nr¬  rª  r   ©Ú	new_modelÚnew_providerrd   rc   r«   z/Picker model switch failed for cached agent: %sÚ_pending_model_notesú$[Note: model was just switched from ú to ú via ú/. Adjust your self-identification accordingly.]©rb   ra   rd   rc   r«   úModel switched to `r	  ú
Provider: ©Úresolve_display_context_lengthrp   ©rc   rd   Ú
model_inforž  ú	Context: ri  ú tokensúMax output: úCost: úCapabilities: u<   _(session only â€” use `/model <name> --global` to persist)_rÛ   )r¸  rJ  rÜ   r¸   rê  r   Útarget_providerrd   rc   r«   r·   r³   r´   r  r  Úprovider_labelrl  rÊ  rá   r  Úhermes_cli.model_switchr  Ú
max_outputÚhas_cost_dataÚformat_costÚformat_capabilitiesrâ   )rô  rõ  rö  rG  Úcached_entryrÚ  r  r½   Úplabelre  Úmir  ÚctxÚ_cur_api_keyÚ_cur_base_urlÚ
_cur_modelÚ_cur_providerÚ_selfÚ_session_keyÚ_switch_modelrû  rñ  r‚  Ú
user_provss                €€€€€€€€€€€r!   Ú_on_model_selectedz?GatewayRunner._handle_model_command.<locals>._on_model_selectedj  s÷  øè è € ð "/ Ø&.Ø-:Ø*4Ø-:Ø,8Ø&+Ø.;Ø+5Ø-9ð
"ñ 
"ô 
"˜ð  &œ~ð DØ#C¨VÔ-AÐ#CÐ#CÐCð (,˜Ý&-¨eÐ5HÈ$Ñ&OÔ&O˜Ý!(¨°ÀÑ!EÔ!E˜Ø&ð H¨6Ð+=Ø!,ð Hð HØ/5¯zªz¸,Ñ/GÔ/G ðHð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hà'ð 
g¨L¸¬OÐ,Gð	gØ ,¨Q¤× <Ò <Ø.4Ô.>Ø17Ô1GØ,2¬NØ-3¬_Ø-3¬_ð !=ñ !"ô !"ð !"ð !"øõ $-ð gð gð gÝ &§¢Ð/`ÐbeÑ fÔ fÐ fÐ fÐ fÐ fÐ fÐ føøøøðgøøøõ  ' uÐ.DÑEÔEð <Ø9;˜EÔ6ðMÀ:ð Mð MÐSYÔScð Mð MØ#)Ô#8Ð#R¸FÔ<RðMð Mð Mð Ô2°<Ñ@ð &,Ô%5Ø(.Ô(>Ø'-¤~Ø(.¬Ø(.¬ðHð H˜Ô6°|ÑDð ×1Ò1°,Ñ?Ô?Ð?ð "(Ô!6Ð!P¸&Ô:P˜Ø!J°vÔ7GÐ!JÐ!JÐ!JÐ K˜ØŸšÐ%:°&Ð%:Ð%:Ñ;Ô;Ð;Ø#Ô.˜ØZÐZÐZÐZÐZÐZØ<Ð<Ø"Ô,Ø"Ô2Ø%+¤_Ð%NÐ8HÐ%NÈBØ$*¤NÐ$K°oÐ$KÈØ')Ø-9ðñ ô ˜ð ð EØ!ŸLšLÐ)C°SÐ)CÐ)CÐ)CÐ)CÑDÔDÐDØð VØ!œ}ð VØ %§¢Ð-T¸B¼MÐ-TÐ-TÐ-TÐ-TÑ UÔ UÐ UØ!×/Ò/Ñ1Ô1ð JØ %§¢Ð-H°b·n²nÑ6FÔ6FÐ-HÐ-HÑ IÔ IÐ IØ!ŸLšLÐ)T¸"×:PÒ:PÑ:RÔ:RÐ)TÐ)TÑUÔUÐUØŸšÐ%cÑdÔdÐdØ#Ÿyšy¨Ñ/Ô/Ð/s*   ÁA5Á5A9Á<A9Â9C Ã
C4ÃC/Ã/C4rF  )rC  rî  rú  rð  rê   Úon_model_selectedrÌ  z
Current: `rN  z` on r=  Ú
is_currentz
 (current)ú**r  z** `--provider Úslugr	  r<  rŸ  rÕ  c              3   ó"   K  — | ]
}d |› d �V — ŒdS ©r	  Nr  r®  s     r!   r  z6GatewayRunner._handle_model_command.<locals>.<genexpr>Ú  s*   è è € Ð.MÐ.M¸A¨x°1¨x¨x¨xÐ.MÐ.MÐ.MÐ.MÐ.MÐ.Mré   Útotal_modelsz (+z more)z  Úapi_urlz  `u    `/model <name>` â€” switch modelu5   `/model <name> --provider <slug>` â€” switch provideru$   `/model <name> --global` â€” persistrÛ   rø  rþ  r¬  rª  rÿ  z1In-place model switch failed for cached agent: %sr  r  r  r  r  r  )Úsave_configz"Failed to persist model switch: %sr  r	  r
  r  r  ri  r  r  r  r  zopenrouter.aiÚclaudeÚanthropic_messageszPrompt caching: enabledz	Warning: z!Saved to config.yaml (`--global`)z-_(session only -- add `--global` to persist)_)9rÄ   r  rê  rë  rì  Úhermes_cli.providersrí  ræ  ró   rÅ   r   rÆ   rÇ   r¸   rÈ   rÉ   r³  r�  r·   r$  r*  rl  r‡  r  rÜ   rK  rò   rF  rï  rC  r¸  rá   râ   rÞ   rJ  r   r  rd   rc   r«   r³   r´   r  r  r  rÊ  rp  r/  r  r  r  r  r  r  r%   rõ   Úwarning_message)5r¿  rã   rÄ   rë  rì  rí  r–  Úmodel_inputrý  r›  rú  rð  r&  r'  rÏ   r,  r�  r$  rê   r4  rí   Ú
has_pickerrî  r&  rÌ  rG  r  re  rË  ÚtagÚ
model_strsr  r  rÚ  r  r½   r/  rÁ  r  r  r  Úcache_enabledr  r  r   r!  r"  r#  r$  rû  rñ  r‚  r%  s5                                             @@@@@@@@@@@r!   r÷  z#GatewayRunner._handle_model_command  s©  øøøøøøøøøøøè è € ð 	ˆˆˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	3Ð2Ð2Ð2Ð2Ð2à×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆð :KÐ9JÈ8Ñ9TÔ9TÑ6ˆÐ&¨ð ˆØ'ÐØÐØˆØˆ
ØˆÝ" ]Ñ2ˆð	Ø×!Ò!Ñ#Ô#ð ?Ý˜+°Ð8Ñ8Ô8ð 2¸AØŸ.š.¨Ñ+Ô+Ð1¨r�Cð2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2àŸGšG G¨RÑ0Ô0�	Ý˜i­Ñ.Ô.ð EØ$-§M¢M°)¸RÑ$@Ô$@�MØ'0§}¢}°ZÐAQÑ'RÔ'RÐ$Ø'0§}¢}°ZÀÑ'DÔ'DÐ$Ø ŸWšW [Ñ1Ô1�
ð?ØQÐQÐQÐQÐQÐQØ#BÐ#BÀ3Ñ#GÔ#G�L�LøÝ ð ?ð ?ð ?Ø#&§7¢7Ð+=Ñ#>Ô#>�L�L�Lð?øøøøøåð 	ð 	ð 	ØˆDð	øøøð ”ˆØ×2Ò2°6Ñ:Ô:ˆØÔ0×4Ò4°[À"ÑEÔEˆØð 	GØ$ŸLšL¨°-Ñ@Ô@ˆMØ'Ÿ|š|¨JÐ8HÑIÔIÐØ'Ÿ|š|¨JÐ8HÑIÔIÐØ&Ÿlšl¨9°oÑFÔFˆOð ñ Z	$Ð#4ñ Z	$à”m×'Ò'¨¬Ñ8Ô8ˆGà˜tÐ#ð RÝ�D ™MœMÐ+>ÀÑEÔEÈTÐQð ð
 ð t$ð	#Ø <Ð <Ø)9Ø)9Ø'1Ø)5Ø#%ð!ñ !ô !�I�Iøõ !ð #ð #ð #Ø "�I�I�Ið#øøøð ð h$ð !�EØ#.�LØ!.�JØ$4�MØ$4�MØ#2�LðQ0Ý"%ðQ0Ý14ðQ0ÝEHðQ0åðQ0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ð Q0ðf CIÔBRÐ\ ¨VÔ-=Ð>Ð>ÐX\�HØ#*×#<Ò#<Ø &¤Ø"+Ø&3Ø)9Ø$/Ø*<Ø!)ð $=ñ $ô $ð ð ð ð ð ð �Fð ”~ð $Ø#˜tð '˜YÐ'7Ñ8Ô8ˆNØS -Ð"<°9ÐSÐSÀ>ÐSÐSÐUWÐXˆEðØ8Ð8Ø%5Ø%5Ø#-Ø%1Ø ðñ ô �	ð #ð 	%ñ 	%�AØ*+¨L¬/ÐA˜,˜,¸r�CØ—L’LÐ!R a¨¤iÐ!RÐ!RÀÀ&Ä	Ð!RÐ!RÈCÐ!RÐ!RÐ!RÑSÔSÐSØ˜”{ð <Ø%)§Y¢YÐ.MÐ.MÀÀ8ÄÐ.MÑ.MÔ.MÑ%MÔ%M˜
ØVWÐXfÔVgÕjmÐnoÐpxÔnyÑjzÔjzÒVzÐVzÐ R a¨Ô&7½#¸aÀ¼kÑ:JÔ:JÑ&JÐ RÐ RÐ RÐ Rð  AC˜ØŸšÐ%=¨*Ð%=°eÐ%=Ð%=Ñ>Ô>Ð>Ð>ØŸš˜yÑ)Ô)ð <ØŸšÐ%:¨1¨Y¬<Ð%:Ð%:Ð%:Ñ;Ô;Ð;Ø—L’L Ñ$Ô$Ð$Ñ$ð	%øõ ð ð ð Ø�ðøøøð �LŠLÐ;Ñ<Ô<Ð<Ø�LŠLÐPÑQÔQÐQØ�LŠLÐ?Ñ@Ô@Ð@Ø—9’9˜UÑ#Ô#Ð#ð �Ø!Ø-Ø'Ø-Ø+Ø$Ø/Ø%Ø)ð

ñ 

ô 

ˆð Œ~ð 	4Ø3˜VÔ1Ð3Ð3Ð3ð ˆÝ˜dÐ$7¸Ñ>Ô>ˆÝ˜˜~¨tÑ4Ô4ˆØð 	7˜6Ð-Øð 7ð 7Ø%Ÿzšz¨+Ñ6Ô6�ð7ð 7ð 7ñ 7ô 7ð 7ð 7ð 7ð 7ð 7ð 7øøøð 7ð 7ð 7ð 7ð ð 
	Y˜L¨œOÐ7ð	YØ˜Q”×,Ò,Ø$Ô.Ø!'Ô!7Ø"œNØ#œ_Ø#œ_ð -ñ ô ð ð øõ ð Yð Yð YÝ—’ÐRÐTWÑXÔXÐXÐXÐXÐXÐXÐXøøøøðYøøøõ
 �tÐ3Ñ4Ô4ð 	+Ø(*ˆDÔ%ð=°=ð =ð =ÀfÔFVð =ð =ØÔ(ÐB¨FÔ,Bð=ð =ð =ð 	Ô! +Ñ.ð Ô%ØÔ.Ø”~ØœØœð6
ð 6
ˆÔ% kÑ2ð 	× Ò  Ñ-Ô-Ð-ð ð 	HðHØ×%Ò%Ñ'Ô'ð Ý˜k°GÐ<Ñ<Ô<ð 6ÀØ"Ÿnšn¨QÑ/Ô/Ð5°2˜ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6øð �CØŸNšN¨7°BÑ7Ô7�	Ø'-Ô'7�	˜)Ñ$Ø(.Ô(>�	˜*Ñ%Ø”?ð <Ø,2¬O�I˜jÑ)Ø9Ð9Ð9Ð9Ð9Ð9Ø�˜CÑ Ô Ð Ð øÝð Hð Hð HÝ—’ÐCÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøð  Ô.ÐH°&Ô2HˆØ: vÔ'7Ð:Ð:Ð:Ð;ˆØ�ŠÐ2 .Ð2Ð2Ñ3Ô3Ð3ð ÔˆØJÐJÐJÐJÐJÐJØ,Ð,ØÔØÔ"Ø”_Ð>Ð(8Ð>¸BØ”NÐ; oÐ;¸ØØ)ð
ñ 
ô 
ˆð ð 	5Ø�LŠLÐ3 SÐ3Ð3Ð3Ð3Ñ4Ô4Ð4Øð 	FØŒ}ð FØ—’ÐD¨B¬MÐDÐDÐDÐDÑEÔEÐEØ×ÒÑ!Ô!ð :Ø—’Ð8 b§n¢nÑ&6Ô&6Ð8Ð8Ñ9Ô9Ð9Ø�LŠLÐD¨"×*@Ò*@Ñ*BÔ*BÐDÐDÑEÔEÐEõ # 6¤?Ð#8°b¸/ÑJÔJÐsÈxÐ[aÔ[k×[qÒ[qÑ[sÔ[sÐOsð 7ØŒÐ"6Ò6ð 	ð ð 	4Ø�LŠLÐ2Ñ3Ô3Ð3àÔ!ð 	?Ø�LŠLÐ= VÔ%;Ð=Ð=Ñ>Ô>Ð>àð 	JØ�LŠLÐ<Ñ=Ô=Ð=Ð=à�LŠLÐHÑIÔIÐIà�yŠy˜ÑÔÐsç   Á.%E= ÂB7Â+E= Â7B;Â;E= Â>B;Â?BE= ÅE ÅE= ÅE9Å6E= Å8E9Å9E= Å=
F
Æ	F
É*I; É;J
Ê	J
Ì!D"Q Ñ
QÑQÓ7TÔTÔ TÔ/9U) Õ)
VÕ3VÖVØ%Z< Ø=Y!ÙZ< Ù!Y%Ù%Z< Ù(Y%Ù)AZ< Ú<
[+Û[&Û&[+c              ƒ   ó  K  — ddl }ddlm} |                     ¦   «                              ¦   «                              ¦   «         }t          dz  }	 |                     ¦   «         rlt          |dd¬¦  «        5 }| 	                    |¦  «        pi }ddd¦  «         n# 1 swxY w Y   | 
                    di ¦  «         
                    d	i ¦  «        }ni }i }n# t          $ r i }i }Y nw xY w|sd
 |¦   «         › d�S |sâdg}	|	                     d¦  «         |                     ¦   «         D ]‹\  }
}t          |t          ¦  «        r4| 
                    d¦  «        p| 
                    dd¦  «        dd…         }n"t!          |¦  «        dk    r|dd…         dz   n|}|	                     d|
› d|› �¦  «         ŒŒ|	                     d¦  «         d                     |	¦  «        S d„ }|dv rs	 d|vs(t          | 
                    d¦  «        t          ¦  «        si |d<   d|d         d<   t%          ||¦  «         n# t          $ r}d|› �cY d}~S d}~ww xY wd| _        dS ||v rˆ |||         ¦  «        }	 d|vs(t          | 
                    d¦  «        t          ¦  «        si |d<   ||d         d<   t%          ||¦  «         n# t          $ r}d|› �cY d}~S d}~ww xY w|| _        d|› d�S dd                     d„ |D ¦   «         ¦  «        z   }d |› d!|› �S )"z8Handle /personality command - list or set a personality.r   Nr›  r,   r%  r-   r.   rq   Úpersonalitiesz No personalities configured in `z/config.yaml`u!   ðŸŽ­ **Available Personalities**
u'   â€¢ `none` â€” (no personality overlay)rÜ  r�  rp   rÔ  r®  u   â€¢ `rÛ  z
Usage: `/personality <name>`rÛ   c                 ó‚  — t          | t          ¦  «        rœ|                      dd¦  «        g}|                      d¦  «        r|                     d| d         › �¦  «         |                      d¦  «        r|                     d| d         › �¦  «         d                     d„ |D ¦   «         ¦  «        S t          | ¦  «        S )	Nr�  rp   ÚtonezTone: ÚstylezStyle: rÛ   c              3   ó   K  — | ]}|¯|V — Œ	d S rr  r  rÊ  s     r!   r  zUGatewayRunner._handle_personality_command.<locals>._resolve_prompt.<locals>.<genexpr>‹  s'   è è € Ð 7Ð 7 q°QÐ 7 Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7ré   )rÈ   rÉ   r¸   rá   râ   rò   )r!  rä   s     r!   Ú_resolve_promptzBGatewayRunner._handle_personality_command.<locals>._resolve_prompt„  s½   € Ý˜%¥Ñ&Ô&ð 8ØŸš ?°BÑ7Ô7Ð8�Ø—9’9˜VÑ$Ô$ð ;Ø—L’LÐ!9¨%°¬-Ð!9Ð!9Ñ:Ô:Ð:Ø—9’9˜WÑ%Ô%ð =Ø—L’LÐ!;¨5°¬>Ð!;Ð!;Ñ<Ô<Ð<Ø—y’yÐ 7Ð 7¨EÐ 7Ñ 7Ô 7Ñ7Ô7Ð7Ý�u‘:”:Ðré   )r¦  r+  Úneutralu*   âš ï¸� Failed to save personality change: uX   ðŸŽ­ Personality cleared â€” using base agent behavior.
_(takes effect on next message)_u   ðŸŽ­ Personality set to **z#**
_(takes effect on next message)_z`none`, rÕ  c              3   ó"   K  — | ]
}d |› d �V — ŒdS r,  r  )r  r–  s     r!   r  z<GatewayRunner._handle_personality_command.<locals>.<genexpr>©  s*   è è € Ð*KÐ*K¸¨8¨q¨8¨8¨8Ð*KÐ*KÐ*KÐ*KÐ*KÐ*Kré   zUnknown personality: `z`

Available: )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:  re  r  r‘  r-  r?  rÁ  Ú
new_promptÚ	availables                    r!   rø  z)GatewayRunner._handle_personality_commanda  s1  è è € àˆˆˆØ8Ð8Ð8Ð8Ð8Ð8à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆÝ" ]Ñ2ˆð
	Ø×!Ò!Ñ#Ô#ð #Ý˜+ s°WÐ=Ñ=Ô=ð 5ÀØ!Ÿ^š^¨AÑ.Ô.Ð4°"�Fð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5à &§
¢
¨7°BÑ 7Ô 7× ;Ò ;¸OÈRÑ PÔ P��à�Ø "�øøÝð 	ð 	ð 	ØˆFØˆMˆMˆMð	øøøð ð 	[ØZÐ6IÐ6IÑ6KÔ6KÐZÐZÐZÐZàð 
	$Ø9Ð:ˆEØ�LŠLÐBÑCÔCÐCØ -× 3Ò 3Ñ 5Ô 5ð <ð <‘��fÝ˜f¥dÑ+Ô+ð RØ$Ÿjšj¨Ñ7Ô7Ð_¸6¿:º:ÀoÐWYÑ;ZÔ;ZÐ[^Ð\^Ð[^Ô;_�G�Gå58¸±[´[À2Ò5EÐ5E˜f S b Sœk¨EÑ1Ð1È6�GØ—’Ð: TÐ:Ð:°Ð:Ð:Ñ;Ô;Ð;Ð;Ø�LŠLÐ9Ñ:Ô:Ð:Ø—9’9˜UÑ#Ô#Ð#ð	ð 	ð 	ð Ð1Ð1Ð1ðHØ &Ð(Ð(µ
¸6¿:º:ÀgÑ;NÔ;NÕPTÑ0UÔ0UÐ(Ø&(�F˜7‘OØ35��w” Ñ0Ý! +¨vÑ6Ô6Ð6Ð6øÝð Hð Hð HØGÀAÐGÐGÐGÐGÐGÐGÐGÐGøøøøðHøøøà,.ˆDÔ)ØnÐnØ�]Ð"Ð"Ø(˜¨°tÔ)<Ñ=Ô=ˆJðHØ &Ð(Ð(µ
¸6¿:º:ÀgÑ;NÔ;NÕPTÑ0UÔ0UÐ(Ø&(�F˜7‘OØ3=��w” Ñ0Ý! +¨vÑ6Ô6Ð6Ð6øÝð Hð Hð HØGÀAÐGÐGÐGÐGÐGÐGÐGÐGøøøøðHøøøð -7ˆDÔ)àZ°ÐZÐZÐZÐZà §¢Ð*KÐ*K¸]Ð*KÑ*KÔ*KÑ!KÔ!KÑKˆ	ØI¨ÐIÐI¸iÐIÐIÐIst   Á&C Á6BÂC ÂBÂC Â!BÂ"2C ÃC&Ã%C&Ç%AH2 È2
IÈ<IÉ IÉIÉ-AJ: Ê:
KËKËKËKc              ƒ   óD  K  — |j         }| j                             |¦  «        }| j                             |j        ¦  «        }d}d}t          t          |¦  «        dz
  dd¦  «        D ]A}||                              d¦  «        dk    r ||                              dd¦  «        }|} nŒB|sdS |d|…         }| j                             |j        |¦  «         d	|_	        t          |t          j        ||j        |j        ¬
¦  «        }	|                      |	¦  «        ƒ d{V —†S )z6Handle /retry command - re-send the last user message.Nr)   éÿÿÿÿr©  r«  rÊ  rp   zNo previous message to retry.r   )r]  rØ   r$  Úraw_messager¬  )r$  r›  rè  ró  rM  rÎ  rÞ   r¸   rø  râ  rœ   r�   rç  rF  r¬  r�  )
r¿  rã   r$  r  rF  Úlast_user_msgÚlast_user_idxrå   Ú	truncatedÚretry_events
             r!   rù  z#GatewayRunner._handle_retry_command¬  sI  è è € à”ˆØÔ*×@Ò@ÀÑHÔHˆØÔ$×4Ò4°]Ô5MÑNÔNˆð ˆØˆÝ•s˜7‘|”| aÑ'¨¨RÑ0Ô0ð 	ð 	ˆAØ�qŒz�~Š~˜fÑ%Ô%¨Ò/Ð/Ø '¨¤
§¢¨y¸"Ñ =Ô =�Ø !�Ø�ð 0ð
 ð 	3Ø2Ð2ð ˜N˜]˜NÔ+ˆ	ØÔ×-Ò-¨mÔ.FÈ	ÑRÔRÐRà+,ˆÔ(õ #ØÝ$Ô)ØØÔ)Ø Ô/ð
ñ 
ô 
ˆð ×)Ò)¨+Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ré   c              ƒ   ó0  K  — |j         }| j                             |¦  «        }| j                             |j        ¦  «        }d}t          t          |¦  «        dz
  dd¦  «        D ]%}||                              d¦  «        dk    r|} nŒ&|€dS ||                              dd¦  «        }t          |¦  «        |z
  }| j                             |j        |d|…         ¦  «         d	|_	        t          |¦  «        d
k    r|dd
…         dz   n|}	d|› d|	› d�S )z?Handle /undo command - remove the last user/assistant exchange.Nr)   rE  r©  r«  zNothing to undo.rÊ  rp   r   é(   r®  u   â†©ï¸� Undid z message(s).
Removed: "ú")
r$  r›  rè  ró  rM  rÎ  rÞ   r¸   rø  râ  )
r¿  rã   r$  r  rF  rH  rå   Úremoved_msgÚremoved_countr-  s
             r!   rú  z"GatewayRunner._handle_undo_commandÐ  s>  è è € à”ˆØÔ*×@Ò@ÀÑHÔHˆØÔ$×4Ò4°]Ô5MÑNÔNˆð ˆÝ•s˜7‘|”| aÑ'¨¨RÑ0Ô0ð 	ð 	ˆAØ�qŒz�~Š~˜fÑ%Ô%¨Ò/Ð/Ø !�Ø�ð 0ð Ð Ø%Ð%à˜mÔ,×0Ò0°¸BÑ?Ô?ˆÝ˜G™œ }Ñ4ˆØÔ×-Ò-¨mÔ.FÈÐP^ÐQ^ÐP^ÔH_Ñ`Ô`Ð`à+,ˆÔ(å.1°+Ñ.>Ô.>ÀÒ.CÐ.C�+˜c˜r˜cÔ" UÑ*Ð*ÈˆØR˜}ÐRÐRÀwÐRÐRÐRÐRré   c              ƒ   ó  K  — |j         }|j        r|j        j        nd}|j        }|j        p|}|                     ¦   «         › d�}	 ddl}t          dz  }i }	|                     ¦   «         r@t          |d¬¦  «        5 }
| 
                    |
¦  «        pi }	ddd¦  «         n# 1 swxY w Y   ||	|<   t          ||	¦  «         t          |¦  «        t          j        |<   n# t          $ r}d|› �cY d}~S d}~ww xY wd	|› d
|› d�S )zOHandle /sethome command -- set the current chat as the platform's home channel.rN  r¿  r   Nr,   r-   r.   zFailed to save home channel: u   âœ… Home channel set to **z** (ID: z@).
Cron jobs and cross-platform messages will be delivered here.)r$  r  r!  rC  Ú	chat_namerú  rÄ   rÅ   r   rÆ   rÇ   r$   rò   r   r   r·   )r¿  rã   r$  ry  rC  rQ  rV  rÄ   r&  r,  r'  rÁ  s               r!   rû  z&GatewayRunner._handle_set_home_commandé  s•  è è € à”ˆØ17´ÐO˜œÔ-Ð-ÀiˆØ”.ˆØÔ$Ð/¨ˆ	à"×(Ò(Ñ*Ô*Ð9Ð9Ð9ˆð	7ØˆKˆKˆKÝ&¨Ñ6ˆKØˆKØ×!Ò!Ñ#Ô#ð :Ý˜+°Ð8Ñ8Ô8ð :¸AØ"&§.¢.°Ñ"3Ô"3Ð"9°r�Kð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :à#*ˆK˜Ñ Ý˜k¨;Ñ7Ô7Ð7å"% g¡,¤,�BŒJ�wÑÐøÝð 	7ð 	7ð 	7Ø6°1Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð	7øøøðM¨ð Mð M¸Gð Mð Mð Mð	
sB   Á5C Á<B ÂC Â B$Â$C Â'B$Â(4C Ã
C6Ã'C1Ã+C6Ã1C6c                 óÌ   — t          | dd¦  «        }|€dS t          |d¦  «        r|j        rt          |j        ¦  «        S t          |d¦  «        r|j        r|j        j        S dS )z5Extract Discord guild_id from the raw message object.rF  NrX  Úguild)rÜ   r  rX  rµ  rS  Úid)rã   r­  s     r!   rû  zGatewayRunner._get_guild_id  st   € õ �e˜]¨DÑ1Ô1ˆØˆ;Ø�4å�3˜
Ñ#Ô#ð 	%¨¬ð 	%Ý�s”|Ñ$Ô$Ð$å�3˜Ñ Ô ð 	  S¤Yð 	 Ø”9”<ÐØˆtré   c              ƒ   ó€  K  — |                      ¦   «                              ¦   «                              ¦   «         }|j        j        }|j        j        }|                      ||¦  «        }| j                             |¦  «        }|dv r;d| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         	 dS |dv r:d| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         d	S |d
k    r;d| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         	 dS |dv r|                      |¦  «        ƒ d{V —†S |dk    r|                      |¦  «        ƒ d{V —†S |dk    �r#| j	                             |d¦  «        }ddddœ}| j                             |j        j        ¦  «        }|                      |¦  «        }	|	r®t!          |d¦  «        rž|                     |	¦  «        }
|
r‡d|                     ||¦  «        › �d|
d         › �d|
d         › �g}|
d         D ];}|                     d¦  «        rdnd}|                     d|d          › |› �¦  «         Œ<d!                     |¦  «        S d|                     ||¦  «        › �S | j	                             |d¦  «        }|dk    r:d| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         d"S d| j	        |<   |  
                    ¦   «          |r|                      ||d¬¦  «         d#S )$z8Handle /voice [on|off|tts|channel|leave|status] command.)r©  Úenablerì  T©r  z}Voice mode enabled.
I'll reply with voice when you send voice messages.
Use /voice tts to get voice replies for all messages.)rë  Údisablerë  ©r  z'Voice mode disabled. Text-only replies.Úttsrê  z;Auto-TTS enabled.
All replies will include a voice message.)Úchannelrâ   NÚleaver¡  zOff (text only)z"On (voice reply to voice messages)z!TTS (voice reply to all messages))rë  rì  rê  Úget_voice_channel_infozVoice mode: zVoice channel: #Úchannel_namezParticipants: Úmember_countÚmembersÚis_speakingz (speaking)rp   z  - r�  rÛ   zVoice mode enabled.zVoice mode disabled.)ræ  ró   rõ   r$  rC  r  rè  r‡  r¸   r¼  rý  r	  r  Ú_handle_voice_channel_joinÚ_handle_voice_channel_leaverû  r  r]  rá   râ   )r¿  rã   r­   rC  r  Ú	voice_keyrí   rõ  ÚlabelsrX  rÊ   re  r–  r¡  rÁ  s                  r!   r  z#GatewayRunner._handle_voice_command  sû  è è € à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆØ”,Ô&ˆØ”<Ô(ˆØ—O’O H¨gÑ6Ô6ˆ	à”-×#Ò# HÑ-Ô-ˆàÐ#Ð#Ð#Ø*6ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð SØ×2Ò2°7¸GÈTÐ2ÑRÔRÐRðHðð ð
 Ð'Ð'Ð'Ø*/ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð UØ×3Ò3°G¸WÈtÐ3ÑTÔTÐTØ<Ð<Ø�UŠ]ˆ]Ø*/ˆDÔ˜YÑ'Ø×"Ò"Ñ$Ô$Ð$Øð SØ×2Ò2°7¸GÈTÐ2ÑRÔRÐRð<ðð ð Ð(Ð(Ð(Ø×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ø�WŠ_ˆ_Ø×9Ò9¸%Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø�XÒÑØÔ#×'Ò'¨	°5Ñ9Ô9ˆDà(ØBØ:ðð ˆFð ”m×'Ò'¨¬Ô(=Ñ>Ô>ˆGØ×)Ò)¨%Ñ0Ô0ˆHØð ,�G GÐ-EÑFÔFð ,Ø×5Ò5°hÑ?Ô?�Øð 	,à? v§z¢z°$¸Ñ'=Ô'=Ð?Ð?ØA¨4°Ô+?ÐAÐAØ?¨¨nÔ)=Ð?Ð?ð�Eð
 " )œ_ð Ið I˜Ø23·%²%¸Ñ2FÔ2FÐ!N  ÈB˜ØŸšÐ%G¨A¨nÔ,=Ð%G¸vÐ%GÐ%GÑHÔHÐHÐHØŸ9š9 UÑ+Ô+Ð+Ø: &§*¢*¨T°4Ñ"8Ô"8Ð:Ð:Ð:ð Ô&×*Ò*¨9°eÑ<Ô<ˆGØ˜%ÒÐØ.:�Ô  Ñ+Ø×&Ò&Ñ(Ô(Ð(Øð WØ×6Ò6°wÀÐQUÐ6ÑVÔVÐVØ,Ð,à.3�Ô  Ñ+Ø×&Ò&Ñ(Ô(Ð(Øð YØ×7Ò7¸ÀÐSWÐ7ÑXÔXÐXØ-Ð-ré   c              ƒ   óB  K  — | j                              |j        j        ¦  «        }t	          |d¦  «        sdS |                      |¦  «        }|sdS |                     ||j        j        ¦  «        ƒ d{V —†}|sdS t	          |d¦  «        r| j        |_	        t	          |d¦  «        r| j
        |_        	 |                     |¦  «        ƒ d{V —†}n€# t          $ rs}t                               d|¦  «         d|_	        t!          |¦  «                             ¦   «         }d	|v sd
|v sd|v rdt$          j        › d�cY d}~S d|› �cY d}~S d}~ww xY w|rÅt)          |j        j        ¦  «        |j        |<   t	          |d¦  «        r!|j                             ¦   «         |j        |<   d| j        |                      |j        j        |j        j        ¦  «        <   |                      ¦   «          |                      ||j        j        d¬¦  «         d|j        › d�S d|_	        dS )z.Join the user's current Discord voice channel.Újoin_voice_channelz2Voice channels are not supported on this platform.z,This command only works in a Discord server.Nz(You need to be in a voice channel first.Ú_voice_input_callbackÚ_on_voice_disconnectz Failed to join voice channel: %sÚpynaclÚnaclÚdaveyz@Voice dependencies are missing (PyNaCl / davey). Install with: `z -m pip install PyNaCl`zFailed to join voice channel: Ú_voice_sourcesrê  TrW  zJoined voice channel **zL**.
I'll speak my replies and listen to you. Use /voice leave to disconnect.zFFailed to join voice channel. Check bot permissions (Connect + Speak).)r‡  r¸   r$  r  r  rû  Úget_user_voice_channelrp  Ú_handle_voice_channel_inputrh  Ú_handle_voice_timeout_cleanupri  rg  r·   r³   r´   rò   rõ   r6  r7  rµ  rC  Ú_voice_text_channelsÚto_dictrm  r¼  rè  rý  r	  r  )r¿  rã   rí   rX  Úvoice_channelr¸  rÁ  Ú	err_lowers           r!   rb  z(GatewayRunner._handle_voice_channel_joina  sº  è è € à”-×#Ò# E¤LÔ$9Ñ:Ô:ˆÝ�wÐ 4Ñ5Ô5ð 	HØGÐGà×%Ò% eÑ,Ô,ˆØð 	BØAÐAà%×<Ò<Ø�e”lÔ*ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ð 	>Ø=Ð=õ �7Ð3Ñ4Ô4ð 	MØ,0Ô,LˆGÔ)Ý�7Ð2Ñ3Ô3ð 	NØ+/Ô+MˆGÔ(ð	8Ø#×6Ò6°}ÑEÔEÐEÐEÐEÐEÐEÐEˆGˆGøÝð 		8ð 		8ð 		8Ý�NŠNÐ=¸qÑAÔAÐAØ,0ˆGÔ)Ý˜A™œŸš™œˆIØ˜9Ð$Ð$¨°)Ð(;Ð(;¸wÈ)Ð?SÐ?SðNÝ&)¤nðNð Nð Nðð ð ð ð ð ð 8°AÐ7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøøøð		8øøøð ð 
	Ý58¸¼Ô9MÑ5NÔ5NˆGÔ(¨Ñ2Ý�wÐ 0Ñ1Ô1ð JØ38´<×3GÒ3GÑ3IÔ3I�Ô& xÑ0Ø]bˆDÔ˜TŸ_š_¨U¬\Ô-BÀEÄLÔDXÑYÔYÑZØ×"Ò"Ñ$Ô$Ð$Ø×.Ò.¨w¸¼Ô8LÐVZÐ.Ñ[Ô[Ð[ð\¨-Ô*<ð \ð \ð \ðð
 )-ˆÔ%ØWÐWs+   Â5C Ã
EÃAE	Ä9EÄ?E	ÅEÅ	Ec              ƒ   óŽ  K  — | j                              |j        j        ¦  «        }|                      |¦  «        }|rt          |d¦  «        sdS t          |d¦  «        r|                     |¦  «        sdS 	 |                     |¦  «        ƒ d{V —† n2# t          $ r%}t           
                    d|¦  «         Y d}~nd}~ww xY wd| j        |                      |j        j        |j        j        ¦  «        <   |                      ¦   «          |                      ||j        j        d¬¦  «         t          |d	¦  «        rd|_        d
S )z Leave the Discord voice channel.Úleave_voice_channelzNot in a voice channel.Úis_in_voice_channelNzError leaving voice channel: %srë  TrY  rh  zLeft voice channel.)r‡  r¸   r$  r  rû  r  rw  rv  r·   r³   r´   r¼  rè  rC  rý  r  rh  )r¿  rã   rí   rX  rÁ  s        r!   rc  z)GatewayRunner._handle_voice_channel_leave”  su  è è € à”-×#Ò# E¤LÔ$9Ñ:Ô:ˆØ×%Ò% eÑ,Ô,ˆàð 	-�w wÐ0EÑFÔFð 	-Ø,Ð,å�wÐ 5Ñ6Ô6ð 	-¸g×>YÒ>YÐZbÑ>cÔ>cð 	-Ø,Ð,ð	AØ×-Ò-¨hÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øÝð 	Að 	Að 	AÝ�NŠNÐ<¸aÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøð Z_ˆÔ˜Ÿš¨¬Ô)>ÀÄÔ@TÑUÔUÑVØ×ÒÑ Ô Ð Ø×+Ò+¨G°U´\Ô5IÐTXÐ+ÑYÔYÐYÝ�7Ð3Ñ4Ô4ð 	1Ø,0ˆGÔ)Ø$Ð$s   Á8B Â
CÂB>Â>Cc                 óö   — d| j         |                      t          j        |¦  «        <   |                      ¦   «          | j                             t          j        ¦  «        }|                      ||d¬¦  «         dS )z�Called by the adapter when a voice channel times out.

        Cleans up runner-side voice_mode state that the adapter cannot reach.
        rë  TrY  N)r¼  rè  r�   r;  rý  r‡  r¸   r  )r¿  rC  rí   s      r!   rp  z+GatewayRunner._handle_voice_timeout_cleanup«  so   € ð
 HMˆÔ˜Ÿš­Ô)9¸7ÑCÔCÑDØ×ÒÑ Ô Ð Ø”-×#Ò#¥HÔ$4Ñ5Ô5ˆØ×+Ò+¨G°WÀtÐ+ÑLÔLÐLÐLÐLré   rX  rp  Ú
transcriptc           	   ƒ   óÞ  K  — | j                              t          j        ¦  «        }|sdS |j                             |¦  «        }|sdS t          |di ¦  «                             |¦  «        }|r=t          j        |¦  «        }t          |¦  «        |_	        t          |¦  «        |_
        nEt          t          j        t          |¦  «        t          |¦  «        t          |¦  «        d¬¦  «        }|                      |¦  «        st                               d|¦  «         dS 	 |j                             |¦  «        }|rS|dd…                              dd¦  «                             d	d
¦  «        }	|                     d|› d|	› �¦  «        ƒ d{V —† n# t$          $ r Y nw xY wddlm}
 t+          ||t,          j         |
|d¬¦  «        ¬¦  «        }|                     |¦  «        ƒ d{V —† dS )zÕHandle transcribed voice from a user in a voice channel.

        Creates a synthetic MessageEvent and processes it through the
        adapter's full message pipeline (session, typing, agent, TTS reply).
        Nrm  r[  )r  rC  rp  rÖ  rB  z/Unauthorized voice input from user %d, ignoringiÐ  z	@everyoneu   @â€‹everyonez@hereu   @â€‹herez**[Voice]** <@z>: r   )ÚSimpleNamespace)rX  rS  )r$  r]  rØ   rF  )r‡  r¸   r�   r;  rq  rÜ   r”   Ú	from_dictrò   rp  rÖ  rƒ  r³   rË   Ú_clientÚget_channelr
  r	  r·   Útypesr{  rœ   r�   rc  Úhandle_message)r¿  rX  rp  ry  rí   Ú
text_ch_idÚsource_datar$  r[  Ú	safe_textr{  rã   s               r!   ro  z)GatewayRunner._handle_voice_channel_inputµ  s0  è è € ð ”-×#Ò#¥HÔ$4Ñ5Ô5ˆØð 	ØˆFàÔ1×5Ò5°hÑ?Ô?ˆ
Øð 	ØˆFõ ˜gÐ'7¸Ñ<Ô<×@Ò@ÀÑJÔJˆØð 	Ý"Ô,¨[Ñ9Ô9ˆFÝ  ™\œ\ˆFŒNÝ" 7™|œ|ˆFÔÐå"Ý!Ô)Ý˜J™œÝ˜G™œÝ˜g™,œ,Ø#ðñ ô ˆFð ×'Ò'¨Ñ/Ô/ð 	Ý�LŠLÐJÈGÑTÔTÐTØˆFð	Ø”o×1Ò1°*Ñ=Ô=ˆGØð MØ& u¨ uÔ-×5Ò5°kÐCTÑUÔU×]Ò]Ð^eÐgtÑuÔu�	Ø—l’lÐ#K°GÐ#KÐ#KÀ	Ð#KÐ#KÑLÔLÐLÐLÐLÐLÐLÐLÐLøøÝð 	ð 	ð 	ØˆDð	øøøð 	*Ð)Ð)Ð)Ð)Ð)ÝØØÝ$Ô*Ø'˜°ÀÐFÑFÔFð	
ñ 
ô 
ˆð ×$Ò$ UÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+s   Ä$A/F Æ
F!Æ F!rÙ  r]  rä  c                 óV  — |r|                      d¦  «        rdS |j        j        }| j                             |                      |j        j        |¦  «        d¦  «        }|j        t          j	        k    }|dk    p|dk    o|}|sdS t          d„ |D ¦   «         ¦  «        }	|	rdS |r|sdS dS )aø  Decide whether the runner should send a TTS voice reply.

        Returns False when:
        - voice_mode is off for this chat
        - response is empty or an error
        - agent already called text_to_speech tool (dedup)
        - voice input and base adapter auto-TTS already handled it (skip_double)
          UNLESS streaming already consumed the response (already_sent=True),
          in which case the base adapter won't have text for auto-TTS so the
          runner must handle it.
        zError:Frë  rê  rì  c              3   ó¤   K  — | ]K}|                      d ¦  «        dk    o-t          d„ |                      d¦  «        pg D ¦   «         ¦  «        V — ŒLdS )r©  r¬  c              3   óp   K  — | ]1}|                      d i ¦  «                              d¦  «        dk    V — Œ2dS )Úfunctionr  Útext_to_speechNrV  )r  Útcs     r!   r  zCGatewayRunner._should_send_voice_reply.<locals>.<genexpr>.<genexpr>  sX   è è € ð ð àð —’�z 2Ñ&Ô&×*Ò*¨6Ñ2Ô2Ð6FÒFðð ð ð ð ð ré   Ú
tool_callsN)r¸   r  )r  r  s     r!   r  z9GatewayRunner._should_send_voice_reply.<locals>.<genexpr>  s†   è è € ð 
ð 
ð ð �GŠG�F‰OŒO˜{Ò*ð Ýð ð àŸ7š7 <Ñ0Ô0Ð6°Bðñ ô ñ ô ð
ð 
ð 
ð 
ð 
ð 
ré   T)rß   r$  rC  r¼  r¸   rè  r  rØ   r�   rc  r  )
r¿  rã   rÙ  r]  rä  rC  Ú
voice_modeÚis_voice_inputÚshouldÚhas_agent_ttss
             r!   r  z&GatewayRunner._should_send_voice_replyð  sö   € ð$ ð 	˜8×.Ò.¨xÑ8Ô8ð 	Ø�5à”,Ô&ˆØÔ%×)Ò)¨$¯/ª/¸%¼,Ô:OÐQXÑ*YÔ*YÐ[`ÑaÔaˆ
ØÔ,µÔ0AÒAˆð ˜5Ò ð ?Ø˜lÒ*Ð=¨~ð 	ð ð 	Ø�5õ ð 
ð 
ð &ð
ñ 
ô 
ñ 
ô 
ˆð ð 	Ø�5ð ð 	 ,ð 	Ø�5àˆtré   r]  c              ƒ   ó€  K  — ddl }d}d}	 ddlm}m}  ||dd…         ¦  «        }|s3	 ||hdhz
  D ]'}		 t	          j        |	¦  «         Œ# t          $ r Y Œ$w xY wdS t          j                             t          j
        ¦   «         dd|                     ¦   «         j        dd…         › d�¦  «        }t	          j        t          j                             |¦  «        d	¬
¦  «         t          j        |||¬¦  «        ƒ d{V —†}
t#          j        |
¦  «        }|                     d|¦  «        }|                     d¦  «        rt          j                             |¦  «        sat*                               d|                     d¦  «        ¦  «         	 ||hdhz
  D ]'}		 t	          j        |	¦  «         Œ# t          $ r Y Œ$w xY wdS | j                             |j        j        ¦  «        }|                      |¦  «        }|rRt7          |d¦  «        rBt7          |d¦  «        r2|                     |¦  «        r|                     ||¦  «        ƒ d{V —† nW|rUt7          |d¦  «        rE|j        j        ||j        dœ}|j        j         rd|j        j         i|d<    |j!        di |¤Žƒ d{V —† n4# tD          $ r'}t*                               d|d	¬¦  «         Y d}~nd}~ww xY w||hdhz
  D ]'}		 t	          j        |	¦  «         Œ# t          $ r Y Œ$w xY wdS # ||hdhz
  D ]'}		 t	          j        |	¦  «         Œ# t          $ r Y Œ$w xY ww xY w)zEGenerate TTS audio and send as a voice message before the text reply.r   N)Útext_to_speech_toolÚ_strip_markdown_for_ttsi   Úhermes_voiceÚ
tts_reply_r³  ú.mp3T)rø  )r]  Úoutput_pathr�  r¸  zAuto voice reply TTS failed: %srO  Úplay_in_voice_channelrw  Ú
send_voice)rC  Ú
audio_pathrË  rF  rÌ  zAuto voice reply failed: %srÐ  r  )#ÚuuidÚtools.tts_toolr�  r‘  r   r0  rñ  r   râ   ÚtempfileÚ
gettempdirÚuuid4ÚhexÚmakedirsÚdirnamerž  Ú	to_threadrÔ  rÕ  r¸   Úisfiler³   r´   r‡  r$  r  rû  r  rw  r–  rC  rÝ  rF  r—  r·   )r¿  rã   r]  Ú_uuidr˜  Úactual_pathr�  r‘  Útts_textrË  Úresult_jsonrG  rí   rX  Úsend_kwargsrÁ  s                   r!   r  zGatewayRunner._send_voice_reply&  sV  è è € àÐÐÐØˆ
Øˆð3	ØSÐSÐSÐSÐSÐSÐSÐSà.Ð.¨t°E°T°E¬{Ñ;Ô;ˆHØð ØðT ! +Ð.°$°Ñ7ð ð �ðÝ”I˜a‘L”L�L�LøÝð ð ð Ø�Dðøøøðð õM œŸšÝÔ#Ñ%Ô% ~Ø9˜UŸ[š[™]œ]Ô.¨s°¨sÔ3Ð9Ð9Ð9ñô ˆJõ ŒK�œŸš¨
Ñ3Ô3¸dÐCÑCÔCÐCå 'Ô 1Ø#¨(À
ð!ñ !ô !ð ð ð ð ð ð ˆKõ ”Z Ñ,Ô,ˆFð !Ÿ*š* [°*Ñ=Ô=ˆKØ—:’:˜iÑ(Ô(ð µ´·²¸{Ñ0KÔ0Kð Ý—’Ð@À&Ç*Â*ÈWÑBUÔBUÑVÔVÐVØð. ! +Ð.°$°Ñ7ð ð �ðÝ”I˜a‘L”L�L�LøÝð ð ð Ø�Dðøøøðð ð+ ”m×'Ò'¨¬Ô(=Ñ>Ô>ˆGð ×)Ò)¨%Ñ0Ô0ˆHØð 8Ý Ð)@ÑAÔAð8å Ð)>Ñ?Ô?ð8ð  ×3Ò3°HÑ=Ô=ð8ð ×3Ò3°H¸kÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJØð 8�W W¨lÑ;Ô;ð 8à$œ|Ô3Ø"-Ø %Ô 0ð/ð /�ð
 ”<Ô)ð TØ/:¸E¼LÔ<RÐ.S�K 
Ñ+Ø(�gÔ(Ð7Ð7¨;Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øøÝð 	Lð 	Lð 	LÝ�NŠNÐ8¸!ÀdˆNÑKÔKÐKÐKÐKÐKÐKÐKøøøøð	Løøøð ! +Ð.°$°Ñ7ð ð �ðÝ”I˜a‘L”L�L�LøÝð ð ð Ø�Dðøøøðð ø�j +Ð.°$°Ñ7ð ð �ðÝ”I˜a‘L”L�L�LøÝð ð ð Ø�Dðøøøðøøøs–   ŒJ% µA
Á

AÁAÁD1J% ÆF.Æ.
F;Æ:F;Ç C$J% Ê$L Ê%
KÊ/KËL ËKËL Ë$K9Ë9
LÌLÌL=ÌL,Ì+L=Ì,
L9	Ì6L=Ì8L9	Ì9L=c              ƒ   óð  K  — ddl m} 	 |                     |¦  «        \  }}|                     |¦  «        \  }}|                     |¦  «        \  }}|j        j        rd|j        j        ind}	h d£}
h d£}h d£}|D �]\  }}	  ||¦  «        j                             ¦   «         }||
v r)| 	                    |j        j
        ||	¬¦  «        ƒ d{V —† n‚||v r)|                     |j        j
        ||	¬	¦  «        ƒ d{V —† nU||v r)|                     |j        j
        ||	¬
¦  «        ƒ d{V —† n(|                     |j        j
        ||	¬¦  «        ƒ d{V —† ŒÙ# t          $ r,}t                               d|j        |¦  «         Y d}~�Œ
d}~ww xY w|D ]²}	  ||¦  «        j                             ¦   «         }||v r)|                     |j        j
        ||	¬
¦  «        ƒ d{V —† n(|                     |j        j
        ||	¬¦  «        ƒ d{V —† Œ{# t          $ r+}t                               d|j        |¦  «         Y d}~Œ«d}~ww xY wdS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)u=  Extract MEDIA: tags and local file paths from a response and deliver them.

        Called after streaming has already sent the text to the user, so the
        text itself is already delivered â€” this only handles file attachments
        that the normal _process_message_background path would have caught.
        r   r   rF  N>   ú.m4aú.oggú.wavú.opusr”  >   ú.3gpú.aviú.mkvú.movú.mp4ú.webm>   ú.gifú.jpgú.pngú.jpegú.webp)rC  r˜  rÌ  )rC  Ú
video_pathrÌ  )rC  Ú
image_pathrÌ  )rC  r�  rÌ  z*[%s] Post-stream media delivery failed: %sz)[%s] Post-stream file delivery failed: %sz'Post-stream media extraction failed: %s)Úpathlibr   Úextract_mediaÚextract_imagesÚextract_local_filesr$  rF  Úsuffixrõ   r—  rC  Ú
send_videoÚsend_image_fileÚsend_documentr·   r³   r´   r  )r¿  rÙ  rã   rí   r   Úmedia_filesrû   ÚcleanedÚlocal_filesÚ_thread_metaÚ_AUDIO_EXTSÚ_VIDEO_EXTSÚ_IMAGE_EXTSÚ
media_pathÚis_voiceÚextrÁ  r�  s                     r!   r  z*GatewayRunner._deliver_media_from_response`  s  è è € ð 	!Ð Ð Ð Ð Ð ð<	IØ$×2Ò2°8Ñ<Ô<‰NˆK˜Ø ×/Ò/°Ñ9Ô9‰JˆAˆwØ$×8Ò8¸ÑAÔA‰NˆK˜àDIÄLÔDZÐd˜K¨¬Ô)?Ð@Ð@Ð`dˆLàCÐCÐCˆKØKÐKÐKˆKØDÐDÐDˆKà(3ð bñ bÑ$�
˜HðbØ˜$˜zÑ*Ô*Ô1×7Ò7Ñ9Ô9�CØ˜kÐ)Ð)Ø%×0Ò0Ø$)¤LÔ$8Ø'1Ø%1ð 1ñ ô ð ð ð ð ð ð ð ð ð
  Ð+Ð+Ø%×0Ò0Ø$)¤LÔ$8Ø'1Ø%1ð 1ñ ô ð ð ð ð ð ð ð ð ð
  Ð+Ð+Ø%×5Ò5Ø$)¤LÔ$8Ø'1Ø%1ð 6ñ ô ð ð ð ð ð ð ð ð ð &×3Ò3Ø$)¤LÔ$8Ø&0Ø%1ð 4ñ ô ð ð ð ð ð ð ð øøõ
 !ð bð bð bÝ—N’NÐ#OÐQXÔQ]Ð_`ÑaÔaÐaÐaÐaÐaÐaÑaøøøøðbøøøð )ð að a�	ðaØ˜$˜y™/œ/Ô0×6Ò6Ñ8Ô8�CØ˜kÐ)Ð)Ø%×5Ò5Ø$)¤LÔ$8Ø'0Ø%1ð 6ñ ô ð ð ð ð ð ð ð ð ð &×3Ò3Ø$)¤LÔ$8Ø&/Ø%1ð 4ñ ô ð ð ð ð ð ð ð øøõ
 !ð að að aÝ—N’NÐ#NÐPWÔP\Ð^_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`øøøøðaøøøðað aøõ$ ð 	Ið 	Ið 	IÝ�NŠNÐDÀaÑHÔHÐHÐHÐHÐHÐHÐHÐHøøøøð	Iøøøsn   ŠA8I ÂCEÅI Å
FÅ!FÆ I ÆFÆI ÆA7HÈ
I È
I È!H;È6I È;I É I É
I5ÉI0É0I5c              ƒ   óN  K  — ddl m}m} i }	 ddl}t          dz  }|                     ¦   «         rot          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «        }t          |t          ¦  «        rd|i}n# t          $ r Y nw xY w|                     dd	¦  «        s	 d
S  |d|                     dd¦  «        ¬¦  «        }	t          j        dt          t          j        ¦   «         ¦  «        ¦  «        }
|                     ¦   «                              ¦   «         }|s!|	                     |
¦  «        } |||
¦  «        S |	                     |
¦  «        }|sd|
› �S d}	 t)          |¦  «        dz
  }d|cxk    rt+          |¦  «        k     rn n||         d         }ndt+          |¦  «        › d�S n# t,          $ r |}Y nw xY w|	                     |
|¦  «        }|d         rd|d         › d|d         › d�S d|d         › �S )uD   Handle /rollback command â€” list or restore filesystem checkpoints.r   )ÚCheckpointManagerÚformat_checkpoint_listNr,   r-   r.   Úcheckpointsr  FzXCheckpoints are not enabled.
Enable in config.yaml:
```
checkpoints:
  enabled: true
```TÚmax_snapshotsrÔ  )r  rÐ  r5   zNo checkpoints found for r)   Úhashz!Invalid checkpoint number. Use 1-rZ   r¸  u   âœ… Restored to checkpoint Úrestored_tor‰  r\  z1
A pre-rollback snapshot was saved automatically.u   â�Œ rO  )Útools.checkpoint_managerrÍ  rÎ  rÄ   rÅ   r   rÆ   rÇ   r¸   rÈ   r¶  r·   r   r²   rò   r   Úhomeræ  ró   Úlist_checkpointsrµ  rÞ   r™  Úrestore)r¿  rã   rÍ  rÎ  Úcp_cfgrÌ   Ú	_cfg_pathrÎ   Ú_dataÚmgrr4   ÚargrÏ  Útarget_hashrÀ  rG  s                   r!   r  z&GatewayRunner._handle_rollback_command¬  s  è è € àVÐVÐVÐVÐVÐVÐVÐVð ˆð
	ØÐÐÐÝ$ }Ñ4ˆIØ×ÒÑ!Ô!ð 1Ý˜)¨gÐ6Ñ6Ô6ð 3¸"ØŸLšL¨Ñ,Ô,Ð2°�Eð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3àŸš =°"Ñ5Ô5�Ý˜f¥dÑ+Ô+ð 1Ø'¨Ð0�FøøÝð 	ð 	ð 	ØˆDð	øøøð �zŠz˜) UÑ+Ô+ð 	ðRðð ð
  ÐØØ Ÿ*š* _°bÑ9Ô9ð
ñ 
ô 
ˆõ
 Œi˜­­D¬I©K¬KÑ(8Ô(8Ñ9Ô9ˆØ×$Ò$Ñ&Ô&×,Ò,Ñ.Ô.ˆàð 	<Ø×.Ò.¨sÑ3Ô3ˆKØ)Ð)¨+°sÑ;Ô;Ð;ð ×*Ò*¨3Ñ/Ô/ˆØð 	5Ø4¨sÐ4Ð4Ð4àˆð	Ý�c‘(”(˜Q‘,ˆCØ�CÐ*Ð*Ò*Ð*�#˜kÑ*Ô*Ò*Ð*Ð*Ð*Ð*Ø)¨#Ô.¨vÔ6��àN½3¸{Ñ;KÔ;KÐNÐNÐNÐNð øõ ð 	ð 	ð 	ØˆKˆKˆKð	øøøð —’˜S +Ñ.Ô.ˆØ�)Ôð 	ðD¨f°]Ô.Cð Dð DÀvÈhÔGWð Dð Dð Dðð (�f˜W”oÐ'Ð'Ð'sH   Ž3B  ÁA%ÁB  Á%A)Á)B  Á,A)Á-2B  Â 
B-Â,B-ÆAG ÇG&Ç%G&c              ƒ   ó$  K  — |                      ¦   «                              ¦   «         }|s	 dS |j        }dt          j        ¦   «                              d¦  «        › dt          j        d¦  «                             ¦   «         › �}t          j
        |                      |||¦  «        ¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         |dd…         t!          |¦  «        dk    rdnd	z   }d
|› d|› d�S )u)  Handle /background <prompt> â€” run a prompt in a separate background session.

        Spawns a new AIAgent in a background thread with its own session.
        When it completes, sends the result back to the same chat without
        modifying the active session's conversation history.
        u¼   Usage: /background <prompt>
Example: /background Summarize the top HN stories today

Runs the prompt in a separate session. You can keep chatting â€” the result will appear here when done.Úbg_z%H%M%Srû   r@  NrÐ  r®  rp   u   ðŸ”„ Background task started: "z"
Task ID: u9   
You can keep chatting â€” results will appear when done.)ræ  ró   r$  r   rå  r£  r   Úurandomrž  rž  rT  Ú_run_background_taskr¾  r  rU  r  rÞ   )r¿  rã   r‘  r$  rÔ  r  r-  s          r!   rë  z(GatewayRunner._handle_background_commandç  s3  è è € ð ×'Ò'Ñ)Ô)×/Ò/Ñ1Ô1ˆØð 	ðSðð ð ”ˆØQ�œ™œ×/Ò/°Ñ9Ô9ÐQÐQ½B¼JÀq¹M¼M×<MÒ<MÑ<OÔ<OÐQÐQˆõ Ô#Ø×%Ò% f¨f°gÑ>Ô>ñ
ô 
ˆð 	Ô×"Ò" 5Ñ)Ô)Ð)Ø×Ò Ô 6Ô >Ñ?Ô?Ð?à˜˜"˜”+­#¨f©+¬+¸Ò*:Ð*:  ÀÑCˆð J°ð  Jð  JÀgð  Jð  Jð  Jð  	Jré   r‘  r”   rÔ  c              ƒ   ó˜  ‡ ‡‡‡‡‡‡‡‡‡‡K  — ddl mŠ ‰ j                             ‰j        ¦  «        }|s#t
                               d‰j        ‰¦  «         dS ‰j        r	d‰j        ind}	 t          ¦   «         }‰  	                    ‰|¬¦  «        \  }}|                     d¦  «        s)| 
                    ‰j        d‰› d	�|¬
¦  «        ƒ d{V —† dS t          ‰j        ¦  «        Šddlm}	 t           |	|‰¦  «        ¦  «        Š‰ j        Št#          t%          j        dd¦  «        ¦  «        Š‰                      ‰¬¦  «        Š‰‰ _        ‰                      ¦   «         ‰ _        ‰                      ‰||¦  «        Šˆˆˆˆˆˆˆˆ ˆˆˆfd„}
‰                      |
¦  «        ƒ d{V —†}|r|                     dd¦  «        nd}|s"|r |                     d¦  «        rd|d         › �}|�r(|                     |¦  «        \  }}|                     |¦  «        \  }}‰dd…         t9          ‰¦  «        dk    rdndz   }d|› d�}|r'| 
                    ‰j        ||z   |¬¦  «        ƒ d{V —† n*|s(|s&| 
                    ‰j        |dz   |¬¦  «        ƒ d{V —† |pg D ]9\  }}	 |                     ‰j        ||¬¦  «        ƒ d{V —† Œ*# t<          $ r Y Œ6w xY w|pg D ]8\  }}	 |                     ‰j        |¬¦  «        ƒ d{V —† Œ)# t<          $ r Y Œ5w xY wdS ‰dd…         t9          ‰¦  «        dk    rdndz   }| 
                    ‰j        d|› d�|¬¦  «        ƒ d{V —† dS # t<          $ rg}t
                                d‰¦  «         	 | 
                    ‰j        d‰› d|› �|¬¦  «        ƒ d{V —† n# t<          $ r Y n
w xY wY d}~dS Y d}~dS d}~ww xY w)zCExecute a background agent task and deliver the result to the chat.r   r¥  z0No adapter for platform %s in background task %sNrF  )r$  r,  rd   u   â�Œ Background task z, failed: no provider credentials configured.r  ©Ú_get_platform_toolsrs   Ú90)r$  c            
      ó²  •—  ‰d#d‰d         i‰d         ¤i d‰“dd“dd“d‰“d	‰“d
‰j         “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     d¦  «        “d‰                     dd¦  «        “d‰                     d¦  «        “d‰
“d‰“d‰	j        “d‰	j        “d‰	j        “d‰	j        “d‰	j        “d‰	j        “d ‰j        “d!‰j	        “¤Ž} 	 |  
                    ‰‰
¬"¦  «        ‰                     | ¦  «         S # ‰                     | ¦  «         w xY w)$Nrb   rº   rÎ  r±  TÚverbose_loggingFr³  r¢  r@  r=  Úproviders_allowedÚonlyÚproviders_ignoredrˆ  Úproviders_orderÚorderÚprovider_sortr¶  Úprovider_require_parametersÚrequire_parametersÚprovider_data_collectionÚdata_collectionrM  r  rp  rÖ  rC  rQ  rB  rF  Ú
session_dbrÁ   )r9  rÔ  r  )r�  r¸   rp  rÖ  rC  rQ  rB  rF  r±  r˜  Úrun_conversationr  )rq   r¦  r³  rÎ  Úplatform_keyÚprr‘  r¢  r¿  r$  rÔ  Ú
turn_routes    €€€€€€€€€€€r!   Úrun_syncz4GatewayRunner._run_background_task.<locals>.run_sync+  s   ø€ Ø˜ð ð Ø$ WÔ-ðà  Ô+ðð ð ð $2 >ðð  $˜tð	ð
 %* Eðð &6Ð%5ðð &6Ð%5ðð "&Ô!3Ð!3ðð '1§n¢nÐ5HÑ&IÔ&IÐ&Iðð ')§f¢f¨V¡n¤n nðð ')§f¢f¨XÑ&6Ô&6Ð&6ðð %'§F¢F¨7¡O¤O Oðð #%§&¢&¨¡.¤. .ðð 13·²Ð7KÈUÑ0SÔ0SÐ0Sðð .0¯VªVÐ4EÑ-FÔ-FÐ-Fðð   '˜wð!ð" *˜\ð#ð$ #œN˜Nð%ð& %Ô.Ð.ð'ð( #œN˜Nð)ð* %Ô.Ð.ð+ð, %Ô.Ð.ð-ð. %Ô.Ð.ð/ð0  $Ô/Ð/ð1ð2 $(Ô#7Ð#7ð3ð �ð69Ø ×1Ò1Ø%+Ø 'ð 2ñ ô ð
 ×1Ò1°%Ñ8Ô8Ð8Ð8ø�D×1Ò1°%Ñ8Ô8Ð8Ð8øøøs   ÄD? Ä?ErÉ  rp   rO  rþ  rÐ  r®  u&   âœ… Background task complete
Prompt: "z"

©rC  rÊ  rÌ  z(No response generated))rC  Ú	image_urlÚcaption)rC  r�  z"

(No response generated)zBackground task %s failedz	 failed: )!rõ  r¦  r‡  r¸   r  r³   r´   rF  r(  r8  r	  rC  r#  Úhermes_cli.tools_configrã  rÉ  r–  rµ  r   r²   r¡  rŽ  r�  r�  rB  Ú_run_in_executor_with_contextr»  r¼  rÞ   Ú
send_imager·   rÁ  r  )r¿  r‘  r$  rÔ  rí   Ú_thread_metadatar,  rb   r7  rã  rö  rG  rÙ  rÂ  ÚimagesÚtext_contentr-  r—  rø  Úalt_textrÉ  Ú	_is_voicerÁ  r¦  r³  rÎ  ró  rô  r¢  rõ  s   ````                   @@@@@@@r!   rà  z"GatewayRunner._run_background_task  s8  øøøøøøøøøøøè è € ð 	&Ð%Ð%Ð%Ð%Ð%à”-×#Ò# F¤OÑ4Ô4ˆØð 	Ý�NŠNÐMÈvÌÐ`gÑhÔhÐhØˆFà>DÔ>NÐX˜K¨Ô)9Ð:Ð:ÐTXÐð~	Ý.Ñ0Ô0ˆKØ$(×$GÒ$GØØ'ð %Hñ %ô %Ñ!ˆE�>ð "×%Ò% iÑ0Ô0ð Ø—l’lØ”NØ`¨7Ð`Ð`Ð`Ø-ð #ñ ô ð ð ð ð ð ð ð ð
 �å/°´Ñ@Ô@ˆLàCÐCÐCÐCÐCÐCÝ%Ð&9Ð&9¸+À|Ñ&TÔ&TÑUÔUÐàÔ'ˆBÝ ¥¤Ð+BÀDÑ!IÔ!IÑJÔJˆNØ#×EÒEÈVÐEÑTÔTÐØ%5ˆDÔ"Ø!%×!8Ò!8Ñ!:Ô!:ˆDÔØ×8Ò8¸ÀÈÑWÔWˆJð"9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ð "9ðH  ×=Ò=¸hÑGÔGÐGÐGÐGÐGÐGÐGˆFà;AÐI�v—z’zÐ"2°BÑ7Ô7Ð7ÀrˆHØð 7 ð 7¨6¯:ª:°gÑ+>Ô+>ð 7Ø6 V¨G¤_Ð6Ð6�ð ñ .Ø(/×(=Ò(=¸hÑ(GÔ(GÑ%�˜XØ'.×'=Ò'=¸hÑ'GÔ'GÑ$�˜à   " œ+µ#°f±+´+ÀÒ2BÐ2B¨¨ÈÑK�ØQÀ7ÐQÐQÐQ�àð Ø!Ÿ,š,Ø &¤Ø &¨Ñ 5Ø!1ð 'ñ ô ð ð ð ð ð ð ð ð ð
  ð ¨ð Ø!Ÿ,š,Ø &¤Ø &Ð)BÑ BØ!1ð 'ñ ô ð ð ð ð ð ð ð ð -3¨L°bð ð Ñ'�I˜xðØ%×0Ò0Ø$*¤NØ&/Ø$,ð 1ñ ô ð ð ð ð ð ð ð ð øõ
 %ð ð ð Ø˜ðøøøð /:Ð.?¸Rð ð Ñ)�J 	ðØ%×3Ò3Ø$*¤NØ&0ð 4ñ ô ð ð ð ð ð ð ð ð øõ %ð ð ð Ø˜ðøøøðð ð !  " œ+µ#°f±+´+ÀÒ2BÐ2B¨¨ÈÑK�Ø—l’lØ"œNØkÀgÐkÐkÐkØ-ð #ñ ô ð ð ð ð ð ð ð ð ð øõ ð 		ð 		ð 		Ý×ÒÐ8¸'ÑBÔBÐBðØ—l’lØ"œNØH°7ÐHÐHÀQÐHÐHØ-ð #ñ ô ð ð ð ð ð ð ð ð øõ
 ð ð ð Ø�ðøøøðð ð ð ð ð ð �����øøøøð		øøøs“   Á+A$M ÃGM Ê#J>Ê=M Ê>
KËM Ë
KËM Ë"K;Ë:M Ë;
LÌM ÌLÌM ÌA	M Í
O	Í"OÍ>)N(Î'OÎ(
N5Î2OÎ4N5Î5OÏO	c              ƒ   ór  ‡‡K  — ddl Š|                     ¦   «                              ¦   «         }|                      |¦  «        \  }}t          dz  Š|                      |j        ¦  «        }|                      ¦   «         | _        |  	                    |j        |¬¦  «        | _
        dt          fˆˆfd„}|sn| j
        }|€d}n0|                     d¦  «        d	u rd
}n|                     dd¦  «        }| j        rdnd}	|t          | di ¦  «        pi v }
|
rdnd}d|› d|› d|	› d�S t          |j        j        ¦  «        }|dv rd| _         |d|› d�d¦  «         d|› d�S |dv rd	| _         |d|› d�d	¦  «         d|› d�S |                     ¦   «         }|dk    rJ|rd S |                      |d¦  «         |                      ¦   «         | _
        |                      |¦  «         d!S |d"k    rdd	i}n$|d#v rd|d$œ}nd%|p|                     ¦   «         › d&�S || _
        |rn |d'|¦  «        r1|                      |d¦  «         |                      |¦  «         d(|› d)�S |                      ||¦  «         |                      |¦  «         d(|› d*�S |                      ||¦  «         |                      |¦  «         d(|› d+�S ),u]  Handle /reasoning command â€” manage reasoning effort and display toggle.

        Usage:
            /reasoning                       Show current effort level and display state
            /reasoning <level>               Set reasoning effort for this session only
            /reasoning <level> --global      Persist reasoning effort to config.yaml
            /reasoning reset                 Clear this session's reasoning override
            /reasoning show|on               Show model reasoning in responses
            /reasoning hide|off              Hide model reasoning from responses
        r   Nr,   rŸ  Úkey_pathc                 óô  •— 	 i }‰                      ¦   «         r@t          ‰d¬¦  «        5 }‰	                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                      d¦  «        }|}|dd…         D ].}||vst	          ||         t
          ¦  «        si ||<   ||         }Œ/|||d         <   t          ‰|¦  «         dS # t          $ r'}t           	                    d| |¦  «         Y d}~dS d}~ww xY w©	z(Save a dot-separated key to config.yaml.r-   r.   NrZ   rE  Tz Failed to save config key %s: %sF©
r   rÆ   rÇ   rô   rÈ   rÉ   r$   r·   r³   rO  ©
r  r!  r,  r'  r0  rÁ  r+  rÁ  r&  rÄ   s
           €€r!   Ú_save_config_keyzAGatewayRunner._handle_reasoning_command.<locals>._save_config_key¨  óa  ø€ ðØ �Ø×%Ò%Ñ'Ô'ð >Ý˜k°GÐ<Ñ<Ô<ð >ÀØ&*§n¢n°QÑ&7Ô&7Ð&=¸2˜ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >à—~’~ cÑ*Ô*�Ø%�Ø˜c˜r˜cœð )ð )�AØ Ð'Ð'­z¸'À!¼*ÅdÑ/KÔ/KÐ'Ø%'˜ ™
Ø% aœj�G�GØ$)�˜˜RœÑ!Ý! +¨{Ñ;Ô;Ð;Ø�tøÝð ð ð Ý—’Ð?ÀÈ1ÑMÔMÐMØ�u�u�u�u�uøøøøðøøøó;   ƒ'C ªAÁC ÁAÁC ÁAÁA.C Ã
C7ÃC2Ã2C7zmedium (default)r  Fznone (disabled)r•  Úmediumu   on âœ“rë  rm  zsession overridezglobal configu*   ðŸ§  **Reasoning Settings**

**Effort:** `z`
**Scope:** z
**Display:** zW

_Usage:_ `/reasoning <none|minimal|low|medium|high|xhigh|reset|show|hide> [--global]`)Úshowr©  Tzdisplay.platforms.z.show_reasoninguZ   ðŸ§  âœ“ Reasoning display: **ON**
Model thinking will be shown before each response on **ú**.)Úhiderë  u*   ðŸ§  âœ“ Reasoning display: **OFF** for **r)  Úresetut   âš ï¸� `/reasoning reset --global` is not supported. Use `/reasoning <level> --global` to change the global default.uK   ðŸ§  âœ“ Session reasoning override cleared; falling back to global config.r¦  )ÚminimalÚlowr  ÚhighÚxhigh)r  r•  õ   âš ï¸� Unknown argument: `zŒ`

**Valid levels:** none, minimal, low, medium, high, xhigh
**Display:** show, hide
**Persist:** add `--global` to save beyond this sessionzagent.reasoning_effortu"   ðŸ§  âœ“ Reasoning effort set to `z4` (saved to config)
_(takes effect on next message)_uH   ` (session only â€” config save failed)
_(takes effect on next message)_uO   ` (session only â€” add `--global` to persist)
_(takes effect on next message)_)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  ÚrcÚlevelÚdisplay_stateÚhas_session_overrideÚscoperó  r•  rÞ  r&  rÄ   s                  @@r!   rõ  z'GatewayRunner._handle_reasoning_command‘  s  øøè è € ð 	ˆˆˆà×)Ò)Ñ+Ô+×1Ò1Ñ3Ô3ˆØ#×AÒAÀ(ÑKÔKÑˆˆnÝ" ]Ñ2ˆØ×2Ò2°5´<Ñ@Ô@ˆØ#×8Ò8Ñ:Ô:ˆÔØ!%×!GÒ!GØ”<Ø#ð "Hñ "
ô "
ˆÔð
	¥sð 	ð 	ð 	ð 	ð 	ð 	ð 	ð( ð 	àÔ'ˆBØˆzØ*��Ø—’˜	Ñ"Ô" eÐ+Ð+Ø)��àŸš˜x¨Ñ2Ô2�Ø(,Ô(<ÐG˜H˜HÀ%ˆMØ#.µ7¸4ÐA_ÐacÑ3dÔ3dÐ3jÐhjÐ#kÐ Ø*>ÐSÐ&Ð&ÀOˆEðhØ %ðhð hà#ðhð hð !.ðhð hð hðõ ,¨E¬LÔ,AÑBÔBˆØ�>Ð!Ð!Ø#'ˆDÔ ØÐÐO°,ÐOÐOÐOÐQUÑVÔVÐVð\ØJVð\ð \ð \ðð
 �?Ð"Ð"Ø#(ˆDÔ ØÐÐO°,ÐOÐOÐOÐQVÑWÔWÐWØPÀÐPÐPÐPÐPð —’‘”ˆØ�WÒÐØð Nð Nð  NØ×0Ò0°¸dÑCÔCÐCØ%)×%@Ò%@Ñ%BÔ%BˆDÔ"Ø×$Ò$ [Ñ1Ô1Ð1Ø`Ð`Ø�VÒÐØ Ð'ˆFˆFØÐDÐDÐDØ!%°Ð8Ð8ˆFˆFðJ¨VÐ-G°x·~²~Ñ7GÔ7Gð Jð Jð Jðð "(ˆÔØð 	JØÐÐ 8¸&ÑAÔAð zØ×4Ò4°[À$ÑGÔGÐGØ×(Ò(¨Ñ5Ô5Ð5Øy¸FÐyÐyÐyÐyØ×0Ò0°¸fÑEÔEÐEØ×$Ò$ [Ñ1Ô1Ð1ð J¸ð  Jð  Jð  Jð  Jà×,Ò,¨[¸&ÑAÔAÐAØ× Ò  Ñ-Ô-Ð-ð M°Fð  Mð  Mð  Mð  	Mré   c              ƒ   óú  ‡
‡K  — ddl Šddlm} |                     ¦   «                              ¦   «                              ¦   «         }t          dz  Š
|                      ¦   «         | _        t          ¦   «         }t          |¦  «        } ||¦  «        sdS dt          fˆ
ˆfd„}|r|dk    r| j        d	k    rd
nd}d|› d�S |dv rd	| _        d
}d}	n|dv rd| _        d}d}	nd|› d�S  |d|¦  «        rd|	› d�S d|	› d�S )uL   Handle /fast â€” mirror the CLI Priority Processing toggle in gateway chats.r   N)Úmodel_supports_fast_moder,   uO   âš¡ /fast is only available for OpenAI models that support Priority Processing.r  c                 óô  •— 	 i }‰                      ¦   «         r@t          ‰d¬¦  «        5 }‰	                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                      d¦  «        }|}|dd…         D ].}||vst	          ||         t
          ¦  «        si ||<   ||         }Œ/|||d         <   t          ‰|¦  «         dS # t          $ r'}t           	                    d| |¦  «         Y d}~dS d}~ww xY wr  r  r  s
           €€r!   r  z<GatewayRunner._handle_fast_command.<locals>._save_config_key  r	  r
  r¡  r«  rª  r§  u(   âš¡ Priority Processing

Current mode: `z(`

_Usage:_ `/fast <normal|fast|status>`>   r©  rª  ÚFAST>   rë  r§  ÚNORMALr  z*`

**Valid options:** normal, fast, statuszagent.service_tieru   âš¡ âœ“ Priority Processing: **z5** (saved to config)
_(takes effect on next message)_z** (this session only))rÄ   r2  r  ræ  ró   rõ   rÅ   r�  r�  r(  r-  rò   )r¿  rã   r  r­   r,  rb   r  r¡  Úsaved_valuer  r&  rÄ   s             @@r!   rö  z"GatewayRunner._handle_fast_command  s£  øøè è € àˆˆˆØ>Ð>Ð>Ð>Ð>Ð>à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆÝ" ]Ñ2ˆØ!×4Ò4Ñ6Ô6ˆÔå*Ñ,Ô,ˆÝ& {Ñ3Ô3ˆØ'Ð'¨Ñ.Ô.ð 	eØdÐdð	¥sð 	ð 	ð 	ð 	ð 	ð 	ð 	ð( ð 	�t˜xÒ'Ð'Ø#Ô1°ZÒ?Ð?�V�VÀXˆFð8Ø"(ð8ð 8ð 8ðð �>Ð!Ð!Ø!+ˆDÔØ ˆKØˆEˆEØÐ&Ð&Ð&Ø!%ˆDÔØ"ˆKØˆEˆEð:¨Tð :ð :ð :ðð
 ÐÐ0°+Ñ>Ô>ð 	sØr°UÐrÐrÐrÐrØN°ÐNÐNÐNÐNré   c              ƒ   óœ   K  — ddl m}m}m} |                      |j        ¦  «        } ||¦  «        }|r ||¦  «         dS  ||¦  «         dS )uP   Handle /yolo â€” toggle dangerous command approval bypass for this session only.r   )Údisable_session_yoloÚenable_session_yoloÚis_session_yolo_enableduW   âš ï¸� YOLO mode **OFF** for this session â€” dangerous commands will require approval.uW   âš¡ YOLO mode **ON** for this session â€” all commands auto-approved. Use with caution.)Útools.approvalr!  r"  r#  r*  r$  )r¿  rã   r!  r"  r#  rê   rÁ  s          r!   rì  z"GatewayRunner._handle_yolo_command>  s–   è è € ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ×2Ò2°5´<Ñ@Ô@ˆØ)Ð)¨+Ñ6Ô6ˆØð 	mØ Ð  Ñ-Ô-Ð-ØlÐlàÐ Ñ,Ô,Ð,ØlÐlré   c              ƒ   ój  K  — ddl }t          dz  }t          |j        j        ¦  «        }	 i }|                     ¦   «         r@t          |d¬¦  «        5 }|                     |¦  «        pi }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «                             dd¦  «        }n# t          $ r d}Y nw xY w|s	 d	S g d
¢}ddddd
œ}	ddl
m}
  |
||dd¦  «        }||vrd}|                     |¦  «        dz   t          |¦  «        z  }||         }	 d|vs(t          |                     d¦  «        t          ¦  «        si |d<   |d         }d|vs(t          |                     d¦  «        t          ¦  «        si |d<   ||d         vs.t          |d                              |¦  «        t          ¦  «        si |d         |<   ||d         |         d<   t!          ||¦  «         |	|         › d|› d�S # t          $ r3}t"                               d|¦  «         |	|         › d|› d�cY d}~S d}~ww xY w)u¸  Handle /verbose command â€” cycle tool progress display mode.

        Gated by ``display.tool_progress_command`` in config.yaml (default off).
        When enabled, cycles the tool progress mode through off â†’ new â†’ all â†’
        verbose â†’ off for the *current platform*.  The setting is saved to
        ``display.platforms.<platform>.tool_progress`` so each channel can
        have its own verbosity level independently.
        r   Nr,   r-   r.   r|   Útool_progress_commandFzŽThe `/verbose` command is not enabled for messaging platforms.

Enable it in `config.yaml`:
```yaml
display:
  tool_progress_command: true
```)rë  r©  rê  r³  u9   âš™ï¸� Tool progress: **OFF** â€” no tool activity shown.uv   âš™ï¸� Tool progress: **NEW** â€” shown when tool changes (preview length: `display.tool_preview_length`, default 40).ut   âš™ï¸� Tool progress: **ALL** â€” every tool call shown (preview length: `display.tool_preview_length`, default 40).uJ   âš™ï¸� Tool progress: **VERBOSE** â€” every tool call with full arguments.rÕ  Útool_progressrê  r)   rU  z
_(saved for **u%   ** â€” takes effect on next message)_z%Failed to save tool_progress mode: %sz
_(could not save to config: z)_)rÄ   rÅ   r#  r$  r  r   rÆ   rÇ   r¸   r·   r  rÖ  ÚindexrÞ   rÈ   rÉ   r$   r³   r´   )r¿  rã   rÄ   r&  ró  r,  r'  Úgate_enabledÚcycleÚdescriptionsrÖ  rÁ  rÀ  Únew_moder|   rÁ  s                   r!   rí  z%GatewayRunner._handle_verbose_commandO  s(  è è € ð 	ˆˆˆå" ]Ñ2ˆÝ+¨E¬LÔ,AÑBÔBˆð	!ØˆKØ×!Ò!Ñ#Ô#ð :Ý˜+°Ð8Ñ8Ô8ð :¸AØ"&§.¢.°Ñ"3Ô"3Ð"9°r�Kð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :à&Ÿ?š?¨9°bÑ9Ô9×=Ò=Ð>UÐW\Ñ]Ô]ˆLˆLøÝð 	!ð 	!ð 	!Ø ˆLˆLˆLð	!øøøð ð 	ð?ðð ð 1Ð0Ð0ˆàNð Lð JØcð	
ð 
ˆð 	CÐBÐBÐBÐBÐBØ)Ð)¨+°|À_ÐV[Ñ\Ô\ˆØ˜%ÐÐØˆGØ�{Š{˜7Ñ#Ô# aÑ'­3¨u©:¬:Ñ5ˆØ˜”:ˆð	RØ Ð+Ð+µ:¸k¿oºoÈiÑ>XÔ>XÕZ^Ñ3_Ô3_Ð+Ø)+�˜IÑ&Ø! )Ô,ˆGØ 'Ð)Ð)µ¸G¿KºKÈÑ<TÔ<TÕVZÑ1[Ô1[Ð)Ø')�˜Ñ$Ø 7¨;Ô#7Ð7Ð7½zÈ'ÐR]ÔJ^×JbÒJbÐcoÑJpÔJpÕrvÑ?wÔ?wÐ7Ø57�˜Ô$ \Ñ2ØBJˆG�KÔ  Ô.¨Ñ?Ý˜k¨;Ñ7Ô7Ð7à Ô)ð Uð UØ!-ðUð Uð Uðøõ ð 	Rð 	Rð 	RÝ�NŠNÐBÀAÑFÔFÐFØ" 8Ô,ÐQÐQÈAÐQÐQÐQÐQÐQÐQÐQÐQÐQøøøøð	RøøøsT   «'B, ÁA6Á*B, Á6A:Á:B, Á=A:Á>-B, Â,B;Â:B;ÄCG5 Ç5
H2Ç?(H-È'H2È-H2c              ƒ   óö  ‡‡‡‡K  — |j         }| j                             |¦  «        }| j                             |j        ¦  «        }|rt          |¦  «        dk     rdS |                     ¦   «         pd                     ¦   «         pdŠ	 ddlm	} ddl
m} ddlm} |                      |¦  «        }|                      ||¬	¦  «        \  }	}
|
                     d
¦  «        sdS d„ |D ¦   «         Št          ‰¦  «        } |‰¦  «        Š |di |
¤|	ddddg|j        dœ¤ŽŠ	 d„ ‰_        ‰j        }|                     ‰¦  «        s	 |                      ‰¦  «         dS t+          j        ¦   «         }|                     dˆˆˆˆfd„¦  «        ƒ d{V —†\  }}‰j        }||j        k    r ||_        | j                             ¦   «          | j                             ||¦  «         | j                             |j        d¬¦  «          ||¦  «        } |‰|‰|¦  «        }|                      ‰¦  «         n# |                      ‰¦  «         w xY wd|d         › �g}‰r|                     d‰› d�¦  «         |                     |d         ¦  «         |d         r|                     |d         ¦  «         d                     |¦  «        S # t<          $ r*}t>                                d|¦  «         d|› �cY d}~S d}~ww xY w)a  Handle /compress command -- manually compress conversation context.

        Accepts an optional focus topic: ``/compress <focus>`` guides the
        summariser to preserve information related to *focus* while being
        more aggressive about discarding everything else.
        rA  z?Not enough conversation to compress (need at least 4 messages).rp   Nr   r¥  )Úsummarize_manual_compression©rš  rŸ  rd   z*No provider configured -- cannot compress.c                 ó¼   — g | ]Y}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|                      d ¦  «        |                      d¦  «        dœ‘ŒZS r¨  rV  r®  s     r!   rÌ  z:GatewayRunner._handle_compress_command.<locals>.<listcomp>°  sg   € ð ð ð àØ—5’5˜‘=”=Ð$9Ð9Ð9¸a¿eºeÀIÑ>NÔ>NÐ9ð Ÿš˜v™œ°1·5²5¸Ñ3CÔ3CÐDÐDà9Ð9Ð9ré   Tr¯  r°  c                  ó   — d S rr  r  rµ  s     r!   ru  z8GatewayRunner._handle_compress_command.<locals>.<lambda>Â  s   € °t€ ré   zHNothing to compress yet (the transcript is still all protected context).c                  ó6   •— ‰                      ‰d‰ ‰¬¦  «        S )Nrp   )r¹  Úfocus_topicrº  )r¹  r3  ÚmsgsÚ	tmp_agents   €€€€r!   ru  z8GatewayRunner._handle_compress_command.<locals>.<lambda>Ë  s    ø€ ˜I×7Ò7¸¸bÐP]ÐkvÐ7ÑwÔw€ ré   rã  u   ðŸ—œï¸� ÚheadlinezFocus: "rM  Ú
token_lineÚnoterÛ   zManual compress failed: %szCompression failed: r  )!r$  r›  rè  ró  rM  rÞ   ræ  ró   rõ  r¦  Ú!agent.manual_compression_feedbackr.  rp  rš  r*  r8  r¸   rö  Úcontext_compressorÚhas_content_to_compressr  rž  rõ  r÷  r/  rø  r
  rê   rá   râ   r·   r³   r´   )r¿  rã   r$  r  rF  r¦  r.  rš  rê   rb   r7  Úoriginal_countÚ
compressorrQ  Ú
compressedrû   Únew_session_idÚ
new_tokensrè  re  rÁ  r¹  r3  r4  r5  s                        @@@@r!   rü  z&GatewayRunner._handle_compress_command’  sú  øøøøè è € ð ”ˆØÔ*×@Ò@ÀÑHÔHˆØÔ$×4Ò4°]Ô5MÑNÔNˆàð 	U�#˜g™,œ,¨Ò*Ð*ØTÐTð ×-Ò-Ñ/Ô/Ð5°2×<Ò<Ñ>Ô>ÐFÀ$ˆðK	.Ø)Ð)Ð)Ð)Ð)Ð)ØVÐVÐVÐVÐVÐVØKÐKÐKÐKÐKÐKà×6Ò6°vÑ>Ô>ˆKØ$(×$GÒ$GØØ'ð %Hñ %ô %Ñ!ˆE�>ð "×%Ò% iÑ0Ô0ð DØCÐCðð à ðñ ô ˆDõ
 ! ™YœYˆNØ:Ð:¸4Ñ@Ô@ˆMà˜ð ð Ø ðàØ ØØ Ø"* Ø(Ô3ðð ð ð ˆIð#9Ø&;Ð&;�	Ô#à&Ô9�
Ø!×9Ò9¸$Ñ?Ô?ð fØeð< ×-Ò-¨iÑ8Ô8Ð8Ð8Ð8õ9 Ô/Ñ1Ô1�Ø&*×&:Ò&:ØØwÐwÐwÐwÐwÐwÐwñ'ô 'ð !ð !ð !ð !ð !ð !‘�
˜Að "+Ô!5�Ø! ]Ô%=Ò=Ð=Ø/=�MÔ,ØÔ&×,Ò,Ñ.Ô.Ð.àÔ"×5Ò5°nÀjÑQÔQÐQàÔ"×1Ò1Ø!Ô-À!ð 2ñ ô ð ð <Ð;¸JÑGÔG�
Ø6Ð6ØØØ!Øñ	ô �ð ×-Ò-¨iÑ8Ô8Ð8Ð8ø�×-Ò-¨iÑ8Ô8Ð8Ð8øøøØ5 ¨
Ô 3Ð5Ð5Ð6ˆEØð :Ø—’Ð8¨Ð8Ð8Ð8Ñ9Ô9Ð9Ø�LŠL˜ Ô.Ñ/Ô/Ð/Ø�vŒð .Ø—’˜W Vœ_Ñ-Ô-Ð-Ø—9’9˜UÑ#Ô#Ð#øÝð 	.ð 	.ð 	.Ý�NŠNÐ7¸Ñ;Ô;Ð;Ø-¨!Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øøøøð	.øøøsK   Â	AK Ã!=K Ä$H0 ÅK ÅB?H0 ÈK È0IÉA<K Ë
K8ËK3Ë-K8Ë3K8c              ƒ   óÌ  K  — |j         }| j                             |¦  «        }|j        }| j        sdS | j                             |¦  «        }|€G	 | j                             ||j        r|j        j        nd|j	        ¬¦  «         n# t          $ r Y nw xY w|                     ¦   «                              ¦   «         }|r|	 | j                             |¦  «        }n# t          $ r}d|› �cY d}~S d}~ww xY w|sdS 	 | j                             ||¦  «        rd|› d�S d	S # t          $ r}d|› �cY d}~S d}~ww xY w| j                             |¦  «        }	|	r	d
|› d|	› d�S d
|› d�S )uB   Handle /title command â€” set or show the current session's title.úSession database not available.NrN  )rM  r$  rp  õ   âš ï¸� uE   âš ï¸� Title is empty after cleanup. Please use printable characters.u   âœ�ï¸� Session title set: **r)  zSession not found in database.u   ðŸ“Œ Session: `z`
Title: **z/`
No title set. Usage: `/title My Session Name`)r$  r›  rè  rM  r±  r¡  Úcreate_sessionr  r!  rp  r·   ræ  ró   Úsanitize_titler™  Úset_session_title)
r¿  rã   r$  r  rM  Úexisting_titleÚ	title_argÚ	sanitizedrÁ  rÆ  s
             r!   r  z#GatewayRunner._handle_title_commandð  s  è è € à”ˆØÔ*×@Ò@ÀÑHÔHˆØ"Ô-ˆ
àÔð 	5Ø4Ð4ð Ô)×;Ò;¸JÑGÔGˆØÐ!ðØÔ ×/Ò/Ø)Ø4:´OÐR˜6œ?Ô0Ð0ÈØ"œNð 0ñ ô ð ð øõ
 ð ð ð Ø�ðøøøð ×*Ò*Ñ,Ô,×2Ò2Ñ4Ô4ˆ	Øð 	fð%Ø Ô,×;Ò;¸IÑFÔF�	�	øÝð %ð %ð %Ø$ �}�}Ð$Ð$Ð$Ð$Ð$Ð$øøøøð%øøøàð _Ø^Ð^ð%ØÔ#×5Ò5°jÀ)ÑLÔLð <ØG¸)ÐGÐGÐGÐGà;Ð;øÝð %ð %ð %Ø$ �}�}Ð$Ð$Ð$Ð$Ð$Ð$øøøøð%øøøð Ô$×6Ò6°zÑBÔBˆEØð fØJ¨ÐJÐJÀÐJÐJÐJÐJàe¨ÐeÐeÐeÐesN   Á5B Â
BÂBÃ C Ã
C4Ã%C/Ã)C4Ã/C4Ã< D Ä
D8Ä)D3Ä-D8Ä3D8c              ƒ   óJ  K  — | j         sdS |j        }|                      |¦  «        }|                     ¦   «                              ¦   «         }|sÿ	 |j        r|j        j        nd}| j                              |d¬¦  «        }d„ |D ¦   «         }|s	 dS dg}|dd…         D ]M}	|	d         }
|	                     d	d
¦  «        dd…         }|rd|› d�nd
}| 	                    d|
› d|› �¦  «         ŒN| 	                    d¦  «         d 
                    |¦  «        S # t          $ r*}t                               d|¦  «         d|› �cY d}~S d}~ww xY w| j                              |¦  «        }|sd|› d�S 	 | j                              |¦  «        }n3# t          $ r&}t                               d||¦  «         Y d}~nd}~ww xY w| j                             |¦  «        }|j        |k    rd|› d�S |                      |¦  «         | j                             ||¦  «        }|sdS |                      |¦  «         | j                              |¦  «        p|}
| j                             |¦  «        }|rt1          d„ |D ¦   «         ¦  «        nd}|rd|› d|dk    rdnd
› d �nd
}d!|
› d|› d"�S )#u@   Handle /resume command â€” switch to a previously-named session.rB  Nræ  )r$  Úlimitc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS )rÆ  rV  )r  Úss     r!   rÌ  z8GatewayRunner._handle_resume_command.<locals>.<listcomp>0  s'   € Ð@Ð@Ð@ °·²°w±´Ð@˜!Ð@Ð@Ð@ré   zNo named sessions found.
Use `/title My Session` to name your current session, then `/resume My Session` to return to it later.u   ðŸ“‹ **Named Sessions**
rÆ  r-  rp   rL  u    â€” _rû   u   â€¢ **r)  z 
Usage: `/resume <session name>`rÛ   z"Failed to list titled sessions: %szCould not list sessions: zNo session found matching '**z?**'.
Use `/resume` with no arguments to see available sessions.z0Failed to resolve resume continuation for %s: %su   ðŸ“Œ Already on session **r  zFailed to switch session.c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS ©r©  r«  rV  r®  s     r!   rÌ  z8GatewayRunner._handle_resume_command.<locals>.<listcomp>d  ó,   € ÐGÐGÐG˜q¨q¯uªu°V©}¬}ÀÒ/FÐ/F˜Ð/FÐ/FÐ/Fré   r   rÔ  ú messager)   rM  rÖ  u   â†» Resumed session **z. Conversation restored.)r±  r$  r*  ræ  ró   r  r!  Úlist_sessions_richr¸   rá   râ   r·   r³   rË   Úresolve_session_by_titleÚresolve_resume_session_idr›  rè  rM  rÞ  Úswitch_sessionr�  r¡  ró  rÞ   )r¿  rã   r$  rê   r  Úuser_sourcer}  Útitledre  rM  rÆ  r-  Úpreview_partrÁ  Ú	target_idÚcurrent_entryr•  rF  Ú	msg_countÚmsg_parts                       r!   r  z$GatewayRunner._handle_resume_command   s•  è è € àÔð 	5Ø4Ð4à”ˆØ×2Ò2°6Ñ:Ô:ˆØ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆàð 	7ð7Ø7=´ÐP˜fœoÔ3Ð3ÈD�ØÔ+×>Ò>Ø&¨bð ?ñ ô �ð AÐ@ XÐ@Ñ@Ô@�Øð ðKðð ð
 5Ð5�Ø   œð Cð C�AØ˜gœJ�EØŸeše I¨rÑ2Ô2°3°B°3Ô7�GØ:AÐ#IÐ#6¨GÐ#6Ð#6Ð#6Ð#6Àr�LØ—L’LÐ!A¨%Ð!AÐ!A°<Ð!AÐ!AÑBÔBÐBÐBØ—’Ð@ÑAÔAÐAØ—y’y Ñ'Ô'Ð'øÝð 7ð 7ð 7Ý—’ÐAÀ1ÑEÔEÐEØ6°1Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøð
 Ô$×=Ò=¸dÑCÔCˆ	Øð 	ðM°ð Mð Mð Mðð	[ØÔ(×BÒBÀ9ÑMÔMˆIˆIøÝð 	[ð 	[ð 	[Ý�LŠLÐKÈYÐXYÑZÔZÐZÐZÐZÐZÐZÐZøøøøð	[øøøð Ô*×@Ò@ÀÑHÔHˆØÔ# yÒ0Ð0Ø9°Ð9Ð9Ð9Ð9ð 	×)Ò)¨+Ñ6Ô6Ð6ð Ô&×5Ò5°kÀ9ÑMÔMˆ	Øð 	/Ø.Ð.Ø×3Ò3°KÑ@Ô@Ð@ð Ô ×2Ò2°9Ñ=Ô=ÐEÀˆð Ô$×4Ò4°YÑ?Ô?ˆØLSÐZ•CÐGÐG GÐGÑGÔGÑHÔHÐHÐYZˆ	ØOXÐ`ÐK˜	ÐKÐK°)¸q².°.¨3¨3ÀbÐKÐKÐKÐKÐ^`ˆàS¨ÐSÐS°ÐSÐSÐSÐSs>   ÁA D ÂBD Ä
EÄ"EÅEÅEÅ2F Æ
F=ÆF8Æ8F=c              ƒ   ó¾  K  — ddl }| j        sdS |j        }|                      |¦  «        }| j                             |¦  «        }| j                             |j        ¦  «        }|sdS |                     ¦   «          	                    ¦   «         }ddl
m
} |                     ¦   «         }	|	                     d¦  «        }
|                     ¦   «         j        dd…         }|
› d|› �}|r|}n=| j                             |j        ¦  «        }|pd	}| j                             |¦  «        }|j        }	 | j                             ||j        r|j        j        nd
t)          | j        t,          ¦  «        r0| j                             di ¦  «        pi                      d¦  «        nd|¬¦  «         n7# t0          $ r*}t2                               d|¦  «         d|› �cY d}~S d}~ww xY w|D ]Ð}	 | j                             ||                     dd¦  «        |                     d¦  «        |                     d¦  «        p|                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «         ŒÁ# t0          $ r Y ŒÍw xY w	 | j                             ||¦  «         n# t0          $ r Y nw xY w| j                             ||¦  «        }|sdS |                      |¦  «         |                      |¦  «         tA          d„ |D ¦   «         ¦  «        }d|› d|› d|dk    rd nd!› d"|› d#|› d$�S )%u  Handle /branch [name] â€” fork the current session into a new independent copy.

        Copies conversation history to a new session so the user can explore
        a different approach without losing the original.
        Inspired by Claude Code's /branch command.
        r   NrB  u3   No conversation to branch â€” send a message first.r   z%Y%m%d_%H%M%Sé   rû   rÈ  r  rb   r+  )rM  r$  rb   Úparent_session_idz#Failed to create branch session: %szFailed to create branch: r©  r«  rÊ  Ú	tool_namer  rŠ  Útool_call_idr¾  Úreasoning_content)rM  r©  rÊ  r`  rŠ  ra  r¾  rb  z*Branch created but failed to switch to it.c                 óD   — g | ]}|                      d ¦  «        dk    ¯|‘ŒS rO  rV  r®  s     r!   rÌ  z8GatewayRunner._handle_branch_command.<locals>.<listcomp>¼  rP  ré   u   â‘‚ Branched to **z** (rQ  r)   rM  rp   z copied)
Original: `z`
Branch: `z/`
Use `/resume` to switch back to the original.)!r™  r±  r$  r*  r›  rè  ró  rM  ræ  ró   r   rå  r£  r�  rž  r¡  Úget_next_title_in_lineagerD  r  r!  rÈ   r)  rÉ   r¸   r·   r³   rO  Úappend_messagerF  rU  r�  rÊ  rÞ   )r¿  rã   r£  r$  rê   rZ  rF  Úbranch_nameÚ_dtrå  Útimestamp_strÚ
short_uuidr?  Úbranch_titleÚcurrent_titleÚbaser_  rÁ  r  r•  r[  s                        r!   r  z$GatewayRunner._handle_branch_commandi  s  è è € ð 	ÐÐÐàÔð 	5Ø4Ð4à”ˆØ×2Ò2°6Ñ:Ô:ˆð Ô*×@Ò@ÀÑHÔHˆØÔ$×4Ò4°]Ô5MÑNÔNˆØð 	IØHÐHà×,Ò,Ñ.Ô.×4Ò4Ñ6Ô6ˆð 	-Ð,Ð,Ð,Ð,Ð,Ø�gŠg‰iŒiˆØŸš _Ñ5Ô5ˆØ—[’[‘]”]Ô& r¨ rÔ*ˆ
Ø)Ð8Ð8¨JÐ8Ð8ˆð ð 	LØ&ˆLˆLà Ô,×>Ò>¸}Ô?WÑXÔXˆMØ Ð, HˆDØÔ+×EÒEÀdÑKÔKˆLà)Ô4Ðð		3ØÔ×+Ò+Ø)Ø06´ÐN�v”Ô,Ð,ÀYÝMWÐX\ÔXcÕeiÑMjÔMjÐt�t”{—’ w°Ñ3Ô3Ð9°r×>Ò>¸yÑIÔIÐIÐptØ"3ð	 ,ñ ô ð ð øõ ð 	3ð 	3ð 	3Ý�LŠLÐ>ÀÑBÔBÐBØ2¨qÐ2Ð2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð	3øøøð
 ð 	ð 	ˆCðØÔ ×/Ò/Ø-ØŸš ¨Ñ0Ô0ØŸGšG IÑ.Ô.Ø!Ÿgšg kÑ2Ô2ÐE°c·g²g¸f±o´oØ"Ÿwšw |Ñ4Ô4Ø!$§¢¨Ñ!8Ô!8Ø!Ÿgšg kÑ2Ô2Ø&)§g¢gÐ.AÑ&BÔ&Bð 0ñ 	ô 	ð 	ð 	øõ ð ð ð Ø�ðøøøð	ØÔ×.Ò.¨~¸|ÑLÔLÐLÐLøÝð 	ð 	ð 	ØˆDð	øøøð Ô&×5Ò5°kÀ>ÑRÔRˆ	Øð 	@Ø?Ð?Ø×3Ò3°KÑ@Ô@Ð@ð 	× Ò  Ñ-Ô-Ð-åÐGÐG GÐGÑGÔGÑHÔHˆ	ð= ð =ð =Øð=ð =Ø+4¸ª>¨> C C¸rð=ð =à+ð=ð =ð 'ð=ð =ð =ð	
sD   Ä0A;F, Æ,
G Æ6GÇG ÇG Ç(B=J&Ê&
J3Ê2J3Ê7K Ë
K ËK c           
   ƒ   ó–  K  — |j         }|                      |¦  «        }| j                             |¦  «        }|r	|t          u r_t          | dd¦  «        }t          | dd¦  «        }|r;|�9|5  |                     |¦  «        }|r|d         }ddd¦  «         n# 1 swxY w Y   |r|t          urt          |dd¦  «        nd}|r|t          urt          |dd¦  «        nd}	|r|t          urt          |dd¦  «        nd}
|sŽt          | dd¦  «        �}	 | j                             |¦  «        }| j         	                    |j
        ¦  «        pi }n# t          $ r i }Y nw xY w|p|                     d	¦  «        }|	p|                     d
¦  «        }	g }|rJ	 t          j        t          ||	|
¬¦  «        ƒ d{V —†}n# t          $ r d}Y nw xY w|rt          |d¬¦  «        }|�r t!          |d¦  «        �r|j        dk    �rg }|                     ¦   «         }|rC|j        r<ddlm} |                     d ||¦  «        › �¦  «         |                     d¦  «         t          |dd¦  «        pd}t          |dd¦  «        pd}t          |dd¦  «        pd}t          |dd¦  «        pd}|                     d¦  «         |                     d|j        › d�¦  «         |                     d|d›�¦  «         |r|                     d|d›�¦  «         |r|                     d|d›�¦  «         |                     d|d›�¦  «         |                     d|j        d›�¦  «         |                     d|j        › �¦  «         	 dd lm}m}  ||j         |||||¬!¦  «        t          |dd¦  «        t          |dd¦  «        ¬"¦  «        }|j        �>|j        d#k    rd$nd}|                     d%|› d&t=          |j        ¦  «        d'›�¦  «         n |j        d(k    r|                     d)¦  «         n# t          $ r Y nw xY w|j        }|j         rU|j!        r tE          d*|j         |j!        z  d*z  ¦  «        nd}|                     d+|j         d›d,|j!        d›d-|d.›d/�¦  «         |j#        r|                     d0|j#        › �¦  «         |r*|                     d¦  «         | $                    |¦  «         d1 %                    |¦  «        S | j                             |¦  «        }| j         &                    |j
        ¦  «        }|rydd2l'm(} d3„ |D ¦   «         } ||¦  «        } d4d5tS          |¦  «        › �d6| d›d7�d8g}|r*|                     d¦  «         | $                    |¦  «         d1 %                    |¦  «        S |rd1 %                    |¦  «        S d9S ):a:  Handle /usage command -- show token usage for the current session.

        Checks both _running_agents (mid-turn) and _agent_cache (between turns)
        so that rate limits, cost estimates, and detailed token breakdowns are
        available whenever the user asks, not only while the agent is running.
        r¬  Nrª  r   ra   rc   rd   r±  Úbilling_providerÚbilling_base_urlr`  T)ÚmarkdownÚsession_total_tokens)Úformat_rate_limit_compactu   â�±ï¸� **Rate Limits:** rp   Úsession_input_tokensÚsession_output_tokensÚsession_cache_read_tokensÚsession_cache_write_tokensu   ðŸ“Š **Session Token Usage**zModel: `r	  zInput tokens: ri  zCache read tokens: zCache write tokens: zOutput tokens: zTotal: zAPI calls: )ÚCanonicalUsageÚestimate_usage_cost)Úinput_tokensÚoutput_tokensÚcache_read_tokensÚcache_write_tokens)ra   rc   r¢  r_  r  ú$z.4fÚincludedzCost: includedr¤  r  z / rÔ  rž  z%)zCompressions: rÛ   r/  c                 ój   — g | ]0}|                      d ¦  «        dv ¯|                      d¦  «        ¯.|‘Œ1S )r©  rª  rÊ  rV  r®  s     r!   rÌ  z7GatewayRunner._handle_usage_command.<locals>.<listcomp>>  sB   € ÐfÐfÐf˜!¨!¯%ª%°©-¬-Ð;PÐ*PÐ*PÐUV×UZÒUZÐ[dÑUeÔUeÐ*P�AÐ*PÐ*PÐ*Pré   u   ðŸ“Š **Session Info**z
Messages: zEstimated context: ~r  z;_(Detailed usage available after the first agent response)_z)No usage data available for this session.)*r$  r*  r¤  r¸   rÀ  rÜ   r›  rè  r±  Úget_sessionrM  r·   rž  r¡  r   r   r  Úsession_api_callsÚget_rate_limit_stateÚhas_dataÚagent.rate_limit_trackerrr  rá   rb   rq  Úagent.usage_pricingrw  rx  Ú
amount_usdr¡  r³  r:  râ  ra  rç  Úcompression_countr¢  râ   ró  rp  rš  rÞ   )!r¿  rã   r$  rê   rq   rÚ  r  Úcachedra   rc   rd   Ú_entry_for_billingÚ	persistedÚaccount_linesÚaccount_snapshotre  Úrl_staterr  ry  rz  Ú
cache_readÚcache_writerw  rx  Úcost_resultr  r  Úpctr  rF  rš  r4  Úapproxs!                                    r!   rý  z#GatewayRunner._handle_usage_commandÅ  s©  è è € ð ”ˆØ×2Ò2°6Ñ:Ô:ˆð Ô$×(Ò(¨Ñ5Ô5ˆØð 	*˜Õ!8Ð8Ð8Ý! $Ð(;¸TÑBÔBˆKÝ˜T >°4Ñ8Ô8ˆFØð *˜vÐ1Ø ð *ð *Ø#ŸZšZ¨Ñ4Ô4�FØð *Ø & q¤	˜ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *ð 8=ÐoÀÕNeÐAeÐAe•7˜5 *¨dÑ3Ô3Ð3ÐkoˆØ7<ÐoÀÕNeÐAeÐAe•7˜5 *¨dÑ3Ô3Ð3ÐkoˆØ5:Ðm¸uÕLcÐ?cÐ?c•'˜% ¨DÑ1Ô1Ð1ÐimˆØð 	E�G D¨-¸Ñ>Ô>ÐJðØ%)Ô%7×%MÒ%MÈfÑ%UÔ%UÐ"Ø Ô,×8Ò8Ð9KÔ9VÑWÔWÐ]Ð[]�	�	øÝð ð ð Ø�	�	�	ðøøøàÐD 9§=¢=Ð1CÑ#DÔ#DˆHØÐD 9§=¢=Ð1CÑ#DÔ#DˆHð $&ˆØð 	\ð(Ý)0Ô):Ý'ØØ%Ø#ð	*ñ *ô *ð $ð $ð $ð $ð $ð $Ð Ð øõ ð (ð (ð (Ø#'Ð Ð Ð ð(øøøàð \Ý :Ð;KÐVZÐ [Ñ [Ô [�àñ =	$•W˜UÐ$:Ñ;Ô;ñ =	$ÀÔ@WÐZ[Ò@[Ñ@[ØˆEð ×1Ò1Ñ3Ô3ˆHØð !˜HÔ-ð !ØNÐNÐNÐNÐNÐNØ—’Ð]Ð8QÐ8QÐRZÑ8[Ô8[Ð]Ð]Ñ^Ô^Ð^Ø—’˜RÑ Ô Ð õ # 5Ð*@À!ÑDÔDÐIÈˆLÝ# EÐ+BÀAÑFÔFÐKÈ!ˆMÝ  Ð(CÀQÑGÔGÐLÈ1ˆJÝ! %Ð)EÀqÑIÔIÐNÈQˆKà�LŠLÐ7Ñ8Ô8Ð8Ø�LŠLÐ2 E¤KÐ2Ð2Ð2Ñ3Ô3Ð3Ø�LŠLÐ:¨,Ð:Ð:Ð:Ñ;Ô;Ð;Øð CØ—’ÐA°:ÐAÐAÐAÑBÔBÐBØð EØ—’ÐC°KÐCÐCÐCÑDÔDÐDØ�LŠLÐ<¨=Ð<Ð<Ð<Ñ=Ô=Ð=Ø�LŠLÐA 5Ô#=ÐAÐAÐAÑBÔBÐBØ�LŠLÐ@ uÔ'>Ð@Ð@ÑAÔAÐAðØSÐSÐSÐSÐSÐSÐSÐSØ1Ð1Ø”KØ"�NØ%1Ø&3Ø*4Ø+6ð	ñ ô õ % U¨J¸Ñ=Ô=Ý$ U¨J¸Ñ=Ô=ð
ñ 
ô 
�ð Ô)Ð5Ø$/Ô$6¸+Ò$EÐ$E˜S˜SÈ2�FØ—L’LÐ!V¨&Ð!VÐ!Vµ5¸Ô9OÑ3PÔ3PÐ!VÐ!VÐ!VÑWÔWÐWÐWØ Ô'¨:Ò5Ð5Ø—L’LÐ!1Ñ2Ô2Ð2øøÝð ð ð Ø�ðøøøð Ô*ˆCØÔ%ð kØUXÔUgÐn•c˜#˜sÔ5¸Ô8JÑJÈSÑPÑQÔQÐQÐmn�Ø—’Ði¨Ô)?ÐiÐiÐiÀcÔFXÐiÐiÐiÐ^aÐiÐiÐiÐiÑjÔjÐjØÔ$ð GØ—’ÐE¨cÔ.CÐEÐEÑFÔFÐFàð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+à—9’9˜UÑ#Ô#Ð#ð Ô*×@Ò@ÀÑHÔHˆØÔ$×4Ò4°]Ô5MÑNÔNˆØð 	$ØKÐKÐKÐKÐKÐKØfÐf˜wÐfÑfÔfˆDØ3Ð3°DÑ9Ô9ˆFà'Ø(�S ™YœYÐ(Ð(Ø8 vÐ8Ð8Ð8Ð8ØMð	ˆEð ð ,Ø—’˜RÑ Ô Ð Ø—’˜]Ñ+Ô+Ð+Ø—9’9˜UÑ#Ô#Ð#Øð 	,Ø—9’9˜]Ñ+Ô+Ð+Ø:Ð:sI   Á, BÂBÂBÄ;E ÅEÅEÆ#F6 Æ6GÇGÍ9B,P& Ð&
P3Ð2P3c              ƒ   ó   ‡‡	‡
‡K  — |                      ¦   «                              ¦   «         }t          j        dd|¦  «        }dŠ
dŠ|�r	|                     ¦   «         }d}|t          |¦  «        k     rà||         dk    rT|dz   t          |¦  «        k     r>	 t          ||dz            ¦  «        Š
n# t          $ r d||dz            › �cY S w xY w|d	z  }nm||         d
k    r'|dz   t          |¦  «        k     r||dz            Š|d	z  }n:||                              ¦   «         rt          ||         ¦  «        Š
|dz  }n|dz  }|t          |¦  «        k     °à	 ddl	m
Š	 ddlmŠ t          j        ¦   «         }ˆˆ	ˆ
ˆfd„}|                     d|¦  «        ƒ d{V —†S # t           $ r,}t"                               d|d¬¦  «         d|› �cY d}~S d}~ww xY w)z>Handle /insights command -- show usage insights and analytics.z'[\u2012\u2013\u2014\u2015](days|source)z--\1rK  Nr   z--daysr)   zInvalid --days value: r?  z--sourcery  )ÚInsightsEnginec                  ó²   •—  ‰¦   «         }  ‰| ¦  «        }|                      ‰‰¬¦  «        }|                     |¦  «        }|                      ¦   «          |S )N)Údaysr$  )ÚgenerateÚformat_gatewayr   )ÚdbÚengineÚreportrG  r”  rz  r–  r$  s       €€€€r!   Ú_run_insightsz=GatewayRunner._handle_insights_command.<locals>._run_insightsr  sW   ø€ Ø�Y‘[”[�Ø'˜¨Ñ+Ô+�ØŸš¨d¸6˜ÑBÔB�Ø×.Ò.¨vÑ6Ô6�Ø—’‘
”
�
Ø�ré   zInsights command error: %sTrÐ  zError generating insights: )ræ  ró   rl  rm  rô   rÞ   rµ  r™  Úisdigitr²  rz  Úagent.insightsr”  rž  rõ  r÷  r·   r³   rO  )r¿  rã   r­   rä   rå   rQ  rœ  rÁ  r”  rz  r–  r$  s           @@@@r!   rþ  z&GatewayRunner._handle_insights_commandN  s]  øøøøè è € à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ˆõ ŒvÐ@À'È4ÑPÔPˆàˆØˆð ñ 	Ø—J’J‘L”LˆEØˆAØ•c˜%‘j”j’.�.Ø˜”8˜xÒ'Ð'¨A°©EµC¸±J´JÒ,>Ð,>ðGÝ" 5¨¨Q©¤<Ñ0Ô0˜˜øÝ%ð Gð Gð GØF¸¸aÀ!¹e¼ÐFÐFÐFÐFÐFðGøøøà˜‘F�A�AØ˜1”X Ò+Ð+°°A±½¸E¹
¼
Ò0BÐ0BØ" 1 q¡5œ\�FØ˜‘F�A�AØ˜1”X×%Ò%Ñ'Ô'ð Ý˜u Qœx™=œ=�DØ˜‘F�A�Aà˜‘F�Að •c˜%‘j”j’.�.ð 	5Ø.Ð.Ð.Ð.Ð.Ð.Ø5Ð5Ð5Ð5Ð5Ð5åÔ+Ñ-Ô-ˆDðð ð ð ð ð ð ð ð ×-Ò-¨d°MÑBÔBÐBÐBÐBÐBÐBÐBÐBøÝð 	5ð 	5ð 	5Ý�LŠLÐ5°qÀ4ˆLÑHÔHÐHØ4°Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð	5øøøs1   ÂB/ Â/C
Ã	C
ÅAF Æ
GÆ!!GÇGÇGc              ƒ   óÒ  K  — t          j        ¦   «         }	 ddlm}m}m}m} |5  t          |                     ¦   «         ¦  «        }ddd¦  «         n# 1 swxY w Y   | 	                    d|¦  «        ƒ d{V —† | 	                    d|¦  «        ƒ d{V —†}|5  t          |                     ¦   «         ¦  «        }	ddd¦  «         n# 1 swxY w Y   |	|z
  }
||	z
  }|	|z  }dg}|r8| 
                    dd                     t          |¦  «        ¦  «        › �¦  «         |
r8| 
                    dd                     t          |
¦  «        ¦  «        › �¦  «         |r8| 
                    dd                     t          |¦  «        ¦  «        › �¦  «         |	s| 
                    d	¦  «         n6| 
                    d
t          |¦  «        › dt          |	¦  «        › d�¦  «         g }|
r8| 
                    dd                     t          |
¦  «        ¦  «        › �¦  «         |r8| 
                    dd                     t          |¦  «        ¦  «        › �¦  «         |r8| 
                    dd                     t          |¦  «        ¦  «        › �¦  «         |rt          |¦  «        › d�nd}|rd                     |¦  «        dz   nd}dd|› |› d�dœ}	 | j                             |j        ¦  «        }| j                             |j        |¦  «         n# t&          $ r Y nw xY wd                     |¦  «        S # t&          $ r*}t(                               d|¦  «         d|› �cY d}~S d}~ww xY w)zGHandle /reload-mcp command -- disconnect and reconnect all MCP servers.r   )Úshutdown_mcp_serversÚdiscover_mcp_toolsÚ_serversrË  Nu   ðŸ”„ **MCP Servers Reloaded**
u   â™»ï¸� Reconnected: rÕ  u   âž• Added: u   âž– Removed: zNo MCP servers connected.u   
ðŸ”§ z tool(s) available from z
 server(s)zAdded servers: zRemoved servers: zReconnected servers: z MCP tool(s) now availablezNo MCP tools availablez. rp   r«  z,[IMPORTANT: MCP servers have been reloaded. zD. The tool list for this conversation has been updated accordingly.]r­  rÛ   zMCP reload failed: %su   â�Œ MCP reload failed: )rž  rõ  Útools.mcp_toolr   r¡  r¢  rË  r½  r0  r÷  rá   râ   rÉ  rÞ   r›  rè  r$  r	  rM  r·   r³   r´   )r¿  rã   rQ  r   r¡  r¢  rË  Úold_serversÚ	new_toolsÚconnected_serversÚaddedÚremovedÚreconnectedre  Úchange_partsÚtool_summaryÚchange_detailÚ
reload_msgr  rÁ  s                       r!   rÿ  z(GatewayRunner._handle_reload_mcp_command  s‡  è è € åÔ'Ñ)Ô)ˆð>	1Ø`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`ð ð 3ð 3Ý! (§-¢-¡/¤/Ñ2Ô2�ð3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð
 ×&Ò& tÐ-AÑBÔBÐBÐBÐBÐBÐBÐBÐBð #×2Ò2°4Ð9KÑLÔLÐLÐLÐLÐLÐLÐLˆIð ð 9ð 9Ý$'¨¯ª©¬Ñ$8Ô$8Ð!ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð &¨Ñ3ˆEØ!Ð$5Ñ5ˆGØ+¨kÑ9ˆKà6Ð7ˆEØð VØ—’ÐT°D·I²I½fÀ[Ñ>QÔ>QÑ4RÔ4RÐTÐTÑUÔUÐUØð GØ—’ÐE¨4¯9ª9µV¸E±]´]Ñ+CÔ+CÐEÐEÑFÔFÐFØð KØ—’ÐI¨T¯YªYµv¸g±´Ñ-GÔ-GÐIÐIÑJÔJÐJØ$ð sØ—’Ð8Ñ9Ô9Ð9Ð9à—’Ðq¥s¨9¡~¤~ÐqÐqÍsÐSdÑOeÔOeÐqÐqÐqÑrÔrÐrð
 ˆLØð RØ×#Ò#Ð$P°d·i²iÅÀuÁÄÑ6NÔ6NÐ$PÐ$PÑQÔQÐQØð VØ×#Ò#Ð$T¸¿	º	Å&ÈÁ/Ä/Ñ8RÔ8RÐ$TÐ$TÑUÔUÐUØð ^Ø×#Ò#Ð$\¸D¿IºIÅfÈ[ÑFYÔFYÑ<ZÔ<ZÐ$\Ð$\Ñ]Ô]Ð]ØLUÐs�c )™nœnÐHÐHÐHÐHÐ[sˆLØ>JÐR˜DŸIšI lÑ3Ô3°dÑ:Ð:ÐPRˆMàð lÈ-ð  lÐYeð  lð  lð  lðð ˆJðØ $Ô 2× HÒ HÈÌÑ VÔ V�ØÔ"×7Ò7Ø!Ô,¨jñô ð ð øõ ð ð ð Ø�ðøøøð —9’9˜UÑ#Ô#Ð#øåð 	1ð 	1ð 	1Ý�NŠNÐ2°AÑ6Ô6Ð6Ø0¨QÐ0Ð0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð	1øøøs‰   —L2 ¥"AÁL2 ÁAÁL2 ÁAÁ=L2 Â"CÂ:L2 ÃC
Ã
L2 ÃC
ÃG>L2 Ë?L ÌL2 Ì
LÌL2 ÌLÌL2 Ì2
M&Ì<M!ÍM&Í!M&c              ƒ   óú  K  — |j         }|                      |¦  «        }ddlm}m}  ||¦  «        s'|| j        v r| j                             |¦  «         dS dS |                     ¦   «                              ¦   «          	                    ¦   «          
                    ¦   «         }d|v }d„ |D ¦   «         }t          d„ |D ¦   «         ¦  «        rd}	d	}
n"t          d
„ |D ¦   «         ¦  «        rd}	d}
nd}	d}
 |||	|¬¦  «        }|sdS | j                             |j        ¦  «        }|r|                     |j        ¦  «         |dk    rd|› d�nd}t"                               d||
¦  «         d|dk    rdnd› d|
› |› d�S )u  Handle /approve command â€” unblock waiting agent thread(s).

        The agent thread(s) are blocked inside tools/approval.py waiting for
        the user to respond.  This handler signals the event so the agent
        resumes and the terminal_tool executes the command inline â€” the same
        flow as the CLI's synchronous input() approval.

        Supports multiple concurrent approvals (parallel subagents,
        execute_code).  ``/approve`` resolves the oldest pending command;
        ``/approve all`` resolves every pending command at once.

        Usage:
            /approve              â€” approve oldest pending command once
            /approve all          â€” approve ALL pending commands at once
            /approve session      â€” approve oldest + remember for session
            /approve all session  â€” approve all + remember for session
            /approve always       â€” approve oldest + remember permanently
            /approve all always   â€” approve all + remember permanently
        r   ©Úresolve_gateway_approvalÚhas_blocking_approvaluQ   âš ï¸� Approval expired (agent is no longer waiting). Ask the agent to try again.zNo pending command to approve.rê  c                 ó   — g | ]
}|d k    ¯|‘ŒS )rê  r  ©r  r¶  s     r!   rÌ  z9GatewayRunner._handle_approve_command.<locals>.<listcomp>ì  s   € Ð3Ð3Ð3˜1¨¨Uª
¨
�Q¨
¨
¨
ré   c              3   ó   K  — | ]}|d v V — Œ	dS ))ÚalwaysÚ	permanentÚpermanentlyNr  r³  s     r!   r  z8GatewayRunner._handle_approve_command.<locals>.<genexpr>î  s(   è è € ÐNÐN¸qˆqÐ:Ð:ÐNÐNÐNÐNÐNÐNré   rµ  z (pattern approved permanently)c              3   ó   K  — | ]}|d v V — Œ	dS ))ÚsessionÚsesNr  r³  s     r!   r  z8GatewayRunner._handle_approve_command.<locals>.<genexpr>ñ  s(   è è € Ð<Ð<¨Q�Ð(Ð(Ð<Ð<Ð<Ð<Ð<Ð<ré   r¹  z$ (pattern approved for this session)Úoncerp   ©Úresolve_allr)   rÔ  ú
 commands)z4User approved %d dangerous command(s) via /approve%su   âœ… CommandrM  z	 approvedz. The agent is resuming...)r$  r*  r$  r°  r±  r­  rT  ræ  ró   rõ   rô   r  r‡  r¸   r  Úresume_typing_for_chatrC  r³   rÊ   )r¿  rã   r$  rê   r°  r±  r­   r½  Ú	remainingÚchoiceÚ	scope_msgrÎ  rˆ  Ú	count_msgs                 r!   rè  z%GatewayRunner._handle_approve_commandÈ  sÿ  è è € ð( ”ˆØ×2Ò2°6Ñ:Ô:ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð %Ð$ [Ñ1Ô1ð 	4Ø˜dÔ5Ð5Ð5ØÔ'×+Ò+¨KÑ8Ô8Ð8ØjÐjØ3Ð3ð ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7×=Ò=Ñ?Ô?ˆØ˜t�mˆØ3Ð3 Ð3Ñ3Ô3ˆ	åÐNÐNÀIÐNÑNÔNÑNÔNð 	ØˆFØ9ˆIˆIÝÐ<Ð<°)Ð<Ñ<Ô<Ñ<Ô<ð 	ØˆFØ>ˆIˆIàˆFØˆIà(Ð(¨°fÈ+ÐVÑVÔVˆØð 	4Ø3Ð3ð ”=×$Ò$ V¤_Ñ5Ô5ˆØð 	<Ø×+Ò+¨F¬NÑ;Ô;Ð;à.3°aªi¨iÐ*˜Ð*Ð*Ð*Ð*¸Rˆ	Ý�ŠÐJÈEÐS\Ñ]Ô]Ð]Øp E¨A¢I I˜S˜S°2ÐpÐpÀ	ÐpÈ9ÐpÐpÐpÐpré   c              ƒ   ó8  K  — |j         }|                      |¦  «        }ddlm}m}  ||¦  «        s'|| j        v r| j                             |¦  «         dS dS |                     ¦   «                              ¦   «          	                    ¦   «         }d|v } ||d|¬¦  «        }|sdS | j
                             |j        ¦  «        }	|	r|	                     |j        ¦  «         |dk    rd	|› d
�nd}
t                               d|¦  «         d|dk    rdnd› d|
› d�S )u  Handle /deny command â€” reject pending dangerous command(s).

        Signals blocked agent thread(s) with a 'deny' result so they receive
        a definitive BLOCKED message, same as the CLI deny flow.

        ``/deny`` denies the oldest; ``/deny all`` denies everything.
        r   r¯  u(   â�Œ Command denied (approval was stale).zNo pending command to deny.rê  r”  r¼  r)   rÔ  r¾  rp   z-User denied %d dangerous command(s) via /denyu   â�Œ CommandrM  z deniedrZ   )r$  r*  r$  r°  r±  r­  rT  ræ  ró   rõ   r‡  r¸   r  r¿  rC  r³   rÊ   )r¿  rã   r$  rê   r°  r±  r­   r½  rÎ  rˆ  rÃ  s              r!   ré  z"GatewayRunner._handle_deny_command  sv  è è € ð ”ˆØ×2Ò2°6Ñ:Ô:ˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð %Ð$ [Ñ1Ô1ð 	1Ø˜dÔ5Ð5Ð5ØÔ'×+Ò+¨KÑ8Ô8Ð8ØAÐAØ0Ð0à×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/×5Ò5Ñ7Ô7ˆØ˜t�mˆà(Ð(¨°fÈ+ÐVÑVÔVˆØð 	1Ø0Ð0ð ”=×$Ò$ V¤_Ñ5Ô5ˆØð 	<Ø×+Ò+¨F¬NÑ;Ô;Ð;à.3°aªi¨iÐ*˜Ð*Ð*Ð*Ð*¸Rˆ	Ý�ŠÐCÀUÑKÔKÐKØJ E¨A¢I I˜S˜S°2ÐJÐJ¸iÐJÐJÐJÐJré   c              ƒ   ó¤   ‡‡‡‡‡	‡
K  — ddl }ddlmŠmŠ	mŠ
mŠmŠmŠ  |j        ¦   «         }ˆˆˆˆˆ	ˆ
fd„}| 	                    d|¦  «        ƒ d{V —†S )u6  Handle /debug â€” upload debug report (summary only) and return paste URLs.

        Gateway uploads ONLY the summary report (system info + log tails),
        NOT full log files, to protect conversation privacy.  Users who need
        full log uploads should use ``hermes debug share`` from the CLI.
        r   N)Ú_capture_dumpÚcollect_debug_reportÚupload_to_pastebinÚ_schedule_auto_deleteÚ_GATEWAY_PRIVACY_NOTICEÚ!_best_effort_sweep_expired_pastesc                  óx  •—  ‰	¦   «           ‰
¦   «         }  ‰d| ¬¦  «        }i }	  ‰|¦  «        |d<   n# t           $ r}d|› �cY d }~S d }~ww xY w ‰t          |                     ¦   «         ¦  «        ¦  «         ‰dddg}t          d„ |D ¦   «         ¦  «        }|                     ¦   «         D ]$\  }}|                     d|d	|› �›d
|› �¦  «         Œ%|                     d¦  «         |                     d¦  «         |                     d¦  «         |                     d¦  «         d                     |¦  «        S )NéÈ   )Ú	log_linesÚ	dump_textÚReportu#   âœ— Failed to upload debug report: rp   z**Debug report uploaded:**c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rr  r�  )r  r+  s     r!   r  zSGatewayRunner._handle_debug_command.<locals>._collect_and_upload.<locals>.<genexpr>S  s(   è è € Ð3Ð3¨�c !™fœfÐ3Ð3Ð3Ð3Ð3Ð3ré   r	  Ú<z`  u'   â�± Pastes will auto-delete in 6 hours.z<For full log uploads, use `hermes debug share` from the CLI.z3Share these links with the Hermes team for support.rÛ   )r·   r¹   r  rÜ  rò  rá   râ   )rÏ  r›  Úurlsr½   re  Úlabel_widthr  ræ   rÊ  rË  rÆ  rÉ  rÇ  rÈ  s           €€€€€€r!   Ú_collect_and_uploadz@GatewayRunner._handle_debug_command.<locals>._collect_and_uploadD  s�  ø€ Ø-Ð-Ñ/Ô/Ð/Ø%˜™œˆIØ)Ð)°CÀ9ÐMÑMÔMˆFàˆDðCØ!3Ð!3°FÑ!;Ô!;��X‘�øÝð Cð Cð CØB¸SÐBÐBÐBÐBÐBÐBÐBÐBøøøøðCøøøð "Ð!¥$ t§{¢{¡}¤}Ñ"5Ô"5Ñ6Ô6Ð6à,¨bÐ2NÐPRÐSˆEÝÐ3Ð3¨dÐ3Ñ3Ô3Ñ3Ô3ˆKØ"Ÿjšj™lœlð Að A‘
��sØ—’Ð? Ð?¨Ð?Ð?Ð?Ð?¸#Ð?Ð?Ñ@Ô@Ð@Ð@à�LŠL˜ÑÔÐØ�LŠLÐBÑCÔCÐCØ�LŠLÐWÑXÔXÐXØ�LŠLÐNÑOÔOÐOØ—9’9˜UÑ#Ô#Ð#s   ¦5 µ
A¿A	ÁAÁ	A)
rž  Úhermes_cli.debugrÆ  rÇ  rÈ  rÉ  rÊ  rË  rõ  r÷  )r¿  rã   rž  rQ  rÕ  rÊ  rË  rÆ  rÉ  rÇ  rÈ  s        @@@@@@r!   r   z#GatewayRunner._handle_debug_command3  sÖ   øøøøøøè è € ð 	ˆˆˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð (ˆwÔ'Ñ)Ô)ˆð	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð2 ×)Ò)¨$Ð0CÑDÔDÐDÐDÐDÐDÐDÐDÐDré   c           
   ƒ   óx  K  — ddl }ddl}ddl}ddlm} ddlm}m} |j        j        }|| j	        vrdS  |¦   «         rd |d¦  «        › �S t          t          ¦  «        j        j                             ¦   «         }	|	dz  }
|
                     ¦   «         sd	S t          ¦   «         }|s	 d
S t           dz  }t           dz  }t           dz  }|                      |j        ¦  «        }|j        j        j        |j        j        |j        j        | |j        ¦   «                              ¦   «         dœ}|                     d¦  «        }|                      |j        |¦  «        ¦  «         |                     |¦  «         |                     d¬¦  «         d                     d„ |D ¦   «         ¦  «        }d|› dt;          j        t?          |¦  «        ¦  «        › dt;          j        t?          |¦  «        ¦  «        › �}	 |                      d¦  «        }|r(| !                    |dd|g|j"        |j"        d¬¦  «         n&| !                    dd|g|j"        |j"        d¬¦  «         nH# tF          $ r;}|                     d¬¦  «         |                     d¬¦  «         d|› �cY d}~S d}~ww xY w|  $                    ¦   «          dS )us  Handle /update command â€” update Hermes Agent to the latest version.

        Spawns ``hermes update`` in a detached session (via ``setsid``) so it
        survives the gateway restart that ``hermes update`` may trigger. Marker
        files are written so either the current gateway process or the next one
        can notify the user when the update finishes.
        r   Nr   )Ú
is_managedÚformat_managed_messageu^   âœ— /update is only available from messaging platforms. Run `hermes update` from the terminal.u   âœ— zupdate Hermes Agentr   u+   âœ— Not a git repository â€” cannot update.uØ   âœ— Could not locate the `hermes` command. Hermes is running, but the update command could not find the executable on PATH or via the current Python interpreter. Try running `hermes update` manually in your terminal.r“  ú.update_output.txtú.update_exit_code)r  rC  rp  rê   rÞ  r˜  Tr,  rñ   c              3   ó>   K  — | ]}t          j        |¦  «        V — Œd S rr  r7  r  s     r!   r  z7GatewayRunner._handle_update_command.<locals>.<genexpr>œ  s,   è è € Ð!KÐ!K¸¥%¤+¨dÑ"3Ô"3Ð!KÐ!KÐ!KÐ!KÐ!KÐ!Kré   zPYTHONUNBUFFERED=1 z update --gateway > z* 2>&1; status=$?; printf '%s' "$status" > r9  r:  ú-cr;  u   âœ— Failed to start update: u8   âš• Starting Hermes updateâ€¦ I'll stream progress here.)%rÔ  r1  r?  r   r³  rØ  rÙ  r$  r  Ú_UPDATE_ALLOWED_PLATFORMSr   r  r  r  r   r:  rÅ   r*  r!  rC  rp  rå  r  rÛ  rû  rü  r
  r0  râ   r˜  r8  rò   r2  rA  rB  r·   r¨  )r¿  rã   rÔ  r1  r?  r   rØ  rÙ  r  Úproject_rootÚgit_dirrC  Úpending_pathr•  Úexit_code_pathrê   ÚpendingÚ_tmp_pendingÚhermes_cmd_strÚ
update_cmdrG  rÁ  s                         r!   rñ  z$GatewayRunner._handle_update_command_  sm  è è € ð 	ˆˆˆØˆˆˆØÐÐÐØ%Ð%Ð%Ð%Ð%Ð%ØHÐHÐHÐHÐHÐHÐHÐHð ”<Ô(ˆØ˜4Ô9Ð9Ð9ØsÐsàˆ:‰<Œ<ð 	JØIÐ0Ð0Ð1FÑGÔGÐIÐIÐIå�H‘~”~Ô,Ô3×;Ò;Ñ=Ô=ˆØ Ñ'ˆà�~Š~ÑÔð 	AØ@Ð@å(Ñ*Ô*ˆ
Øð 	ðIðð õ $Ð&<Ñ<ˆÝ"Ð%9Ñ9ˆÝ%Ð(;Ñ;ˆØ×2Ò2°5´<Ñ@Ô@ˆàœÔ-Ô3Ø”|Ô+Ø”|Ô+Ø&Ø%˜œ™œ×1Ò1Ñ3Ô3ð
ð 
ˆð $×/Ò/°Ñ7Ô7ˆØ×Ò 
 ¤
¨7Ñ 3Ô 3Ñ4Ô4Ð4Ø×Ò˜\Ñ*Ô*Ð*Ø×Ò¨ÐÑ.Ô.Ð.ð ŸšÐ!KÐ!KÀ
Ð!KÑ!KÔ!KÑKÔKˆðW .ð Wð WÝ”+�c +Ñ.Ô.Ñ/Ô/ðWð Wå49´KÅÀNÑ@SÔ@SÑ4TÔ4TðWð Wð 	ð
	6ØŸš hÑ/Ô/ˆJØð à× Ò Ø ¨¨zÐ:Ø%Ô-Ø%Ô-Ø&*ð	 !ñ ô ð ð ð × Ò Ø˜T :Ð.Ø%Ô-Ø%Ô-Ø&*ð	 !ñ ô ð øøõ ð 	6ð 	6ð 	6Ø×Ò¨4ÐÑ0Ô0Ð0Ø×!Ò!¨TÐ!Ñ2Ô2Ð2Ø5°!Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð	6øøøð
 	×0Ò0Ñ2Ô2Ð2ØIÐIs   Ç8A%I É
J#É(0JÊJ#ÊJ#c                 ó  — t          | dd¦  «        }|r|                     ¦   «         sdS 	 t          j        |                      ¦   «         ¦  «        | _        dS # t          $ r t                               d¦  «         Y dS w xY w)z;Ensure a background task is watching for update completion.Ú_update_notification_taskNz;Skipping update notification watcher: no running event loop)	rÜ   r±  rž  rT  Ú_watch_update_progressrè  r¶   r³   rË   )r¿  Úexisting_tasks     r!   r¨  z1GatewayRunner._schedule_update_notification_watch¼  s¡   € å Ð&AÀ4ÑHÔHˆØð 	 ×!3Ò!3Ñ!5Ô!5ð 	ØˆFð	XÝ-4Ô-@Ø×+Ò+Ñ-Ô-ñ.ô .ˆDÔ*Ð*Ð*øõ ð 	Xð 	Xð 	XÝ�LŠLÐVÑWÔWÐWÐWÐWÐWð	Xøøøs   «+A Á$B Á?B ç       @ç      @ç      œ@Úpoll_intervalÚstream_intervalc              ƒ   ó$  ‡‡‡‡‡ ‡!K  — t           dz  }t           dz  }t           dz  }t           dz  }t           dz  }t          j        ¦   «         Š!‰!                     ¦   «         |z   }	dŠdŠd}
||fD ]Ä}|                     ¦   «         r®	 t          j        |                     ¦   «         ¦  «        }|                     d¦  «        }|                     d¦  «        Š|                     d	¦  «        }
|r4‰r2t          |¦  «        }| j
                             |¦  «        Š|
s|› d
‰› �}
 n# t          $ r Y ŒÀw xY wŒÅ‰r‰�sQt                               d¦  «         |                     ¦   «         s|                     ¦   «         r¢‰!                     ¦   «         |	k     rŠ|                     ¦   «         r|                      ¦   «         ƒ d{V —† dS t          j        |¦  «        ƒ d{V —† |                     ¦   «         s|                     ¦   «         r‰!                     ¦   «         |	k     °Š|                     ¦   «         s|                     ¦   «         rC|                     ¦   «         s/|                     d¦  «         |                      ¦   «         ƒ d{V —† dS dt"          dt"          fd„Šd}‰!                     ¦   «         Š dŠd*ˆˆˆˆˆ ˆ!fd„}‰!                     ¦   «         |	k     �r[|                     ¦   «         �r­|                     ¦   «         rU	 |                     ¦   «         }t%          |¦  «        |k    r‰||d…         z  Št%          |¦  «        }n# t&          $ r Y nw xY w |¦   «         ƒ d{V —† 	 |                     ¦   «                              ¦   «         pd}t+          |¦  «        }|dk    r‰                     ‰d¦  «        ƒ d{V —† n/‰                     ‰d                     |¦  «        ¦  «        ƒ d{V —† t                               d||
¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|||||fD ]}|                     d¬¦  «         Œt           dz                       d¬¦  «         | j                             |
d¦  «         dS |                     ¦   «         rU	 |                     ¦   «         }t%          |¦  «        |k    r‰||d…         z  Št%          |¦  «        }n# t&          $ r Y nw xY w‰                     ¦   «         r+‰!                     ¦   «         ‰ z
  |k    r |¦   «         ƒ d{V —† |                     ¦   «         �r©|
�r¦| j                             |
¦  «        �s‹	 t          j        |                     ¦   «         ¦  «        }|                     dd¦  «        }|                     dd¦  «        }|r÷ |¦   «         ƒ d{V —† d}t9          t;          ‰¦  «        dd¦  «        �U	 ‰                     ‰|||
¬¦  «        ƒ d{V —† d}n2# t          $ r%}t                               d |¦  «         Y d}~nd}~ww xY w|s,|rd!|› d"�nd}‰                     ‰d#|› |› d$�¦  «        ƒ d{V —† d| j        |
<   |                     d¬¦  «         t                               d%|
|dd&…         ¦  «         n># t
          j         t&          f$ r%}t                               d'|¦  «         Y d}~nd}~ww xY wt          j        |¦  «        ƒ d{V —† ‰!                     ¦   «         |	k     �°[|                     ¦   «         sÉt                               d(|¦  «         |                     d¦  «          |¦   «         ƒ d{V —† 	 ‰                     ‰d)¦  «        ƒ d{V —† n# t          $ r Y nw xY w|||||fD ]}|                     d¬¦  «         Œt           dz                       d¬¦  «         | j                             |
d¦  «         dS dS )+a»  Watch ``hermes update --gateway``, streaming output + forwarding prompts.

        Polls ``.update_output.txt`` for new content and sends chunks to the
        user periodically.  Detects ``.update_prompt.json`` (written by the
        update process when it needs user input) and forwards the prompt to
        the messenger.  The user's next message is intercepted by
        ``_handle_message`` and written to ``.update_response``.
        r“  r”  rÚ  rÛ  z.update_prompt.jsonNr  rC  rê   r<  zOUpdate watcher: cannot resolve adapter/chat_id, falling back to completion-onlyÚ124r]  r   c                 ó.   — t          j        dd| ¦  «        S )Nz\x1b\[[0-9;]*[A-Za-z]rp   )rl  rm  r�  s    r!   Ú_strip_ansiz9GatewayRunner._watch_update_progress.<locals>._strip_ansi  s   € Ý”6Ð2°B¸Ñ=Ô=Ð=ré   r   rp   c               “   ó¸  •‡‡K  — ‰                      ¦   «         sdŠdS  ‰‰¦  «                              ¦   «         ŠdŠ‰
                     ¦   «         Š	‰sdS dŠˆˆfd„t          dt          ‰¦  «        ‰¦  «        D ¦   «         } | D ]U}	 ‰                     ‰d|› d�¦  «        ƒ d{V —† Œ$# t
          $ r%}t                               d|¦  «         Y d}~ŒNd}~ww xY wdS )	z!Send buffered output to the user.rp   Né¬  c                 ó*   •— g | ]}‰||‰z   …         ‘ŒS r  r  )r  rå   ÚcleanÚ	max_chunks     €€r!   rÌ  zOGatewayRunner._watch_update_progress.<locals>._flush_buffer.<locals>.<listcomp>  s&   ø€ ÐVÐVÐV°�e˜A˜a )™m˜OÔ,ÐVÐVÐVré   r   z```
ú
```zUpdate stream send failed: %s)ró   rV  rÎ  rÞ   r	  r·   r³   rË   )ÚchunksÚchunkrÁ  r÷  rø  ró  rí   ÚbufferrC  Úlast_stream_timerQ  s      @@€€€€€€r!   Ú_flush_bufferz;GatewayRunner._watch_update_progress.<locals>._flush_buffer	  s2  øøøè è € ð —<’<‘>”>ð Ø�Ø�à�K Ñ'Ô'×-Ò-Ñ/Ô/ˆEØˆFØ#Ÿyšy™{œ{ÐØð Ø�àˆIØVÐVÐVÐVÐVµe¸A½sÀ5¹z¼zÈ9Ñ6UÔ6UÐVÑVÔVˆFØð Eð E�ðEØ!Ÿ,š, wÐ0D¸Ð0DÐ0DÐ0DÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEøÝ ð Eð Eð EÝ—L’LÐ!@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøðEøøøðEð Es   Â B(Â(
CÂ2CÃCrŒ   u   âœ… Hermes update finished.u(   â�Œ Hermes update failed (exit code {}).z&Update finished (exit=%s), notified %sz$Update final notification failed: %sTr,  r—  r‘  r+  FÚsend_update_prompt)rC  r‘  r+  rê   z%Button-based update prompt failed: %sz (default: rÖ  u"   âš• **Update needs your input:**

zG

Reply `/approve` (yes) or `/deny` (no), or type your answer directly.z!Forwarded update prompt to %s: %srŒ  z Failed to read update prompt: %sz$Update watcher timed out after %.0fsu-   â�Œ Hermes update timed out after 30 minutes.rS  )!rÅ   rž  rõ  rV  r   rÔ  rÕ  rî  r¸   r�   r‡  r·   r³   r´   r§  rü  rû  rò   rÞ   rñ  ró   rµ  r	  ÚformatrÊ   r0  r¯  rT  rÜ   rK  rÿ  rË   rð  )"r¿  rî  rï  r6   rá  Úclaimed_pathr•  râ  Úprompt_pathrþ  rê   r   rã  r  r  Ú
bytes_sentrþ  rÊ  Úexit_code_rawr#  rÁ  rË  Úprompt_dataÚprompt_textr+  Úsent_buttonsÚbtn_errÚdefault_hintró  rí   rü  rC  rý  rQ  s"                               @@@@@@r!   ré  z$GatewayRunner._watch_update_progressÉ  s.
  øøøøøøè è € õ $Ð&<Ñ<ˆÝ#Ð&DÑDˆÝ"Ð%9Ñ9ˆÝ%Ð(;Ñ;ˆÝ"Ð%:Ñ:ˆåÔ'Ñ)Ô)ˆØ—9’9‘;”; Ñ(ˆð ˆØˆØˆØ! <Ð0ð 	ð 	ˆDØ�{Š{‰}Œ}ð ðÝ"œj¨¯ªÑ)9Ô)9Ñ:Ô:�GØ#*§;¢;¨zÑ#:Ô#:�LØ%Ÿkšk¨)Ñ4Ô4�GØ")§+¢+¨mÑ"<Ô"<�KØ#ð F¨ð FÝ#+¨LÑ#9Ô#9˜Ø"&¤-×"3Ò"3°HÑ"=Ô"=˜à*ð FØ-9Ð*EÐ*E¸GÐ*EÐ*E˜KØ�EøÝ ð ð ð Ø�Dðøøøðð  ð 	˜gñ 	Ý�NŠNÐlÑmÔmÐmà×&Ò&Ñ(Ô(ð 3¨L×,?Ò,?Ñ,AÔ,Að 3ÀtÇyÂyÁ{Ä{ÐU]ÒG]ÐG]Ø!×(Ò(Ñ*Ô*ð Ø×8Ò8Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ø�FÝ”m MÑ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð	  ×&Ò&Ñ(Ô(ð 3¨L×,?Ò,?Ñ,AÔ,Að 3ÀtÇyÂyÁ{Ä{ÐU]ÒG]ÐG]ð
 ×#Ò#Ñ%Ô%ð 7¨×)<Ò)<Ñ)>Ô)>ð 7È×H]ÒH]ÑH_ÔH_ð 7Ø×)Ò)¨%Ñ0Ô0Ð0Ø×4Ò4Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØˆFð	>�cð 	>¥cð 	>ð 	>ð 	>ð 	>ð ˆ
ØŸ9š9™;œ;ÐØˆð	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð* �iŠi‰kŒk˜HÒ$Ñ$à×$Ò$Ñ&Ô&ñ à×%Ò%Ñ'Ô'ð ðØ"-×"7Ò"7Ñ"9Ô"9˜Ý˜w™<œ<¨*Ò4Ð4Ø" g¨j¨k¨kÔ&:Ñ:˜FÝ),¨W©¬˜JøøÝ"ð ð ð Ø˜ðøøøà#�m‘o”oÐ%Ð%Ð%Ð%Ð%Ð%Ð%ð	NØ$2×$<Ò$<Ñ$>Ô$>×$DÒ$DÑ$FÔ$FÐ$MÈ#�MÝ # MÑ 2Ô 2�IØ  A’~�~Ø%Ÿlšl¨7Ð4QÑRÔRÐRÐRÐRÐRÐRÐRÐRÐRà%Ÿlšl¨7Ð4^×4eÒ4eÐfoÑ4pÔ4pÑqÔqÐqÐqÐqÐqÐqÐqÐqÝ—K’KÐ HÈ)ÐU`ÑaÔaÐaÐaøÝ ð Nð Nð NÝ—N’NÐ#IÈ1ÑMÔMÐMÐMÐMÐMÐMÐMøøøøðNøøøð '¨°kØ(¨+ð7ð .ð .�Aà—H’H¨�HÑ-Ô-Ð-Ð-ÝÐ 2Ñ2×:Ò:ÀdÐ:ÑKÔKÐKØÔ+×/Ò/°¸TÑBÔBÐBØ�ð ×!Ò!Ñ#Ô#ð ðØ)×3Ò3Ñ5Ô5�GÝ˜7‘|”| jÒ0Ð0Ø '¨*¨+¨+Ô"6Ñ6˜Ý%(¨¡\¤\˜
øøÝð ð ð Ø�Dðøøøð �|Š|‰~Œ~ð & 4§9¢9¡;¤;Ð1AÑ#AÀoÒ"UÐ"UØ#�m‘o”oÐ%Ð%Ð%Ð%Ð%Ð%Ð%ð ×"Ò"Ñ$Ô$ñ (H¨ñ (HØ Ô7×;Ò;¸KÑHÔHñ(Hð&HÝ"&¤*¨[×-BÒ-BÑ-DÔ-DÑ"EÔ"E�KØ"-§/¢/°(¸BÑ"?Ô"?�KØ)Ÿošo¨i¸Ñ<Ô<�GØ"ð  hð ,˜m™oœoÐ-Ð-Ð-Ð-Ð-Ð-Ð-à',˜Ý"¥4¨¡=¤=Ð2FÈÑMÔMÐYð	_Ø&-×&@Ò&@Ø,3Ø+6Ø,3Ø0;ð	 'Añ '"ô '"ð !"ð !"ð !"ð !"ð !"ð !"ð !"ð 04  øÝ#,ð _ð _ð _Ý &§¢Ð-TÐV]Ñ ^Ô ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^øøøøð_øøøà+ð ØGNÐ+VÐ+C¸Ð+CÐ+CÐ+CÐ+CÐTV˜LØ")§,¢,Ø 'ð!AØ#.ð!AØ0<ð!Að !Að !Añ#ô #ð ð ð ð ð ð ð ð DH˜Ô3°KÑ@ð
 $×*Ò*°dÐ*Ñ;Ô;Ð;ÝŸšÐ$GÈÐVaÐbeÐceÐbeÔVfÑgÔgÐgøøÝÔ,­gÐ6ð Hð Hð HÝ—L’LÐ!CÀQÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøõ ”- Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð} �iŠi‰kŒk˜HÒ$Ñ$ðB ×$Ò$Ñ&Ô&ð 	?Ý�NŠNÐAÀ7ÑKÔKÐKØ×%Ò% eÑ,Ô,Ð,Ø�-‘/”/Ð!Ð!Ð!Ð!Ð!Ð!Ð!ðØ—l’l 7Ð,[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\øÝð ð ð Ø�ðøøøà" L°+Ø$ kð3ð *ð *�à—’ D�Ñ)Ô)Ð)Ð)ÝÐ.Ñ.×6Ò6À$Ð6ÑGÔGÐGØÔ'×+Ò+¨K¸Ñ>Ô>Ð>Ð>Ð>ð	?ð 	?s¨   ÂBD#Ä#
D0Ä/D0ÌAM Í
MÍMÍ'B%P Ð
P<ÐP7Ð7P<Ò/AS3 Ó3
T Ó?T Õ6B[ ×;!X Ø[ Ø
YØ'YÙ[ ÙYÙA5[ Û[=Û[8Û8[=Þ^% Þ%
^2Þ1^2c              ƒ   ó"	  K  — t           dz  }t           dz  }t           dz  }t           dz  }|                     ¦   «         s|                     ¦   «         sdS d}|}	 |                     ¦   «         rš	 |                     |¦  «         nö# t          $ rv |                     ¦   «         s_Y |rZ|                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         dS dS Y nww xY w|                     ¦   «         s_	 |rZ|                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         dS dS t          j        |                     ¦   «         ¦  «        }|                     d¦  «        }|                     d	¦  «        }	|                     ¦   «         s’t           
                    d
¦  «         d}|}|                     |¦  «         	 |rZ|                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         dS dS |                     ¦   «                              ¦   «         pd}
t          |
¦  «        }d}|                     ¦   «         r|                     ¦   «         }t          |¦  «        }| j                             |¦  «        }|r¤|	r¢t          j        dd|¦  «                             ¦   «         }|r4t#          |¦  «        dk    rd|dd…         z   }|dk    rd|› d�}nd|› d�}n|dk    rd}nd}|                     |	|¦  «        ƒ d{V —† t           
                    d||	|¦  «         n2# t&          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w|rX|                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         n`# |rY|                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         |                     d¬¦  «         w w xY wdS )a„  If an update finished, notify the user.

        Returns False when the update is still running so a caller can retry
        later. Returns True after a definitive send/skip decision.

        This is the legacy notification path used when the streaming watcher
        cannot resolve the adapter (e.g. after a gateway restart where the
        platform hasn't reconnected yet).
        r“  r”  rÚ  rÛ  FTr,  r  rC  z2Update notification deferred: update still runningrŒ   rp   z\x1b\[[0-9;]*mrõ  r™  iTòÿÿNr   u!   âœ… Hermes update finished.

```
rù  u   â�Œ Hermes update failed.

```
u(   âœ… Hermes update finished successfully.u]   â�Œ Hermes update failed. Check the gateway logs or run `hermes update` manually for details.z0Sent post-update notification to %s:%s (exit=%s)z#Post-update notification failed: %s)rÅ   r   r
  rï  r0  rÔ  rÕ  rî  r¸   r³   rÊ   ró   rµ  r�   r‡  rl  rm  rÞ   r	  r·   r´   )r¿  rá  r	  r•  râ  ÚcleanupÚactive_pending_pathrã  r  rC  r	  r#  rS  r  rí   r  rÁ  s                    r!   r§  z'GatewayRunner._send_update_notification�  su  è è € õ $Ð&<Ñ<ˆÝ#Ð&DÑDˆÝ"Ð%9Ñ9ˆÝ%Ð(;Ñ;ˆà×"Ò"Ñ$Ô$ð 	¨\×-@Ò-@Ñ-BÔ-Bð 	Ø�5àˆØ*Ðð>	7Ø×"Ò"Ñ$Ô$ð ð$Ø ×(Ò(¨Ñ6Ô6Ð6Ð6øÝ(ð $ð $ð $Ø'×.Ò.Ñ0Ô0ð $Ø#ðh ð 7Ø#×*Ò*°dÐ*Ñ;Ô;Ð;Ø×#Ò#¨tÐ#Ñ4Ô4Ð4Ø×"Ò"¨dÐ"Ñ3Ô3Ð3Ø×%Ò%°Ð%Ñ6Ô6Ð6Ð6Ð6ð	7ð 7ðk$ð $ð$øøøð "×(Ò(Ñ*Ô*ð Øðd ð 7Ø#×*Ò*°dÐ*Ñ;Ô;Ð;Ø×#Ò#¨tÐ#Ñ4Ô4Ð4Ø×"Ò"¨dÐ"Ñ3Ô3Ð3Ø×%Ò%°Ð%Ñ6Ô6Ð6Ð6Ð6ð	7ð 7õa ”j ×!7Ò!7Ñ!9Ô!9Ñ:Ô:ˆGØ"Ÿ;š; zÑ2Ô2ˆLØ—k’k )Ñ,Ô,ˆGà!×(Ò(Ñ*Ô*ð Ý—’ÐPÑQÔQÐQØ�Ø&2Ð#Ø×$Ò$ \Ñ2Ô2Ð2ØðN ð 7Ø#×*Ò*°dÐ*Ñ;Ô;Ð;Ø×#Ò#¨tÐ#Ñ4Ô4Ð4Ø×"Ò"¨dÐ"Ñ3Ô3Ð3Ø×%Ò%°Ð%Ñ6Ô6Ð6Ð6Ð6ð	7ð 7ðK +×4Ò4Ñ6Ô6×<Ò<Ñ>Ô>ÐEÀ#ˆMÝ˜MÑ*Ô*ˆIð ˆFØ×!Ò!Ñ#Ô#ð 1Ø$×.Ò.Ñ0Ô0�õ   Ñ-Ô-ˆHØ”m×'Ò'¨Ñ1Ô1ˆGàð ˜7ð åœÐ 1°2°vÑ>Ô>×DÒDÑFÔF�Øð ~Ý˜6‘{”{ TÒ)Ð)Ø!&¨°°°¬Ñ!7˜Ø  A’~�~ØRÀVÐRÐRÐR˜˜àPÀ6ÐPÐPÐP˜˜à  A’~�~ØH˜˜à}˜Ø—l’l 7¨CÑ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ý—’ØFØ ØØñ	ô ð øøõ ð 	Eð 	Eð 	EÝ�NŠNÐ@À!ÑDÔDÐDÐDÐDÐDÐDÐDøøøøð	Eøøøð ð 7Ø#×*Ò*°dÐ*Ñ;Ô;Ð;Ø×#Ò#¨tÐ#Ñ4Ô4Ð4Ø×"Ò"¨dÐ"Ñ3Ô3Ð3Ø×%Ò%°Ð%Ñ6Ô6Ð6øøð	 ð 7Ø#×*Ò*°dÐ*Ñ;Ô;Ð;Ø×#Ò#¨tÐ#Ñ4Ô4Ð4Ø×"Ò"¨dÐ"Ñ3Ô3Ð3Ø×%Ò%°Ð%Ñ6Ô6Ð6Ð6ð	7øøøð ˆtsi   ÁN" Á/B ÂN" ÂDÂ#N" ÄN" ÄDÄN" Å;BN" É1D0N" Î!P/ Î"
OÎ,OÏP/ ÏOÏP/ Ð/ARc              ƒ   óZ  K  — t           dz  }|                     ¦   «         sdS 	 t          j        |                     ¦   «         ¦  «        }|                     d¦  «        }|                     d¦  «        }|                     d¦  «        }|r|s	 |                     d¬¦  «         dS t          |¦  «        }| j                             |¦  «        }|s4t           
                    d|¦  «         	 |                     d¬¦  «         dS |rd|ind}|                     |d	|¬
¦  «        ƒ d{V —† t                               d||¦  «         n2# t          $ r%}	t                               d|	¦  «         Y d}	~	nd}	~	ww xY w|                     d¬¦  «         dS # |                     d¬¦  «         w xY w)zANotify the chat that initiated /restart that the gateway is back.rÇ  Nr  rC  rF  Tr,  z6Restart notification skipped: %s adapter not connectedu;   â™» Gateway restarted successfully. Your session continues.r  z"Sent restart notification to %s:%szRestart notification failed: %s)rÅ   r   rÔ  rÕ  rî  r¸   r0  r�   r‡  r³   rË   r	  rÊ   r·   r´   )
r¿  Únotify_pathró  r  rC  rF  r  rí   rÌ  rÁ  s
             r!   r©  z(GatewayRunner._send_restart_notificationã  s  è è € å"Ð%;Ñ;ˆØ×!Ò!Ñ#Ô#ð 	ØˆFð 	0Ý”:˜k×3Ò3Ñ5Ô5Ñ6Ô6ˆDØŸ8š8 JÑ/Ô/ˆLØ—h’h˜yÑ)Ô)ˆGØŸš Ñ-Ô-ˆIàð  wð Øð2 ×Ò¨$ÐÑ/Ô/Ð/Ð/Ð/õ/   Ñ-Ô-ˆHØ”m×'Ò'¨Ñ1Ô1ˆGØð Ý—’ØLØ ñô ð ð ð  ×Ò¨$ÐÑ/Ô/Ð/Ð/Ð/ð 4=ÐF˜ YÐ/Ð/À$ˆHØ—,’,ØØMØ!ð ñ ô ð ð ð ð ð ð ð õ
 �KŠKØ4ØØñô ð ð øõ
 ð 	Að 	Að 	AÝ�NŠNÐ<¸aÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøð ×Ò¨$ÐÑ/Ô/Ð/Ð/Ð/øˆK×Ò¨$ÐÑ/Ô/Ð/Ð/øøøs>   ¤A)E Â&AE ÄAE ÅF Å
E7ÅE2Å-F Å2E7Å7F ÆF*rÐ  c           
      ód  — ddl m}  ||j        j        j        |j        j        |j        j        pd|j        j        rt          |j        j        ¦  «        nd|j        j	        rt          |j        j	        ¦  «        nd|j        j
        rt          |j        j
        ¦  «        nd|j        ¬¦  «        S )a@  Set session context variables for the current async task.

        Uses ``contextvars`` instead of ``os.environ`` so that concurrent
        gateway messages cannot overwrite each other's session state.

        Returns a list of reset tokens; pass them to ``_clear_session_env``
        in a ``finally`` block.
        r   )Úset_session_varsrp   )r  rC  rQ  rF  rp  rÖ  rê   )Úgateway.session_contextr	  r$  r  r!  rC  rQ  rF  rò   rp  rÖ  rê   )r¿  rÐ  r	  s      r!   rë  zGatewayRunner._set_session_env   sµ   € ð 	=Ð<Ð<Ð<Ð<Ð<ØÐØ”^Ô,Ô2Ø”NÔ*Ø”nÔ.Ð4°"Ø7>´~Ô7OÐW•c˜'œ.Ô2Ñ3Ô3Ð3ÐUWØ3:´>Ô3IÐQ•C˜œÔ.Ñ/Ô/Ð/ÈrØ7>´~Ô7OÐW•c˜'œ.Ô2Ñ3Ô3Ð3ÐUWØÔ+ð
ñ 
ô 
ð 	
ré   rš  c                 ó(   — ddl m}  ||¦  «         dS )z>Restore session context variables to their pre-handler values.r   )Úclear_session_varsN)r	  r	  )r¿  rš  r	  s      r!   rÿ  z GatewayRunner._clear_session_env   s+   € à>Ð>Ð>Ð>Ð>Ð>ØÐ˜6Ñ"Ô"Ð"Ð"Ð"ré   c              ‡   ó~   K  — t          j        ¦   «         }t          ¦   «         } |j        d|j        |g|¢R Ž ƒ d{V —†S )zJRun blocking work in the thread pool while preserving session contextvars.N)rž  rõ  r   r÷  Úrun)r¿  Úfuncr­   rQ  r  s        r!   rû  z+GatewayRunner._run_in_executor_with_context$   sP   è è € åÔ'Ñ)Ô)ˆÝ‰nŒnˆØ)�TÔ)¨$°´¸ÐEÀÐEÐEÐEÐEÐEÐEÐEÐEÐEÐEré   Ú	user_textrw  c              ƒ   óJ  K  — ddl m} d}g }|D ]ñ}	 t                               d|¦  «          |||¬¦  «        ƒ d{V —†}t	          j        |¦  «        }|                     d¦  «        r3|                     dd	¦  «        }	|                     d
|	› d|› d�¦  «         n|                     d|› d�¦  «         Œ§# t          $ r>}
t           	                    d|
¦  «         |                     d|› d�¦  «         Y d}
~
Œêd}
~
ww xY w|r d 
                    |¦  «        }|r|› d|› �S |S |S )a°  
        Auto-analyze user-attached images with the vision tool and prepend
        the descriptions to the message text.

        Each image is analyzed with a general-purpose prompt.  The resulting
        description *and* the local cache path are injected so the model can:
          1. Immediately understand what the user sent (no extra tool call).
          2. Re-examine the image with vision_analyze if it needs more detail.

        Args:
            user_text:   The user's original caption / message text.
            image_paths: List of local file paths to cached images.

        Returns:
            The enriched message string with vision descriptions prepended.
        r   )Úvision_analyze_toolz¦Describe everything visible in this image in thorough detail. Include any text, code, data, objects, people, layout, colors, and any other notable visual information.zAuto-analyzing user image: %s)rø  Úuser_promptNr¸  Úanalysisrp   z0[The user sent an image~ Here's what I can see:
zA]
[If you need a closer look, use vision_analyze with image_url: z ~]zŒ[The user sent an image but I couldn't quite see it this time (>_<) You can try looking at it yourself with vision_analyze using image_url: rÙ   zVision auto-analysis error: %sz”[The user sent an image but something went wrong when I tried to look at it~ You can try examining it yourself with vision_analyze using image_url: rÛ  )Útools.vision_toolsr	  r³   rË   rÔ  rÕ  r¸   rá   r·   rO  râ   )r¿  r	  rw  r	  Úanalysis_promptÚenriched_partsr   r¦  rG  rÜ  rÁ  r  s               r!   re  z)GatewayRunner._enrich_message_with_vision*   s  è è € ð* 	;Ð:Ð:Ð:Ð:Ð:ð8ð 	ð ˆØð 	ð 	ˆDðÝ—’Ð<¸dÑCÔCÐCØ$7Ð$7Ø"Ø /ð%ñ %ô %ð ð ð ð ð ð �õ œ KÑ0Ô0�Ø—:’:˜iÑ(Ô(ð Ø"(§*¢*¨Z¸Ñ"<Ô"<�KØ"×)Ò)ð0ÈKð 0ð 0à&*ð0ð 0ð 0ñô ð ð ð #×)Ò)ðHà@DðHð Hð Hñô ð øøõ
 ð ð ð Ý—’Ð=¸qÑAÔAÐAØ×%Ò%ðDà<@ðDð Dð Dñô ð ð ð ð ð ð øøøøðøøøð ð 	Ø—[’[ Ñ0Ô0ˆFØð 2Ø Ð1Ð1 iÐ1Ð1Ð1ØˆMØÐs   ’B#B6Â6
C>Ã 4C9Ã9C>rx  c              ƒ   óv  K  — t          | j        dd¦  «        s+d}|                      ¦   «         r|dz  }|dz  }|r|› d|› �S |S ddlm} g }|D �])}	 t
                               d	|¦  «         t          j        ||¦  «        ƒ d
{V —†}|d         r"|d         }| 	                    d|› d�¦  «         n~| 
                    dd¦  «        }	d|	v s|	                     d¦  «        r6d}
|                      ¦   «         r|
dz  }
|
dz  }
| 	                    |
¦  «         n| 	                    d|	› d�¦  «         Œã# t          $ r;}t
                               d|¦  «         | 	                    d¦  «         Y d
}~�Œ#d
}~ww xY w|r>d                     |¦  «        }d}|r|                     ¦   «         |k    r|S |r|› d|› �S |S |S )a‹  
        Auto-transcribe user voice/audio messages using the configured STT provider
        and prepend the transcript to the message text.

        Args:
            user_text:   The user's original caption / message text.
            audio_paths: List of local file paths to cached audio files.

        Returns:
            The enriched message string with transcriptions prepended.
        Ústt_enabledTzI[The user sent voice message(s), but transcription is disabled in config.z{ You have a skill called hermes-agent-setup that can help users configure Hermes features including voice, tools, and more.rÙ   rÛ  r   )Útranscribe_audiozTranscribing user voice: %sNr¸  ry  z8[The user sent a voice message~ Here's what they said: "z"]rO  rD  rJ  z8Neither VOICE_TOOLS_OPENAI_KEY nor OPENAI_API_KEY is setu°   [The user sent a voice message but I can't listen to it right now â€” no STT provider is configured. A direct message has already been sent to the user with setup instructions.zC[The user sent a voice message but I had trouble transcribing it~ (z)]zTranscription error: %sze[The user sent a voice message but something went wrong when I tried to listen to it~ Let them know!]z.(The user sent a message with no text content))rÜ   r)  rå  Útools.transcription_toolsr!	  r³   rË   rž  r¡  rá   r¸   rß   r·   rO  râ   ró   )r¿  r	  rx  Údisabled_noter!	  r	  r   rG  ry  rO  Ú_no_stt_noterÁ  r  Ú_placeholders                 r!   rf  z0GatewayRunner._enrich_message_with_transcriptionm   s»  è è € õ  �t”{ M°4Ñ8Ô8ð 
	!ØgˆMØ×$Ò$Ñ&Ô&ð ØðXñ�ð ˜SÑ ˆMØð 9Ø'Ð8Ð8¨YÐ8Ð8Ð8Ø Ð à>Ð>Ð>Ð>Ð>Ð>àˆØð (	ñ (	ˆDð'Ý—’Ð:¸DÑAÔAÐAÝ&Ô0Ð1AÀ4ÑHÔHÐHÐHÐHÐHÐHÐH�Ø˜)Ô$ð Ø!'¨Ô!5�JØ"×)Ò)ðCØ4>ðCð Cð Cñô ð ð ð
 #ŸJšJ w°Ñ@Ô@�Eà)¨UÐ2Ð2Ø ×+Ò+Ð,fÑgÔgð 3ð7ð %ð  ×0Ò0Ñ2Ô2ð Ø(ð!Dñ˜Lð
 %¨Ñ+˜Ø&×-Ò-¨lÑ;Ô;Ð;Ð;à&×-Ò-ð;Ø16ð;ð ;ð ;ñô ð øøõ ð ð ð Ý—’Ð6¸Ñ:Ô:Ð:Ø×%Ò%ðDñô ð ð ð ð ð ñ øøøøðøøøð ð 		Ø—[’[ Ñ0Ô0ˆFð LˆLØð ˜YŸ_š_Ñ.Ô.°,Ò>Ð>Ø�Øð 2Ø Ð1Ð1 iÐ1Ð1Ð1ØˆMØÐs   ÁCD1Ä1
E6Ä;0E1Å1E6rI  c                 ór  — ddl m} t          |                     d¦  «        pd¦  «                             ¦   «         }d}d}d}|r°	 | j                             ¦   «          | j        j                             |¦  «        }|rt          |dd¦  «        r|j	        S n3# t          $ r&}t                               d||¦  «         Y d}~nd}~ww xY wt          |¦  «        }	|	r|	d         }|	d	         }|	d
         }t          |                     d¦  «        p|pd¦  «                             ¦   «                              ¦   «         }
t          |                     d	¦  «        p|pd¦  «                             ¦   «                              ¦   «         }t          |                     d
¦  «        p|pd¦  «                             ¦   «         }|
r|r|sdS 	 t          |
¦  «        }n,# t          $ r t                               d|
¦  «         Y dS w xY w ||||t          |                     d¦  «        pd¦  «                             ¦   «         pdt          |                     d¦  «        pd¦  «                             ¦   «         pdt          |                     d¦  «        pd¦  «                             ¦   «         pd¬¦  «        S )a  Resolve the canonical source for a synthetic background-process event.

        Prefer the persisted session-store origin for the event's session key.
        Falling back to the currently active foreground event is what causes
        cross-topic bleed, so don't do that.
        r   )r”   rê   rp   r  Nz>Synthetic process-event session-store lookup failed for %s: %sr  rB  rC  z9Synthetic process event has invalid platform metadata: %rrF  rp  rÖ  )r  rC  rB  rF  rp  rÖ  )Úgateway.sessionr”   rò   r¸   ró   r›  r  r  rÜ   r  r·   r³   rË   rH  rõ   r�   r´   )r¿  rI  r”   rê   Úderived_platformÚderived_chat_typeÚderived_chat_idrÒ   r½   r  ry  rB  rC  r  s                 r!   Ú_build_process_event_sourcez)GatewayRunner._build_process_event_sourceÂ   sÿ  € ð 	2Ð1Ð1Ð1Ð1Ð1å˜#Ÿ'š' -Ñ0Ô0Ð6°BÑ7Ô7×=Ò=Ñ?Ô?ˆØÐØÐØˆàð 	5ð
ØÔ"×1Ò1Ñ3Ô3Ð3ØÔ*Ô3×7Ò7¸ÑDÔD�Øð (�W U¨H°dÑ;Ô;ð (Ø œ<Ð'øøÝð ð ð Ý—’ØTØØñô ð ð ð ð ð ð øøøøðøøøõ )¨Ñ5Ô5ˆGØð 5Ø#*¨:Ô#6Ð Ø$+¨KÔ$8Ð!Ø")¨)Ô"4�å˜CŸGšG JÑ/Ô/ÐIÐ3CÐIÀrÑJÔJ×PÒPÑRÔR×XÒXÑZÔZˆÝ˜Ÿš Ñ,Ô,ÐGÐ0AÐGÀRÑHÔH×NÒNÑPÔP×VÒVÑXÔXˆ	Ý�c—g’g˜iÑ(Ô(ÐA¨OÐA¸rÑBÔB×HÒHÑJÔJˆØð 	 Ið 	°Wð 	Ø�4ð	Ý Ñ.Ô.ˆHˆHøÝð 	ð 	ð 	Ý�NŠNØKØñô ð ð �4�4ð	øøøð ˆ}ØØØÝ˜#Ÿ'š' +Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ÐEÀÝ˜Ÿš 	Ñ*Ô*Ð0¨bÑ1Ô1×7Ò7Ñ9Ô9ÐA¸TÝ˜#Ÿ'š' +Ñ.Ô.Ð4°"Ñ5Ô5×;Ò;Ñ=Ô=ÐEÀð
ñ 
ô 
ð 	
s+   ÁAB Â
C	Â#CÃC	Ç
G Ç%HÈHri  c              ƒ   ó’  K  — |                       |¦  «        }|s1t                               d|                     dd¦  «        ¦  «         dS t	          |j        d¦  «        r|j        j        nt          |j        ¦  «        }d}| j         	                    ¦   «         D ]\  }}|j        |k    r|} nŒ|sdS 	 t          |t          j        |d¬¦  «        }t                               d||j        |j        ¦  «         |                     |¦  «        ƒ d{V —† dS # t"          $ r&}	t                               d	|	¦  «         Y d}	~	dS d}	~	ww xY w)
zèInject a watch-pattern notification as a synthetic message event.

        Routing must come from the queued watch event itself, not from whatever
        foreground message happened to be active when the queue was drained.
        zCDropping watch notification with no routing metadata for process %srM  rN  Nr!  T©r]  rØ   r$  rŒ  uA   Watch pattern notification â€” injecting for %s chat=%s thread=%srÚ  )r+	  r³   r´   r¸   r  r  r!  rò   r‡  rò  rœ   r�   rç  rÊ   rC  rF  r€  r·   rO  )
r¿  ri  rI  r$  ry  rí   rË  r¶  Úsynth_eventrÁ  s
             r!   r  z(GatewayRunner._inject_watch_notificationû   sœ  è è € ð ×1Ò1°#Ñ6Ô6ˆØð 	Ý�NŠNØUØ—’˜ iÑ0Ô0ñô ð ð ˆFÝ18¸¼È'Ñ1RÔ1RÐl˜œÔ-Ð-ÕX[Ð\bÔ\kÑXlÔXlˆØˆØ”M×'Ò'Ñ)Ô)ð 	ð 	‰DˆAˆqØŒw˜-Ò'Ð'Ø�Ø�ð (ð ð 	ØˆFð	FÝ&ØÝ(Ô-ØØð	ñ ô ˆKõ �KŠKØSØØ”ØÔ ñ	ô ð ð ×(Ò(¨Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5øÝð 	Fð 	Fð 	FÝ�LŠLÐAÀ1ÑEÔEÐEÐEÐEÐEÐEÐEÐEøøøøð	Føøøs   Â5AD Ä
EÄ EÅEr½  c           
   ƒ   ó\	  K  — ddl m} |d         }|d         }|                     dd¦  «        }|                     dd¦  «        }|                     dd¦  «        }|                     d	d¦  «        }|                     d
d¦  «        }	|                     dd¦  «        }
|                     dd¦  «        }|                      ¦   «         }t                               d||||¦  «         |dk    rZ|sX	 t          j        |¦  «        ƒ d{V —† |                     |¦  «        }|�|j        rnŒ:t                               d|¦  «         dS d}	 t          j        |¦  «        ƒ d{V —† |                     |¦  «        }|€�nt          |j
        ¦  «        }||k    }|}|j        �r7ddl m} |�ra|                     |¦  «        �sKddlm} |j
        r ||j
        dd…         ¦  «        nd}d|› d|j        › d|j        › d|› d�	}|                      ||||||	|
dœ¦  «        }|st                               d|¦  «         �nWd}| j                             ¦   «         D ]\  }}||j        k    r|} nŒ|r›|j        r”	 t-          |t.          j        |d¬¦  «        }t                               d|||j        |j        ¦  «         |                     |¦  «        ƒ d{V —† n2# t8          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w�nˆ|dv p|d k    o|j        d!v}|r·|j
        r|j
        d"d…         nd}d#|› d$|j        › d%|› d�}d}| j                             ¦   «         D ]\  }}|j        |k    r|} nŒ|r\|rZ	 |rd	|ind}|                     |||¬&¦  «        ƒ d{V —† n2# t8          $ r%}t                               d'|¦  «         Y d}~nd}~ww xY wn»|r·|d(k    r±|s¯|j
        r|j
        d)d…         nd}d#|› d*|› d�}d}| j                             ¦   «         D ]\  }}|j        |k    r|} nŒ|r\|rZ	 |rd	|ind}|                     |||¬&¦  «        ƒ d{V —† n2# t8          $ r%}t                               d'|¦  «         Y d}~nd}~ww xY w�ŒIt                               d+|¦  «         dS ),u  
        Periodically check a background process and push updates to the user.

        Runs as an asyncio task. Stays silent when nothing changed.
        Auto-removes when the process exits or is killed.

        Notification mode (from ``display.background_process_notifications``):
          - ``all``    â€” running-output updates + final message
          - ``result`` â€” final completion message only
          - ``error``  â€” final message only when exit code != 0
          - ``off``    â€” no messages at all
        r   ro  rM  Úcheck_intervalrê   rp   r  rC  rF  rp  rÖ  Únotify_on_completeFzCProcess watcher started: %s (every %ss, notify=%s, agent_notify=%s)rë  TNz"Process watcher ended (silent): %s)Ú
strip_ansii0øÿÿrU  z completed (exit code z).
Command: z	
Output:
rÙ   )rM  rê   r  rC  rF  rp  rÖ  zHDropping completion notification with no routing metadata for process %sr-	  uU   Process %s finished â€” injecting agent notification for session %s chat=%s thread=%sz Agent notify injection error: %s)rê  rG  rO  )r   Niüÿÿz[Background process z finished with exit code z~ Here's the final output:
r  zWatcher delivery error: %srê  iþÿÿz is still running~ New output:
zProcess watcher ended: %s) r™  rp  r¸   r¹  r³   rË   rž  rü  ÚexitedrÞ   Úoutput_bufferÚis_completion_consumedÚtools.ansi_stripr2	  r#  r¬   r+	  r´   r‡  rò  r  rC  rœ   r�   rç  rÊ   rF  r€  r·   rO  r!  r	  )r¿  r½  rp  rM  rÀ  rê   ry  rC  rF  rp  rÖ  Úagent_notifyÚnotify_moder¹  Úlast_output_lenÚcurrent_output_lenÚhas_new_outputÚ	_pr_checkr2	  r[  ri  r$  rí   rË  r¶  r.	  rÁ  r   Ú
new_outputrN  Ú	send_metas                                  r!   r«  z"GatewayRunner._run_process_watcher!!  sþ  è è € ð 	<Ð;Ð;Ð;Ð;Ð;à˜\Ô*ˆ
ØÐ+Ô,ˆØ—k’k -°Ñ4Ô4ˆØŸš J°Ñ3Ô3ˆØ—+’+˜i¨Ñ,Ô,ˆØ—K’K ¨RÑ0Ô0ˆ	Ø—+’+˜i¨Ñ,Ô,ˆØ—K’K ¨RÑ0Ô0ˆ	Ø—{’{Ð#7¸Ñ?Ô?ˆØ×>Ò>Ñ@Ô@ˆå�ŠÐZØ  (¨K¸ñ	Gô 	Gð 	Gð ˜%ÒÐ¨ÐðÝ”m HÑ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø*×.Ò.¨zÑ:Ô:�Ø�? g¤n�?Øð	õ
 �LŠLÐ=¸zÑJÔJÐJØˆFàˆðl	FÝ”- Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)à&×*Ò*¨:Ñ6Ô6ˆGØˆÙå!$ WÔ%:Ñ!;Ô!;ÐØ/°/ÒAˆNØ0ˆOàŒ~ñ aFð QÐPÐPÐPÐPÐPØñ 0¨	×(HÒ(HÈÑ(TÔ(Tñ 0Ø;Ð;Ð;Ð;Ð;Ð;ØHOÔH]Ðe˜:˜: gÔ&;¸E¸F¸FÔ&CÑDÔDÐDÐce�Dð,¸*ð ,ð ,Ø&-Ô&7ð,ð ,à$+¤Oð,ð ,ð %)ð,ð ,ð ,ð ð "×=Ò=Ø&0Ø'2Ø$1Ø#*Ø%.Ø#*Ø%.ð?ð ?ñ ô �Fð "ð ÝŸšØfØ&ñô ð ñ à"�GØ $¤× 3Ò 3Ñ 5Ô 5ð "ð "™˜˜1Ø ¤Ò/Ð/Ø&'˜GØ!˜Eð 0ð ð P 6¤>ð PðPÝ*6Ø%/Ý-8Ô-=Ø'-Ø)-ð	+ñ +ô +˜Kõ #ŸKšKØ wØ *Ø +Ø &¤Ø &Ô 0ñô ð ð #*×"8Ò"8¸Ñ"EÔ"EÐEÐEÐEÐEÐEÐEÐEÐEøÝ(ð Pð Pð PÝ"ŸLšLÐ)KÈQÑOÔOÐOÐOÐOÐOÐOÐOøøøøðPøøøáð
  Ð#4Ð4ð WØ# wÒ.ÐU°7Ô3DÈIÐ3Uð ð !ð JØBIÔBWÐ!_ Ô!6°u°v°vÔ!>Ð!>Ð]_�JðC¨zð Cð CÐT[ÔTeð Cð CØ5?ðCð Cð Cð !ð #�GØ $¤× 3Ò 3Ñ 5Ô 5ð "ð "™˜˜1Øœ7 mÒ3Ð3Ø&'˜GØ!˜Eð 4ð ð J 7ð JðJØDMÐ(W¨°iÐ(@Ð(@ÐSW˜IØ")§,¢,¨w¸Èy ,Ñ"YÔ"YÐYÐYÐYÐYÐYÐYÐYÐYøÝ(ð Jð Jð JÝ"ŸLšLÐ)EÀqÑIÔIÐIÐIÐIÐIÐIÐIøøøøðJøøøààð F K°5Ò$8Ð$8ÀÐ$8ð >EÔ=RÐZ˜WÔ2°4°5°5Ô9Ð9ÐXZ�
ð2¨:ð 2ð 2Ø$.ð2ð 2ð 2ð ð �Ø œM×/Ò/Ñ1Ô1ð ð ‘D�A�qØ”w -Ò/Ð/Ø"#˜Ø˜ð 0ð ð F˜wð FðFØ@IÐ$S [°)Ð$<Ð$<Èt˜	Ø%Ÿlšl¨7°LÈ9˜lÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUøÝ$ð Fð Fð FÝŸšÐ%AÀ1ÑEÔEÐEÐEÐEÐEÐEÐEøøøøðFøøøñWl	Fõ\ 	�ŠÐ0°*Ñ=Ô=Ð=Ð=Ð=sI   É4A K Ë
LËK?Ë?LÍ<&N# Î#
OÎ-OÏOÐ6&Q Ñ
RÑ'RÒRrº   r³  Úephemeral_promptc           
      ó>  — ddl }ddl}t          |                     dd¦  «        pd¦  «        }|r9|                     |                     ¦   «         ¦  «                             ¦   «         nd}|                     | ||                     dd¦  «        |                     dd¦  «        |                     dd¦  «        |rt          |¦  «        ng |pdgdt          ¬	¦  «        }|                     |                     ¦   «         ¦  «                             ¦   «         dd
…         S )u>  Compute a stable string key from agent config values.

        When this signature changes between messages, the cached AIAgent is
        discarded and rebuilt.  When it stays the same, the cached agent is
        reused â€” preserving the frozen system prompt and tool schemas for
        prompt cache hits.
        r   Nrd   rp   rc   ra   r«   T)Ú	sort_keysr+  é   )	ÚhashlibrÔ  rò   r¸   Úsha256ÚencodeÚ	hexdigestrü  rÉ  )	rb   rº   r³  r?	  rC	  Ú_jÚ_api_keyÚ_api_key_fingerprintÚblobs	            r!   Ú_agent_config_signaturez%GatewayRunner._agent_config_signature¼!  s   € ð 	#Ð"Ð"Ð"Ð"Ð"Ð"Ð"õ �w—{’{ 9¨bÑ1Ô1Ð7°RÑ8Ô8ˆØPXÐ`˜wŸ~š~¨h¯oªoÑ.?Ô.?Ñ@Ô@×JÒJÑLÔLÐLÐ^`Ðà�xŠxàØ$Ø—’˜J¨Ñ+Ô+Ø—’˜J¨Ñ+Ô+Ø—’˜J¨Ñ+Ô+Ø,<ÐD•Ð'Ñ(Ô(Ð(À"ð !Ð& Bð
ð Ýð ñ 
ô 
ˆð �~Š~˜dŸkšk™mœmÑ,Ô,×6Ò6Ñ8Ô8¸¸"¸Ô=Ð=ré   c                 ó¸   — | j                              |¦  «        }|s||fS |                     d|¦  «        }dD ]}|                     |¦  «        }|�|||<   Œ||fS )a±  Apply /model session overrides if present, returning (model, runtime_kwargs).

        The gateway /model command stores per-session overrides in
        ``_session_model_overrides``.  These must take precedence over
        config.yaml defaults so the switched model is actually used for
        subsequent messages.  Fields with ``None`` values are skipped so
        partial overrides don't clobber valid config defaults.
        rb   r.  ©rl  r¸   )r¿  rê   rb   r7  r4  rt  Úvals          r!   r1  z+GatewayRunner._apply_session_model_overrideä!  s{   € ð Ô0×4Ò4°[ÑAÔAˆØð 	)Ø˜.Ð(Ð(Ø—’˜W eÑ,Ô,ˆØBð 	*ð 	*ˆCØ—,’,˜sÑ#Ô#ˆCØˆØ&)�˜sÑ#øØ�nÐ$Ð$ré   Úagent_modelc                 óp   — | j                              |¦  «        }|duo|                     d¦  «        |k    S )zGReturn True if *agent_model* matches an active /model session override.Nrb   rM	  )r¿  rê   rO	  r4  s       r!   Ú_is_intentional_model_switchz*GatewayRunner._is_intentional_model_switchù!  s9   € àÔ0×4Ò4°[ÑAÔAˆØ˜tÐ#ÐL¨¯ª°WÑ(=Ô(=ÀÒ(LÐLré   ©rŠ  c                ó  — |sdS |�|                       ||¦  «        sdS | j                             |d¦  «         | j                             |d¦  «         t	          | d¦  «        r| j                             |d¦  «         dS )uÙ  Pop ALL per-running-agent state entries for ``session_key``.

        Replaces ad-hoc ``del self._running_agents[key]`` calls scattered
        across the gateway.  Those sites had drifted: some popped only
        ``_running_agents``; some also ``_running_agents_ts``; only one
        path also cleared ``_busy_ack_ts``.  Each missed entry was a
        small, persistent leak â€” a (str_key â†’ float) tuple per session
        per gateway lifetime.

        Use this at every site that ends a running turn, regardless of
        cause (normal completion, /stop, /reset, /resume, sentinel
        cleanup, stale-eviction).  Per-session state that PERSISTS
        across turns (``_session_model_overrides``, ``_voice_mode``,
        ``_pending_approvals``, ``_update_prompt_pending``) is NOT
        touched here â€” those have their own lifecycles.

        When ``run_generation`` is provided, only clear the slot if that
        generation is still current for the session.  This prevents an
        older async run whose generation was bumped by /stop or /new from
        clobbering a newer run's state during its own unwind.  Returns
        True when the slot was cleared, False when an ownership guard
        blocked it.
        FNr§  T)rþ  r¤  rT  ra  r  r§  )r¿  rê   rŠ  s      r!   rÞ  z*GatewayRunner._release_running_agent_stateþ!  sš   € ð: ð 	Ø�5ØÐ%¨d×.JÒ.JØ˜ñ/
ô /
Ð%ð �5ØÔ× Ò  ¨dÑ3Ô3Ð3ØÔ×#Ò# K°Ñ6Ô6Ð6Ý�4˜Ñ(Ô(ð 	5ØÔ×!Ò! +¨tÑ4Ô4Ð4Øˆtré   c                 ó8  — |sdS t          | dd¦  «        }t          |t          ¦  «        r|                     |d¦  «         	 ddlm} n# t          $ r Y dS w xY w	  ||¦  «         dS # t          $ r'}t                               d||¦  «         Y d}~dS d}~ww xY w)zFClear approval state that must not survive a real conversation switch.Nr­  r   )Úclear_sessionz:Failed to clear approval state for session boundary %s: %s)	rÜ   rÈ   rÉ   rT  r$  rU	  r·   r³   rË   )r¿  rê   Úpending_approvalsÚ_clear_approval_sessionrÁ  s        r!   r�  z4GatewayRunner._clear_session_boundary_security_state'"  sÿ   € àð 	ØˆFå# DÐ*>ÀÑEÔEÐÝÐ'­Ñ.Ô.ð 	5Ø×!Ò! +¨tÑ4Ô4Ð4ð	ØOÐOÐOÐOÐOÐOÐOøÝð 	ð 	ð 	ØˆFˆFð	øøøð	Ø#Ð# KÑ0Ô0Ð0Ð0Ð0øÝð 	ð 	ð 	Ý�LŠLØLØØñô ð ð ð ð ð ð ð øøøøð	øøøs*   ÁA	 Á	
AÁAÁA( Á(
BÁ2BÂBc                 ó®   — |sdS | j                              d¦  «        }|€	i }|| _        t          |                     |d¦  «        ¦  «        dz   }|||<   |S )ae  Claim a fresh run generation token for ``session_key``.

        Every top-level gateway turn gets a monotonically increasing token.
        If a later command like /stop or /new invalidates that token while the
        old worker is still unwinding, the late result can be recognized and
        dropped instead of bleeding into the fresh session.
        r   r¨  Nr)   )Ú__dict__r¸   r¨  rµ  )r¿  rê   ÚgenerationsÚnext_generations       r!   r  z+GatewayRunner._begin_session_run_generation>"  sj   € ð ð 	Ø�1Ø”m×'Ò'Ð(AÑBÔBˆØÐØˆKØ+6ˆDÔ(Ý˜kŸošo¨k¸1Ñ=Ô=Ñ>Ô>ÀÑBˆØ#2ˆ�KÑ ØÐré   rp   r   c                ón   — |                       |¦  «        }|rt                               d|||¦  «         |S )z7Invalidate any in-flight run token for ``session_key``.u-   Invalidated run generation for %s â†’ %d (%s))r  r³   rÊ   )r¿  rê   r\  rÇ  s       r!   rÝ  z0GatewayRunner._invalidate_session_run_generationP"  sG   € à×7Ò7¸ÑDÔDˆ
Øð 	Ý�KŠKØ?ØØØñ	ô ð ð Ðré   rÇ  c                 óª   — |sdS | j                              d¦  «        pi }t          |                     |d¦  «        ¦  «        t          |¦  «        k    S )zEReturn True when ``generation`` is still current for ``session_key``.Tr¨  r   )rY	  r¸   rµ  )r¿  rê   rÇ  rZ	  s       r!   rþ  z%GatewayRunner._is_session_run_current\"  sQ   € àð 	Ø�4Ø”m×'Ò'Ð(AÑBÔBÐHÀbˆÝ�;—?’? ;°Ñ2Ô2Ñ3Ô3µs¸:±´ÒFÐFré   c                 óÆ   — |r|r|€dS 	 t          |di ¦  «                             |¦  «        }|� t          |dt          |¦  «        ¦  «         dS dS # t          $ r Y dS w xY w)zDBind a gateway run generation to the adapter's active-session event.NÚ_active_sessionsÚ_hermes_run_generation)rÜ   r¸   Úsetattrrµ  r·   )r¿  rí   rê   rÇ  Úinterrupt_events        r!   rü  z*GatewayRunner._bind_adapter_run_generationc"  s‘   € ð ð 	˜kð 	¨ZÐ-?ØˆFð	Ý% gÐ/AÀ2ÑFÔF×JÒJÈ;ÑWÔWˆOØÐ*Ý˜Ð)AÅ3ÀzÁ?Ä?ÑSÔSÐSÐSÐSð +Ð*øåð 	ð 	ð 	ØˆDˆDð	øøøs   ŠAA Á
A ÁA T)Úrelease_running_stater¦  r§  rc	  c             ƒ   ó  K  — |sdS | j                              |¦  «        }|r|t          ur|                     |¦  «         |                      ||¬¦  «         | j                             |j        ¦  «        }|r1t          |d¦  «        r!|                     ||j	        ¦  «        ƒ d{V —† |r%t          |d¦  «        r| 
                    |¦  «         | j                             |d¦  «         |r|                      |¦  «         dS dS )zFInterrupt the current run and clear queued session state consistently.Nr   Úinterrupt_session_activityrì   )r¤  r¸   rÀ  rb  rÝ  r‡  r  r  re	  rC  rì   r¥  rT  rÞ  )r¿  rê   r$  r¦  r§  rc	  rã  rí   s           r!   râ  z*GatewayRunner._interrupt_and_clear_sessions"  s=  è è € ð ð 	ØˆFØÔ,×0Ò0°Ñ=Ô=ˆØð 	6˜]Õ2IÐIÐIØ×#Ò#Ð$4Ñ5Ô5Ð5Ø×/Ò/°ÐDWÐ/ÑXÔXÐXØ”-×#Ò# F¤OÑ4Ô4ˆØð 	R•w˜wÐ(DÑEÔEð 	RØ×4Ò4°[À&Ä.ÑQÔQÐQÐQÐQÐQÐQÐQÐQØð 	5•w˜wÐ(=Ñ>Ô>ð 	5Ø×'Ò'¨Ñ4Ô4Ð4ØÔ×"Ò" ;°Ñ5Ô5Ð5Ø ð 	;Ø×-Ò-¨kÑ:Ô:Ð:Ð:Ð:ð	;ð 	;ré   c                 óœ   — t          | dd¦  «        }|r8|5  | j                             |d¦  «         ddd¦  «         dS # 1 swxY w Y   dS dS )zBRemove a cached agent for a session (called on /new, /model, etc).r¬  N)rÜ   rª  rT  )r¿  rê   rË  s      r!   rÊ  z!GatewayRunner._evict_cached_agentŒ"  s©   € å˜Ð1°4Ñ8Ô8ˆØð 	9Øð 9ð 9ØÔ!×%Ò% k°4Ñ8Ô8Ð8ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð 9ð 9ð	9ð 	9s   –?¿AÁAÚinterrupt_depthc                 ó^   — |dk    rt          j         ¦   «         | _        d| _        d| _        dS )u¶  Reset per-turn state on a cached agent before a new turn starts.

        Both _last_activity_ts and _last_activity_desc are only reset for
        fresh external turns (depth 0); they are semantically paired â€”
        desc describes the activity *at* ts, so updating one without the
        other would make get_activity_summary() misleading.
        For interrupt-recursive turns both are preserved so the inactivity
        watchdog can accumulate stuck-turn idle time and fire the 30-min
        timeout (#15654).  The depth-0 reset is still needed: a session
        idle for 29 min would otherwise trip the watchdog before the new
        turn makes its first API call (#9051).
        r   zstarting new turn (cached)N)rV  Ú_last_activity_tsÚ_last_activity_descÚ_api_call_count)rq   rg	  s     r!   Ú_init_cached_agent_for_turnz)GatewayRunner._init_cached_agent_for_turn“"  s3   € ð ˜aÒÐÝ&*¤i¡k¤kˆEÔ#Ø(DˆEÔ%Ø !ˆÔÐÐré   c                 ó¨   — |€dS 	 t          |d¦  «        r|                     ¦   «          dS |                      |¦  «         dS # t          $ r Y dS w xY w)uÛ  Soft cleanup for cache-evicted agents â€” preserves session tool state.

        Called from _enforce_agent_cache_cap and _sweep_idle_cached_agents.
        Distinct from _cleanup_agent_resources (full teardown) because a
        cache-evicted session may resume at any time â€” its terminal
        sandbox, browser daemon, and tracked bg processes must outlive
        the Python AIAgent instance so the next agent built for the
        same task_id inherits them.
        NÚrelease_clients)r  rn	  r  r·   r!  s     r!   Ú_release_evicted_agent_softz)GatewayRunner._release_evicted_agent_soft¦"  s|   € ð ˆ=ØˆFð	Ý�uÐ/Ñ0Ô0ð 5Ø×%Ò%Ñ'Ô'Ð'Ð'Ð'ð ×-Ò-¨eÑ4Ô4Ð4Ð4Ð4øÝð 	ð 	ð 	ØˆDˆDð	øøøs   †$A ¬A Á
AÁAc           
      óÖ  — t          | dd¦  «        }|€dS t          |d¦  «        sdS d„ t          | di ¦  «                             ¦   «         D ¦   «         }t          dt	          |¦  «        t
          z
  ¦  «        }g }|dk    r�t          |                     ¦   «         ¦  «        }|d|…         D ]c}|                     |¦  «        }t          |t          ¦  «        r
|r|d         nd}|�t          |¦  «        |v rŒL|                     ||f¦  «         Œd|D ]\  }}	|                     |d¦  «         Œt	          |¦  «        t
          z
  }
|
dk    r/t                               dt	          |¦  «        t
          |
¦  «         |D ]k\  }}t                               d|t	          |¦  «        ¦  «         |�;t#          j        | j        |fd	d
|dd…         › �¬¦  «                             ¦   «          ŒldS )uõ  Evict oldest cached agents when cache exceeds _AGENT_CACHE_MAX_SIZE.

        Must be called with _agent_cache_lock held.  Resource cleanup
        (memory provider shutdown, tool resource close) is scheduled
        on a daemon thread so the caller doesn't block on slow teardown
        while holding the cache lock.

        Agents currently in _running_agents are SKIPPED â€” their clients,
        terminal sandboxes, background processes, and child subagents
        are all in active use by the running turn.  Evicting them would
        tear down those resources mid-turn and crash the request.  If
        every candidate in the LRU order is active, we simply leave the
        cache over the cap; it will be re-checked on the next insert.
        rª  NÚmove_to_endc                 óB   — h | ]}|®|t           u¯t          |¦  «        ’ŒS rr  ©rÀ  rT  r³  s     r!   rh  z9GatewayRunner._enforce_agent_cache_cap.<locals>.<setcomp>Ö"  ó8   € ð 
ð 
ð 
àØˆ} Õ*AÐ!AÐ!Aõ ˆq‰EŒEà!AÐ!AÐ!Aré   r¤  r   uk   Agent cache over cap (%d > %d); %d excess slot(s) held by mid-turn agents â€” will re-check on next insert.z;Agent cache at cap; evicting LRU session=%s (cache_size=%d)Tzagent-cache-evict-r‚  ©r¹  r­   Údaemonr  )rÜ   r  r  rÜ  rÞ   Ú_AGENT_CACHE_MAX_SIZEr¹   r0  r¸   rÈ   r>  rT  rá   rT  r³   r´   rÊ   r©  ÚThreadro	  r¾  )r¿  r  Úrunning_idsÚexcessÚ
evict_planÚordered_keysrt  rÒ   rq   rû   Úremaining_over_caps              r!   Ú_enforce_agent_cache_capz&GatewayRunner._enforce_agent_cache_cap¼"  s,  € õ ˜˜~¨tÑ4Ô4ˆØˆ>ØˆFõ �v˜}Ñ-Ô-ð 	ØˆFð

ð 
å˜TÐ#4°bÑ9Ô9×@Ò@ÑBÔBð
ñ 
ô 
ˆõ �Q�˜F™œÕ&;Ñ;Ñ<Ô<ˆØ"$ˆ
Ø�AŠ:ˆ:Ý §¢¡¤Ñ.Ô.ˆLØ# G V GÔ,ð 0ð 0�ØŸ
š
 3™œ�Ý$.¨uµeÑ$<Ô$<ÐPÀÐP˜˜aœ˜ÈD�ØÐ$­¨E©¬°kÐ)AÐ)AØØ×!Ò! 3¨ ,Ñ/Ô/Ð/Ð/à ð 	"ð 	"‰FˆC�Ø�JŠJ�s˜DÑ!Ô!Ð!Ð!å  ™[œ[Õ+@Ñ@ÐØ Ò!Ð!Ý�NŠNðDå�F‘”Õ2Ð4Fñô ð ð %ð 	ð 	‰JˆC�Ý�KŠKØMØ•S˜‘[”[ñô ð ð Ð ÝÔ ØÔ;Ø˜ØØ8¨c°#°2°#¬hÐ8Ð8ð	ñ ô ÷
 ’%‘'”'�'øð	ð 	ré   c                 ót  — t          | dd¦  «        }t          | dd¦  «        }|�|€dS t          j        ¦   «         }g }d„ t          | di ¦  «                             ¦   «         D ¦   «         }|5  t          |                     ¦   «         ¦  «        D ]t\  }}t          |t          ¦  «        r
|r|d         nd}|€Œ)t          |¦  «        |v rŒ;t          |dd¦  «        }	|	€ŒO||	z
  t          k    r| 	                    ||f¦  «         Œu|D ]\  }}
| 
                    |d¦  «         Œ	 ddd¦  «         n# 1 swxY w Y   |D ]n\  }}t                               d||t          |d|¦  «        z
  ¦  «         t          j        | j        |fd	d
|dd…         › �¬¦  «                             ¦   «          Œot#          |¦  «        S )uõ  Evict cached agents whose AIAgent has been idle > _AGENT_CACHE_IDLE_TTL_SECS.

        Safe to call from the session expiry watcher without holding the
        cache lock â€” acquires it internally.  Returns the number of entries
        evicted.  Resource cleanup is scheduled on daemon threads.

        Agents currently in _running_agents are SKIPPED for the same reason
        as _enforce_agent_cache_cap: tearing down an active turn's clients
        mid-flight would crash the request.
        rª  Nr¬  r   c                 óB   — h | ]}|®|t           u¯t          |¦  «        ’ŒS rr  rs	  r³  s     r!   rh  z:GatewayRunner._sweep_idle_cached_agents.<locals>.<setcomp>#  rt	  ré   r¤  ri	  z3Agent cache idle-TTL evict: session=%s (idle=%.0fs)Tzagent-cache-idle-r‚  ru	  )rÜ   rV  r  r¹   rò  rÈ   r>  rT  Ú_AGENT_CACHE_IDLE_TTL_SECSrá   rT  r³   rÊ   r©  rx	  ro	  r¾  rÞ   )r¿  r  rË  rå  Úto_evictry	  rt  rÒ   rq   Úlast_activityrû   s              r!   rÌ  z'GatewayRunner._sweep_idle_cached_agents#  sC  € õ ˜˜~¨tÑ4Ô4ˆÝ˜Ð1°4Ñ8Ô8ˆØˆ>˜U˜]Ø�1ÝŒi‰kŒkˆØ "ˆð
ð 
å˜TÐ#4°bÑ9Ô9×@Ò@ÑBÔBð
ñ 
ô 
ˆð
 ð 	&ð 	&Ý" 6§<¢<¡>¤>Ñ2Ô2ð 
2ð 
2‘
��UÝ$.¨uµeÑ$<Ô$<ÐPÀÐP˜˜aœ˜ÈD�Ø�=ØÝ�e‘9”9 Ð+Ð+ØÝ '¨Ð/BÀDÑ IÔ I�Ø Ð(ØØ˜-Ñ'Õ+EÒEÐEØ—O’O S¨% LÑ1Ô1Ð1øØ"ð &ð &‘��QØ—
’
˜3 Ñ%Ô%Ð%Ð%ð&ð	&ð 	&ð 	&ñ 	&ô 	&ð 	&ð 	&ð 	&ð 	&ð 	&ð 	&øøøð 	&ð 	&ð 	&ð 	&ð #ð 
	ð 
	‰JˆC�Ý�KŠKØEØ�S�7 5Ð*=¸sÑCÔCÑCñô ð õ ÔØÔ7Ø�XØØ3¨¨S¨b¨S¬Ð3Ð3ð	ñ ô ÷
 Še‰gŒgˆgˆgÝ�8‰}Œ}Ðs   Á-B5D/Ä/D3Ä6D3c                 óF  — t          j        dd¦  «                             ¦   «         }|r|                     d¦  «        S t	          ¦   «         }|                     d¦  «        pi                      dd¦  «                             ¦   «         }|r|                     d¦  «        S dS )zÁReturn the proxy URL if proxy mode is configured, else None.

        Checks GATEWAY_PROXY_URL env var first (convenient for Docker),
        then ``gateway.proxy_url`` in config.yaml.
        ÚGATEWAY_PROXY_URLrp   r  r  Ú	proxy_urlN)r   r²   ró   rô  r(  r¸   )r¿  ræ   rÏ   s      r!   Ú_get_proxy_urlzGatewayRunner._get_proxy_url=#  s”   € õ ŒiÐ+¨RÑ0Ô0×6Ò6Ñ8Ô8ˆØð 	#Ø—:’:˜c‘?”?Ð"Ý"Ñ$Ô$ˆØ�wŠw�yÑ!Ô!Ð' R×,Ò,¨[¸"Ñ=Ô=×CÒCÑEÔEˆØð 	#Ø—:’:˜c‘?”?Ð"Øˆtré   rï   rÂ  rM  rÃ  c	              ƒ   óü  ‡ ‡‡K  — 	 ddl m}	m}
 n# t          $ r
 dg dg dœcY S w xY w‰                      ¦   «         }|sdg dg dœS t          j        dd¦  «                             ¦   «         }dt          fˆˆ ˆfd	„}g }|r| 	                    d
|dœ¦  «         |D ]J}| 
                    d¦  «        }| 
                    d¦  «        }|dv r|r| 	                    ||dœ¦  «         ŒK| 	                    d|dœ¦  «         ddi}|rd|› �|d<   |r||d<   d|ddœ}d}t          t          ‰ dd¦  «        dd¦  «        }|€ddlm}  |¦   «         }t          |j        ¦  «        }t!          ¦   «         }ddlm}  |||d¦  «        }|€|j        o
|j        dk    nt          |¦  «        }|j        r
d|j        i}nd}|rÁ	 ddlm}m} ‰ j         
                    |j        ¦  «        }|rdt          |d d¦  «        } | r|j        nd}!d!}"|j        t6          j        k    rd}!d}" ||j        |j        |!|"¬"¦  «        }# |||j        |#|¬#¦  «        }n2# t@          $ r%}$tB           "                    d$|$¦  «         Y d}$~$nd}$~$ww xY wd}%|r&tG          j$        | %                    ¦   «         ¦  «        }%‰ j         
                    |j        ¦  «        }|r4	 | &                    |j        |¬%¦  «        ƒ d{V —† n# t@          $ r Y nw xY wd}&tO          j'        ¦   «         }'	  |
dd&¬'¦  «        }( |	|(¬(¦  «        4 ƒd{V —†})|) (                    |› d)�||¬*¦  «        4 ƒd{V —†	 }*|*j)        d+k    rí|* *                    ¦   «         ƒ d{V —†}+tB           +                    d,|*j)        ||+dd-…         ¦  «         d.|*j)        › d/|+dd0…         › �g dg dœcddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† |r| ,                    ¦   «          |%rS	 tG          j-        |%d1¬(¦  «        ƒ d{V —† S # tF          j.        tF          j/        f$ r |% 0                    ¦   «          Y S w xY wS d},|*j1         2                    ¦   «         2 3 d{V —†}- |¦   «         sÈtB           3                    d2‰pd3‰pd¦  «         dg dg ti          |¦  «        |d!d4œc cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† |r| ,                    ¦   «          |%rS	 tG          j-        |%d1¬(¦  «        ƒ d{V —† S # tF          j.        tF          j/        f$ r |% 0                    ¦   «          Y S w xY wS |- 5                    d5d6¬7¦  «        }.|,|.z  },d8|,v rÿ|, 6                    d8d9¦  «        \  }/},|/                     ¦   «         }/|/sŒ4|/ 7                    d:¦  «        r¶|/d;d…         }0|0                     ¦   «         d<k    rn—	 tq          j9        |0¦  «        }1|1 
                    d=g ¦  «        }2|2rP|2d          
                    d>i ¦  «        }3|3 
                    dd¦  «        }|r|&|z  }&|r| :                    |¦  «         n# tp          j;        $ r Y nw xY wd8|,v °ÿ�Œú6 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n¾# tF          j/        $ r ‚ t@          $ r¢}4tB           <                    d?||4¦  «         |&szd@|4› �g dg dœcY d}4~4|r| ,                    ¦   «          |%rS	 tG          j-        |%d1¬(¦  «        ƒ d{V —† S # tF          j.        tF          j/        f$ r |% 0                    ¦   «          Y S w xY wS Y d}4~4nd}4~4ww xY w|r| ,                    ¦   «          |%rS	 tG          j-        |%d1¬(¦  «        ƒ d{V —† n¦# tF          j.        tF          j/        f$ r |% 0                    ¦   «          Y nuw xY wnp# |r| ,                    ¦   «          |%rS	 tG          j-        |%d1¬(¦  «        ƒ d{V —† w # tF          j.        tF          j/        f$ r |% 0                    ¦   «          Y w w xY ww xY wtO          j'        ¦   «         |'z
  }5 |¦   «         s7tB           3                    dA‰pd3‰pd¦  «         dg dg ti          |¦  «        |d!d4œS tB           3                    dB||pdddC…         |5ti          |&¦  «        ¦  «         |&pdDd|dœdE|&dœgd9g ti          |¦  «        ||duot          |&¦  «        d4œS )FaT  Forward the message to a remote Hermes API server instead of
        running a local AIAgent.

        When ``GATEWAY_PROXY_URL`` (or ``gateway.proxy_url`` in config.yaml)
        is set, the gateway becomes a thin relay: it handles platform I/O
        (encryption, threading, media) and delegates all agent work to the
        remote server via ``POST /v1/chat/completions`` with SSE streaming.

        This lets a Docker container handle Matrix E2EE while the actual
        agent runs on the host with full access to local files, memory,
        skills, and a unified session store.
        r   )ÚClientSessionÚClientTimeoutuE   âš ï¸� Proxy mode requires aiohttp. Install with: pip install aiohttp©rÉ  rË  rÌ  rÜ  uH   âš ï¸� Proxy URL not configured (GATEWAY_PROXY_URL or gateway.proxy_url)ÚGATEWAY_PROXY_KEYrp   r   c                  ó<   •— ‰ �‰sdS ‰                      ‰‰ ¦  «        S r^  ©rþ  ©rŠ  r¿  rê   s   €€€r!   Ú_run_still_currentz>GatewayRunner._run_agent_via_proxy.<locals>._run_still_currentx#  ó)   ø€ ØÐ%¨[Ð%Ø�tØ×/Ò/°¸^ÑLÔLÐLré   rà  r­  r©  rÊ  rª  r«  zContent-Typezapplication/jsonzBearer ÚAuthorizationzX-Hermes-Session-Idzhermes-agentT)rb   rË  ÚstreamNr)  Ú	streaming©ÚStreamingConfigrÕ  rë  rF  ©ÚGatewayStreamConsumerÚStreamConsumerConfigÚSUPPORTS_MESSAGE_EDITINGF©Úedit_intervalÚbuffer_thresholdÚcursorÚbuffer_only©rí   rC  r)  rÌ  z+Proxy: could not set up stream consumer: %sr  rš  )ÚtotalÚ	sock_readrÌ  z/v1/chat/completions)rÔ  ÚheadersrÍ  zProxy error (%d) from %s: %sr\  u   âš ï¸� Proxy error (z): r¿  rù  uK   Discarding stale proxy stream for %s â€” generation %d is no longer currentrR  )rÉ  rË  rÌ  rÜ  rß  rM  Úresponse_previewedr-   r
  )ÚerrorsrÛ   r)   zdata: r^  z[DONE]ÚchoicesÚdeltaz Proxy connection error to %s: %su   âš ï¸� Proxy connection error: uK   Discarding stale proxy result for %s â€” generation %d is no longer currentz>proxy response: url=%s session=%s time=%.1fs response=%d charsrå  z(No response from remote agent)r¬  )=Úaiohttpr‰	  rŠ	  r   r‡	  r   r²   ró   r¶  rá   r¸   rÜ   rà  r–	  r#  r  r(  r  rÖ  r  Ú	transportrF  Úgateway.stream_consumerr˜	  r™	  r‡  rž	  r�   rU  rœ	  r�	  rC  r·   r³   rË   rž  rT  r	  Úsend_typingrV  Úpostr¡  r]  r´   Úfinishr  r  ÚCancelledErrorr  rÊ  Úiter_anyrÊ   rÞ   r
  rô   rß   rÔ  rÕ  Úon_deltarð  rO  )6r¿  rï   rÂ  rF  r$  rM  rê   rŠ  rÃ  Ú_AioClientSessionrŠ	  r†	  Ú	proxy_keyr�	  Úapi_messagesr  r©  rÊ  r£	  ÚbodyÚ_stream_consumerÚ_scfgr–	  ró  r,  rÖ  Ú_plat_streamingÚ_streaming_enabledrý  r˜	  r™	  rˆ  Ú_adapter_supports_editÚ_effective_cursorÚ_buffer_onlyÚ_consumer_cfgÚ_sc_errÚstream_taskÚfull_responseÚ_startÚ_timeoutr¹  ÚrespÚ
error_textrü  rû  r]  Úlineró  Úobjr¦	  r§	  rÁ  Ú_elapseds6   `     ``                                              r!   Ú_run_agent_via_proxyz"GatewayRunner._run_agent_via_proxyL#  s¥  øøøè è € ð.	ØQÐQÐQÐQÐQÐQÐQÐQÐQøÝð 	ð 	ð 	à"iØØØð	ð ð ð ð ð	øøøð ×'Ò'Ñ)Ô)ˆ	Øð 	à"lØØØð	ð ð õ ”IÐ1°2Ñ6Ô6×<Ò<Ñ>Ô>ˆ	ð	M¥Dð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð  .0ˆàð 	OØ×Ò¨¸nÐ MÐ MÑNÔNÐNàð 	Hð 	HˆCØ—7’7˜6‘?”?ˆDØ—g’g˜iÑ(Ô(ˆGØÐ,Ð,Ð,°Ð,Ø×#Ò#¨T¸gÐ$FÐ$FÑGÔGÐGøà×Ò V¸Ð@Ð@ÑAÔAÐAð $2Ð3EÐ"FˆØð 	=Ø'<°Ð'<Ð'<ˆG�OÑ$Øð 	8Ø-7ˆGÐ)Ñ*ð $Ø$Øð
ð 
ˆð  ÐÝ�  h°Ñ5Ô5°{ÀDÑIÔIˆØˆ=Ø6Ð6Ð6Ð6Ð6Ð6Ø#�OÑ%Ô%ˆEå+¨F¬OÑ<Ô<ˆÝ*Ñ,Ô,ˆØBÐBÐBÐBÐBÐBØ1Ð1Ø˜ {ñ
ô 
ˆð
 Ð&ð ŒMÐ6˜eœo°Ò6øå�oÑ&Ô&ð 	ð Ôð 	$Ø:EÀvÔGWÐ9XÐÐà#Ðàð 	UðUØ_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Øœ=×,Ò,¨V¬_Ñ=Ô=�Øð Ý-4°XÐ?YÐ[_Ñ-`Ô-`Ð*Ø8NÐ(V¨¬¨ÐTVÐ%Ø#(�LØ”­(¬/Ò9Ð9Ø,.Ð)Ø'+˜Ø$8Ð$8Ø&+Ô&9Ø).Ô)?Ø0Ø$0ð	%ñ %ô %�Mð (=Ð'<Ø (Ø &¤Ø,Ø!1ð	(ñ (ô (Ð$øøõ ð Uð Uð UÝ—’ÐJÈGÑTÔTÐTÐTÐTÐTÐTÐTøøøøðUøøøð ˆØð 	FÝ!Ô-Ð.>×.BÒ.BÑ.DÔ.DÑEÔEˆKð ”=×$Ò$ V¤_Ñ5Ô5ˆØð 	ðØ×*Ò*¨6¬>ÐDTÐ*ÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUøÝð ð ð Ø�ðøøøð ˆÝ”‘”ˆðU	)Ø$�}¨1¸Ð=Ñ=Ô=ˆHØ(Ð(°Ð:Ñ:Ô:ð =)ð =)ð =)ð =)ð =)ð =)ð =)¸gØ"Ÿ<š<Ø Ð6Ð6Ð6ØØ#ð (ñ ô ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð Ø”{ cÒ)Ð)Ø+/¯9ª9©;¬;Ð%6Ð%6Ð%6Ð%6Ð%6Ð%6˜
ÝŸšØ:Ø œK¨°J¸tÀ¸tÔ4Dñô ð ð
 /hÀTÄ[Ð.gÐ.gÐU_Ð`dÐadÐ`dÔUeÐ.gÐ.gØ(*Ø)*Ø%'ð	 ð  ð<)ð <)ð <)ð <)ñ <)ô <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð=)ð =)ð =)ð =)ñ =)ô =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ðZ  ð *Ø ×'Ò'Ñ)Ô)Ð)Øð )ð)Ý!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð )ð )ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)øøøð)ðw  �FØ'+¤|×'<Ò'<Ñ'>Ô'>ð ()ð ()ð ()ð ()ð ()ð ()ð ()˜eØ1Ð1Ñ3Ô3ð Ý"ŸKšKØ mØ +Ð 2¨sØ .Ð 3°!ñô ð ð 35Ø,.Ø-.Ø)+Ý25°g±,´,Ø.8Ø6;ð$ð $ð ð ð7<)ð <)ð <)ð <)ñ <)ô <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð=)ð =)ð =)ð =)ñ =)ô =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ðZ  ð *Ø ×'Ò'Ñ)Ô)Ð)Øð )ð)Ý!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð )ð )ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)øøøð)ðU  %Ÿ|š|¨G¸I˜|ÑFÔF˜Ø $™˜ð # f˜n˜nØ+1¯<ª<¸¸aÑ+@Ô+@™L˜D &Ø#'§:¢:¡<¤<˜DØ#'ð )Ø (Ø#Ÿš¨xÑ8Ô8ð )Ø'+¨A¨B¨B¤x Ø#'§:¢:¡<¤<°8Ò#;Ð#;Ø$)ð!)Ý*.¬*°TÑ*:Ô*: CØ.1¯gªg°iÀÑ.DÔ.D GØ'.ð %SØ07¸´
·²¸wÈÑ0KÔ0K¨Ø27·)²)¸IÀrÑ2JÔ2J¨Ø+2ð )SØ,9¸WÑ,D¨MØ/?ð -SØ0@×0IÒ0IÈ'Ñ0RÔ0RÐ0RøøÝ'+Ô';ð !)ð !)ð !)Ø$( Dð!)øøøð' # f˜n˜nùð) (?Ð'>ð)<)ð <)ð <)ñ <)ô <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)ð <)øøøð <)ð <)ð <)ð <)ð=)ð =)ð =)ñ =)ô =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)ð =)øøøð =)ð =)ð =)ð =)øøõ~ Ô%ð 	ð 	ð 	ØÝð 	ð 	ð 	Ý�LŠLÐ;¸YÈÑJÔJÐJØ ð à&KÈÐ&KÐ&KØ "Ø!"Øð	ð ð ð ð ð ð ð  ð *Ø ×'Ò'Ñ)Ô)Ð)Øð )ð)Ý!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð )ð )ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)øøøð)ðð ð ð ð øøøøð	øøøð  ð *Ø ×'Ò'Ñ)Ô)Ð)Øð )ð)Ý!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð )ð )ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)øøøð)øð  ð *Ø ×'Ò'Ñ)Ô)Ð)Øð )ð)Ý!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð )ð )ð )Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)øøøð)øøøõ ”9‘;”; Ñ'ˆØ!Ð!Ñ#Ô#ð 	Ý�KŠKØ]ØÐ"˜sØÐ# !ñô ð ð #%ØØØÝ"% g¡,¤,Ø(Ø&+ðð ð õ 	�ŠØLØ˜
Ð( b¨#¨2¨#Ô.°½#¸mÑ:LÔ:Lñ	
ô 	
ð 	
ð ,ÐPÐ/Pà¨GÐ4Ð4Ø$°Ð?Ð?ðð ØÝ! '™lœlØ$Ø"2¸$Ð">Ð"VÅ4ÈÑCVÔCVð
ð 
ð 	
s  ‡ �$£$Æ8BI É
I5ÉI0É0I5Ë"K' Ë'
K4Ë3K4ÌZ& Ì,"ZÍA)Y1Î8ZÏ
Z& Ï5PÐ/QÑQÑY1Ñ#YÑ)AY1Ò,ZÒ>Z& Ó)TÔ/T8Ô7T8Ô<BY1×A<YÙY1ÙY	ÙY1ÙY	Ù
Y1ÙZÙ1
Y;	Ù;ZÙ>Y;	Ù?ZÚZ& Ú
ZÚZ& Ú!ZÚ"Z& Ú%_ Ú&]!Ú?']Û&]!Û'_ Ü\!Ü!/]Ý]Ý_ Ý]!Ý!_ Ý=^ Þ/_ß_ß`=ß*`à`=à/`9à6`=à8`9à9`=r   Ú_interrupt_depthr¬  c              ƒ   ó\.  ‡ ‡‡‡‡‡‡‡‡‡
‡Z‡[‡\‡]‡^‡_‡`‡a‡b‡c‡d‡e‡f‡g‡h‡i‡j‡k‡l‡m‡n‡o‡p‡q‡r‡s‡t‡u‡v‡w‡x‡y‡zK  — ‰                       ¦   «         r#‰                      ‰‰‰‰‰‰‰|	¬¦  «        ƒ d{V —†S ddlmŠZ ddlŠsdt
          fˆˆ ˆfd„Šdt          ¦   «         Šzt          ‰j        ¦  «        }ddl	m
} t           |‰z|¦  «        ¦  «        Šk‰z                     di ¦  «        }t          |t          ¦  «        si }dd	lmŠu 	 dd
lm}  ‰u‰z|dd¦  «        } ||rt'          |¦  «        nd¦  «         n# t(          $ r Y nw xY w ‰u‰z|d¦  «        }|pt+          j        d¦  «        pdŠqddlmŠ[ ‰qdk    o‰j        ‰[j        k    Šx‰j        ‰[j        k    o#t5          |                     d¦  «        d¬¦  «        Šl‰xr‰s                     ¦   «         ndŠrdgŠndgŠmdgŠtdgŠodŠ\d|dt8          dt8          dt8          dt          fˆ\ˆdˆjˆmˆnˆoˆqˆrˆtf	d„Šp‰j        ‰[j        k    r
‰j        p|	Šcn‰j        Šc‰crd‰cindŠbˆbˆdˆjˆrˆsˆ ˆfd„}dgŠjdgŠvdgŠydgŠwt?          j         ¦   «         Š`‰ j!        Š^dt&          dtD          ddfˆ^ˆ`ˆdˆˆfd„Ši‰ j#                             ‰j        ¦  «        Še‰j$        Šg‰crd‰cindŠhdt8          d t8          ddfˆ`ˆdˆeˆgˆhfd!„ŠfˆZˆ[ˆ^ˆˆ`ˆcˆdˆeˆfˆgˆhˆiˆjˆ
ˆˆkˆˆlˆˆpˆuˆvˆˆ ˆˆˆˆwˆxˆyˆzfd"„}d}‰xrt?          j%         |¦   «         ¦  «        }d}ˆwfd#„}t?          j%         |¦   «         ¦  «        }ˆjˆˆ ˆfd$„}t?          j%         |¦   «         ¦  «        }t?          j&        ¦   «         Š_ˆ_ˆjˆ ˆˆfd%„}t?          j%         |¦   «         ¦  «        }tO          t+          j        d&d'¦  «        ¦  «        }|dk    r|ndŠ]tQ          j(        ¦   «         Šaˆ]ˆaˆhˆjˆ ˆfd(„}t?          j%         |¦   «         ¦  «        }	 tO          t+          j        d)d*¦  «        ¦  «        }|dk    r|nd}tO          t+          j        d+d,¦  «        ¦  «        }|dk    r|nd} d}!t?          j)        ‰  *                    |¦  «        ¦  «        }"d}#d-}$|�€$d}%	 t?          j+        |"h|$¬.¦  «        ƒ d{V —†\  }&}'|&r|" ,                    ¦   «         }%nè‰_ -                    ¦   «         sÒ‰rÐ‰ j#                             ‰j        ¦  «        }(‰jd         })|(r§|)r¥t]          |(d/¦  «        r•|( /                    ‰¦  «        r€|(j0                             ‰¦  «        }*|*r|*j1        nd}+td           3                    d0‰| 4                    ¦   «         rd1nd2¦  «         |) 5                    |+¦  «         ‰_ 6                    ¦   «          �Œ�n:d}%	 t?          j+        |"h|$¬.¦  «        ƒ d{V —†\  }&}'|&r|" ,                    ¦   «         }%�nÿ‰jd         },d3}-|,rLt]          |,d4¦  «        r<	 |, 7                    ¦   «         }.|.                     d5d3¦  «        }-n# t(          $ r Y nw xY w|!s´| �²|-| k    r¬d}!‰ j#                             ‰j        ¦  «        }/|/r‰t'          | d6z  ¦  «        pd7}0t'          || z
  d6z  ¦  «        pd7}1	 |/ 8                    ‰j$        d8|0› d9|1› d:�‰h¬;¦  «        ƒ d{V —† n2# t(          $ r%}2td           9                    d<|2¦  «         Y d}2~2nd}2~2ww xY w|-|k    rd}#nè‰_ -                    ¦   «         sÒ‰rÐ‰ j#                             ‰j        ¦  «        }(‰jd         })|(r§|)r¥t]          |(d/¦  «        r•|( /                    ‰¦  «        r€|(j0                             ‰¦  «        }*|*r|*j1        nd}+td           3                    d0‰| 4                    ¦   «         rd1nd2¦  «         |) 5                    |+¦  «         ‰_ 6                    ¦   «          �Œ7|#�r¿‰jd         }3i }4|3r6t]          |3d4¦  «        r&	 |3 7                    ¦   «         }4n# t(          $ r Y nw xY w|4                     d=d>¦  «        }5|4                     d5d¦  «        }6|4                     d?¦  «        }7|4                     d@d¦  «        }8|4                     dAd¦  «        }9td           :                    dB|6|‰|5|8|9|7pdC¦  «         |3r*t]          |3dD¦  «        r|3 5                    tv          ¦  «         t'          |d6z  ¦  «        pd7}:dE|:› dF�g};|7r$|; <                    dG|7› dH|6dI›dJ|8› dK|9› dL�	¦  «         n#|; <                    dM|5› dN|6dI›dO|8› dK|9› dP�	¦  «         |; <                    dQ¦  «         dR =                    |;¦  «        ‰vd         r‰vd                              dSg ¦  «        ng |8‰yd         pg dddTœ}%‰jd         }<‰vd         }=|=r|=                     dU¦  «        nd}>|<�[t]          |<dV¦  «        rK|>sIt}          ¦   «         }?|<j?        |?k    r0‰  @                    ‰|<j?        ¦  «        s‰  A                    ‰¦  «         ‰vd         }@‰ j#                             ‰j        ¦  «        }Ad}Bd}C|@rØ|ArÖ‰rÔt…          |A‰¦  «        }B‰  C                    ‰|A|B¦  «        }B|@                     dW¦  «        r]|Bs[|@                     dX¦  «        rF|@                     dX¦  «        }Dt‰          |D¦  «        rtd           3                    dY‰pdZ|D¦  «         n>|D}Cn;|Br9|Bj1        pt‹          |B¦  «        }Ctd           9                    d[|Cdd\…         ¦  «         |@r@|Cs>|Bs<|@                     d]¦  «        }E|Er%|E}Ctd           9                    d^|Cdd\…         ¦  «         |Cr¹|C F                    ¦   «          G                    dK¦  «        r’|C F                    ¦   «          H                    dd7¦  «        }F|Fr"|Fd         d7d…          I                    ¦   «         nd_}G|GrB	 dd`lJmK}H  |H|G¦  «        rtd           3                    da|G¦  «         d}Bd}Cn# t(          $ r Y nw xY w‰ jL        r8|Bs|Cr4td           3                    db‰pdZ‰  M                    ¦   «         ¦  «         d}Bd}C|Bs|C�rÊtd           9                    dc|Cdd\…         ¦  «         |Ar:t]          |Add¦  «        r*‰r(‰|AjN        v r|AjN        ‰          O                    ¦   «          ‰‰ jP        k    �r±td           Q                    de‰‰¦  «         ‰ j#                             ‰j        ¦  «        }A|Ar|Brt¥          |Aj0        ‰|B¦  «         n(|Ar&t]          |Adf¦  «        r|A S                    ‰|C¦  «         ‰vd         p|%‰dgœ	 |r| T                    ¦   «          | T                    ¦   «          | T                    ¦   «          |rr	 t?          jU        |d-¬.¦  «        ƒ d{V —† nT# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY nw xY w| T                    ¦   «          ‰r‰  X                    ‰‰¬h¦  «         ‰ jL        r‰  Y                    di¦  «         ||||fD ]#}I|Ir	 |Iƒ d{V —† Œ# t>          jW        $ r Y Œw xY wŒ$S |@                     dW¦  «        }J|J�sU‰wd         }K|Kr¡|rŸ	 t?          jU        |d-¬.¦  «        ƒ d{V —† n�# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY n1t(          $ r%}Ltd           9                    dj|L¦  «         Y d}L~Lnd}L~Lww xY wt          |@                     dk¦  «        ¦  «        }Mt          |Krtµ          |Kdld¦  «        p|M¦  «        }N|@                     dmd_¦  «        }O|Orv|Nst	 td           3                    dn‰pdZ¦  «         |A 8                    ‰j$        |O‰h¬;¦  «        ƒ d{V —† nQ# t(          $ r%}Ltd           Q                    do|L¦  «         Y d}L~Ln'd}L~Lww xY w|Ortd           3                    dp‰pdZ¦  «         tµ          t·          |A¦  «        dqd¦  «        �C|A \                    ‰‰¬r¦  «        }Pt»          |P¦  «        r	  |P¦   «          ni# t(          $ r Y n]w xY wnX|ArVt]          |Ads¦  «        rF|Aj^         _                    ‰d¦  «        }Pt»          |P¦  «        r	  |P¦   «          n# t(          $ r Y nw xY w|@                     dS‰¦  «        }Q‰}R|C}Sd}Td}U|B��}tµ          |Bdtd¦  «        p‰}R‰  `                    |B|R|Q¬u¦  «        ƒ d{V —†}S|S�€'|@|r| T                    ¦   «          | T                    ¦   «          | T                    ¦   «          |rr	 t?          jU        |d-¬.¦  «        ƒ d{V —† nT# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY nw xY w| T                    ¦   «          ‰r‰  X                    ‰‰¬h¦  «         ‰ jL        r‰  Y                    di¦  «         ||||fD ]#}I|Ir	 |Iƒ d{V —† Œ# t>          jW        $ r Y Œw xY wŒ$S tµ          |Bdvd¦  «        }Ttµ          |Bdwd¦  «        }U‰ j#                             ‰j        ¦  «        }V|Vr4	 |V a                    ‰j$        ‰h¬;¦  «        ƒ d{V —† n# t(          $ r Y nw xY w‰  b                    |S‰|Q|R‰‰‰‰d7z   |T|U¬x¦
  «
        ƒ d{V —†	 |r| T                    ¦   «          | T                    ¦   «          | T                    ¦   «          |rr	 t?          jU        |d-¬.¦  «        ƒ d{V —† nT# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY nw xY w| T                    ¦   «          ‰r‰  X                    ‰‰¬h¦  «         ‰ jL        r‰  Y                    di¦  «         ||||fD ]#}I|Ir	 |Iƒ d{V —† Œ# t>          jW        $ r Y Œw xY wŒ$S 	 |r| T                    ¦   «          | T                    ¦   «          | T                    ¦   «          |rr	 t?          jU        |d-¬.¦  «        ƒ d{V —† nT# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY nw xY w| T                    ¦   «          ‰r‰  X                    ‰‰¬h¦  «         ‰ jL        r‰  Y                    di¦  «         ||||fD ]#}I|Ir	 |Iƒ d{V —† Œ# t>          jW        $ r Y Œw xY wŒ$�n*# |r| T                    ¦   «          | T                    ¦   «          | T                    ¦   «          |rr	 t?          jU        |d-¬.¦  «        ƒ d{V —† nT# t>          jV        t>          jW        f$ r6 | T                    ¦   «          	 |ƒ d{V —† n# t>          jW        $ r Y nw xY wY nw xY w| T                    ¦   «          ‰r‰  X                    ‰‰¬h¦  «         ‰ jL        r‰  Y                    di¦  «         ||||fD ]#}I|Ir	 |Iƒ d{V —† Œ# t>          jW        $ r Y Œw xY wŒ$w xY w‰wd         }Kt          |%t          ¦  «        r¡|%                     dU¦  «        sŒ|%                     dm¦  «        pd_}W|W p|Wdyk    }Xt          |Kotµ          |Kdld¦  «        ¦  «        }Yt          |%                     dk¦  «        ¦  «        }M|Xs(|Ys|Mr$td           3                    dz‰pdZ|Y|M¦  «         d|%d{<   |%S )}aÉ  
        Run the agent with the given message and context.
        
        Returns the full result dict from run_conversation, including:
          - "final_response": str (the text to send back)
          - "messages": list (full conversation including tool calls)
          - "api_calls": int
          - "completed": bool
        
        This is run in a thread pool to not block the event loop.
        Supports interruption via new messages.
        )rï   rÂ  rF  r$  rM  rê   rŠ  rÃ  Nr   r¥  r   c                  ó<   •— ‰ �‰sdS ‰                      ‰‰ ¦  «        S r^  rŽ	  r�	  s   €€€r!   r�	  z4GatewayRunner._run_agent.<locals>._run_still_current‰$  r‘	  ré   râ  r|   rÕ  )Úset_tool_preview_max_lenÚtool_preview_lengthr'  ÚHERMES_TOOL_PROGRESS_MODErê  rß  rë  Úinterim_assistant_messagesT©r+  Fg      >@Ú
event_typer`  r-  r­   c                 ó°  •	— ‰r
 ‰¦   «         sdS | dk    rö‰d         sî	 |                      d¦  «        pd}|‰k    r›‰dk    r•ddlm}m}m}m}	 t          ¦   «         }
t          |
                      di ¦  «                              dd	¦  «        ¦  «        }|rB ||
|¦  «        s6d
‰d<   ‰                      |	¦   «         ¦  «          |t          dz  |¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wdS | dvrdS 	 ‰r‰d         nd}|�t          |dd	¦  «        rdS n# t          $ r Y nw xY w‰dk    r|‰d         k    rdS |‰d<   ddlm}  ||d¬¦  «        }‰dk    r±|r‚ddlm}  |¦   «         }t#          j        |d	t&          ¬¦  «        }|dk    r#t)          |¦  «        |k    r|d|dz
  …         dz   }|› d|› dt+          |                     ¦   «         ¦  «        › d|› �}n|r|› d|› d|› d�}n|› d|› d�}‰                     |¦  «         dS |rIddlm}  |¦   «         }|dk    r|nd}t)          |¦  «        |k    r|d|dz
  …         dz   }|› d|› d|› d�}n|› d|› d�}|‰d         k    r0‰dxx         dz  cc<   ‰                     d|‰d         f¦  «         dS |‰d<   d‰d<   ‰                     |¦  «         dS ) z3Callback invoked by agent on tool lifecycle events.Nztool.completedr   r$  rê  )ÚTOOL_PROGRESS_FLAGrÙ  rÚ  Útool_progress_hint_gatewayr|   r&  FTr,   z(tool-progress onboarding hint failed: %s)ztool.startedÚis_interruptedr©  )Úget_tool_emojiu   âš™ï¸�rÏ	  r³  )Úget_tool_preview_max_len)Úensure_asciir+  r@  r®  rñ   ú(z)
z: "rM  rL  r)   Ú	__dedup__)r¸   rà  rÒ	  rÙ  rÚ  rÓ	  r(  r¶  ÚputrÅ   r·   r³   rË   rÜ   Úagent.displayrÕ	  rÖ	  rÔ  rü  rò   rÞ   r¹   r0  )rÐ	  r`  r-  r­   Úkwargsr$  rÒ	  rÙ  rÚ  rÓ	  r…   Úgate_onÚ	_hint_errÚ_agent_for_interruptrÕ	  ÚemojirÖ	  Ú_plÚargs_strr  Ú_capÚ_LONG_TOOL_THRESHOLD_Sr�	  Úagent_holderÚlast_progress_msgÚ	last_toolÚlong_tool_hint_firedÚprogress_modeÚprogress_queueÚrepeat_counts                        €€€€€€€€€r!   Úprogress_callbackz3GatewayRunner._run_agent.<locals>.progress_callbackÅ$  sn  ø€ à!ð Ð);Ð);Ñ)=Ô)=ð Ø�ð Ð-Ò-Ð-Ð6JÈ1Ô6MÐ-ðXØ%Ÿzšz¨*Ñ5Ô5Ð:¸�HØÐ#9Ò9Ð9¸mÈuÒ>TÐ>Tðð ð ð ð ð ð ð ð ð ð ð õ  4Ñ5Ô5˜Ý"& t§x¢x°	¸2Ñ'>Ô'>×'BÒ'BÐCZÐ\aÑ'bÔ'bÑ"cÔ"c˜Ø"ð X¨7¨7°4Ð9KÑ+LÔ+Lð XØ6:Ð0°Ñ3Ø*×.Ò.Ð/IÐ/IÑ/KÔ/KÑLÔLÐLØ%˜I¥l°]Ñ&BÐDVÑWÔWÐWøøÝ ð Xð Xð XÝ—L’LÐ!KÈYÑWÔWÐWÐWÐWÐWÐWÐWøøøøðXøøøà�ð Ð!2Ð2Ð2Ø�ðØ:FÐ'P |°A¤ ÈDÐ$Ø'Ð3½Ø(Ð*:¸Eñ9ô 9Ð3ð �FøøÝð ð ð Ø�ðøøøð  Ò%Ð%¨)°yÀ´|Ò*CÐ*CØ�Ø$ˆI�a‰Lð 5Ð4Ð4Ð4Ð4Ð4Ø"�N 9°hÐ?Ñ?Ô?ˆEð  	Ò)Ð)Øð 4ØFÐFÐFÐFÐFÐFØ2Ð2Ñ4Ô4�CÝ#œz¨$¸UÍCÐPÑPÔP�Hð ˜Q’w�w¥3 x¡=¤=°3Ò#6Ð#6Ø#+¨H¨S°1©W¨HÔ#5¸Ñ#=˜Ø"ÐQÐQ YÐQÐQµ°d·i²i±k´kÑ1BÔ1BÐQÐQÀxÐQÐQ�C�CØð 4Ø"Ð?Ð? YÐ?Ð?°GÐ?Ð?Ð?�C�Cà"Ð3Ð3 YÐ3Ð3Ð3�CØ×"Ò" 3Ñ'Ô'Ð'Ø�ð
 ð 0ØBÐBÐBÐBÐBÐBØ.Ð.Ñ0Ô0�Ø! Ašg˜g�s�s¨2�Ý�w‘<”< $Ò&Ð&Ø% i t¨a¡x iÔ0°5Ñ8�GØÐ;Ð; Ð;Ð;°Ð;Ð;Ð;��àÐ/Ð/ Ð/Ð/Ð/�ð
 Ð'¨Ô*Ò*Ð*Ø˜Q��” 1Ñ$��‘ð ×"Ò" K°°lÀ1´oÐ#FÑGÔGÐGØ�Ø#&Ð˜aÑ ØˆL˜‰Oà×Ò˜sÑ#Ô#Ð#Ð#Ð#s*   ŸB8C Ã
DÃ"DÄDÄD5 Ä5
EÅErF  c               “   ó@
  •K  — ‰sd S ‰j                              ‰j        ¦  «        } | sd S t          | ¦  «        j        t
          j        u rP‰                     ¦   «         s:	 ‰                     ¦   «          n# t          $ r Y nw xY w‰                     ¦   «         ¯:d S g }d }d}d}d}	 	  ‰¦   «         sP‰                     ¦   «         s:	 ‰                     ¦   «          n# t          $ r Y nw xY w‰                     ¦   «         ¯:d S ‰                     ¦   «         }	 ‰r‰d         nd }|�,t          |dd¦  «        rt          j        d¦  «        ƒ d {V —† Œ«n# t          $ r Y nw xY wt          |t          ¦  «        rBt          |¦  «        dk    r/|d         dk    r#|\  }}	}
|r|	› d	|
d
z   › d�|d<   |r|d         n|	}n|}|                     |¦  «         t!          j        ¦   «         }|||z
  z
  }|dk    rt          j        |¦  «        ƒ d {V —† �Œg ‰¦   «         sd S |r´|�²d                     |¦  «        }|                      ‰j        ||¬¦  «        ƒ d {V —†}|j        srt          |dd¦  «        pd                     ¦   «         }d|v sd|v r t,                               d| j        ¦  «         d}|                      ‰j        |‰¬¦  «        ƒ d {V —† ns|r9d                     |¦  «        }|                      ‰j        |‰¬¦  «        ƒ d {V —†}n#|                      ‰j        |‰¬¦  «        ƒ d {V —†}|j        r|j        r|j        }t!          j        ¦   «         }t          j        d¦  «        ƒ d {V —†  ‰¦   «         r"|                      ‰j        ‰¬¦  «        ƒ d {V —† �n‚# ‰j        $ r t          j        d¦  «        ƒ d {V —† Y �n[t          j        $ �r ‰                     ¦   «         sš	 ‰                     ¦   «         }t          |t          ¦  «        r6t          |¦  «        dk    r#|d         dk    r|\  }}	}
|r|	› d	|
d
z   › d�|d<   n|                     |¦  «         n# t          $ r Y nw xY w‰                     ¦   «         ¯š|rN|rL|rJd                     |¦  «        }	 |                      ‰j        ||¬¦  «        ƒ d {V —† n# t          $ r Y nw xY wY d S t          $ r?}t,                               d|¦  «         t          j        d
¦  «        ƒ d {V —† Y d }~nd }~ww xY w�Œz)NTrò  g      ø?r   rÔ	  Fr@  rÙ	  u    (Ã—r)   rÖ  rE  rÛ   )rC  rÝ  rÊ  rO  rp   Úfloodzretry afterz1[%s] Progress edits disabled due to flood controlr÷  g333333Ó?r  zProgress message error: %s)r‡  r¸   r  rK  Úedit_messager›   r  r  r·   rÜ   rž  rü  rÈ   r>  rÞ   rá   rV  rW  râ   rC  r¸  rõ   r³   rÊ   r  r	  rÝ  r«	  ÚEmptyr®	  rO  )rí   Úprogress_linesÚprogress_msg_idÚcan_editÚ_last_edit_tsÚ_PROGRESS_EDIT_INTERVALr­  rß	  rû   Úbase_msgrÎ  r  Ú_nowÚ
_remainingÚ	full_textrG  Ú_errrÁ  Ú_progress_metadatar�	  rå	  rê	  rl  r¿  r$  s                     €€€€€€€r!   Úsend_progress_messagesz8GatewayRunner._run_agent.<locals>.send_progress_messages=%  s"  øè è € Ø!ð Ø�à”m×'Ò'¨¬Ñ8Ô8ˆGØð Ø�õ
 �G‰}Œ}Ô)Õ-@Ô-MÐMÐMØ(×.Ò.Ñ0Ô0ð ðØ&×1Ò1Ñ3Ô3Ð3Ð3øÝ$ð ð ð Ø˜ðøøøð )×.Ò.Ñ0Ô0ð ð
 �àˆNØ"ˆOØˆHØˆMØ&)Ð#ðy+ðx+Ø-Ð-Ñ/Ô/ð Ø"0×"6Ò"6Ñ"8Ô"8ð &ð&Ø .× 9Ò 9Ñ ;Ô ;Ð ;Ð ;øÝ#,ð &ð &ð &Ø % ð&øøøð #1×"6Ò"6Ñ"8Ô"8ð &ð
 ˜à(×3Ò3Ñ5Ô5�Cð	ØBNÐ/X¨|¸A¬¨ÐTXÐ,Ø/Ð;ÅØ0Ð2BÀEñAô AÐ;õ #*¤-°Ñ"2Ô"2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø$øøÝ$ð ð ð Ø˜ðøøøõ " #¥uÑ-Ô-ð 3µ#°c±(´(¸a²-°-ÀCÈÄFÈkÒDYÐDYØ-0Ñ*˜˜8 UØ)ð OØ4<Ð1NÐ1NÀ%È!Á)Ð1NÐ1NÐ1N˜N¨2Ñ.Ø4BÐP˜n¨RÔ0Ð0È˜˜à!˜Ø&×-Ò-¨cÑ2Ô2Ð2õ  œ>Ñ+Ô+�DØ!8¸DÀ=Ñ<PÑ!Q�JØ! A’~�~õ &œm¨JÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ù à-Ð-Ñ/Ô/ð Ø˜àð @ OÐ$?à$(§I¢I¨nÑ$=Ô$=˜	Ø'.×';Ò';Ø$*¤NØ'6Ø$-ð (<ñ (ô (ð "ð "ð "ð "ð "ð "˜ð
  &œ~ð qÝ$+¨F°G¸RÑ$@Ô$@Ð$FÀB×#MÒ#MÑ#OÔ#O˜DØ&¨$˜˜°-À4Ð2GÐ2Gõ !'§¢Ø$WØ$+¤Lñ!"ô !"ð !"ð (-˜HØ")§,¢,°v´~ÈsÐ]o ,Ñ"pÔ"pÐpÐpÐpÐpÐpÐpÐpøà#ð zà(,¯	ª	°.Ñ(AÔ(A˜IØ+2¯<ª<ÀÄÐXaÐl~¨<Ñ+Ô+Ð%Ð%Ð%Ð%Ð%Ð%˜F˜Fð ,3¯<ª<ÀÄÐX[Ðfx¨<Ñ+yÔ+yÐ%yÐ%yÐ%yÐ%yÐ%yÐ%y˜FØ!œ>ð @¨fÔ.?ð @Ø.4Ô.?˜Oå$(¤NÑ$4Ô$4�Mõ "œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø)Ð)Ñ+Ô+ð _Ø%×1Ò1°&´.ÐK]Ð1Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^ùøà”{ð -ð -ð -Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ñ,ÝÔ-ð ñ ð à,×2Ò2Ñ4Ô4ð 
"ð	"Ø"0×";Ò";Ñ"=Ô"=˜CÝ)¨#­uÑ5Ô5ð ;½#¸c¹(¼(Àaº-¸-ÈCÐPQÌFÐVaÒLaÐLaØ58Ñ 2  8¨UØ#1ð !WØ<DÐ9VÐ9VÈ%ÐRSÉ)Ð9VÐ9VÐ9V N°2Ñ$6øà .× 5Ò 5°cÑ :Ô :Ð :øøÝ(ð "ð "ð "Ø!˜Eð"øøøð -×2Ò2Ñ4Ô4ð 
"ð  ð 	! Nð 	!°ð 	!Ø$(§I¢I¨nÑ$=Ô$=˜	ð!Ø")×"6Ò"6Ø(.¬Ø+:Ø(1ð #7ñ #ô #ð ð ð ð ð ð ð ð øõ
  )ð !ð !ð !Ø ˜Dð!øøøà�F�FÝ ð +ð +ð +Ý—L’LÐ!=¸qÑAÔAÐAÝ!œ-¨Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*øøøøð+øøøñoy+sÛ   Á A5 Á5
BÂBÂ'N ÃC ÃN Ã
C(Ã%N Ã'C(Ã(N ÄN Ä9E ÅN Å
EÅN ÅEÅB,N È
N ÈFN Î$TÏ#TÏ'A4QÑTÑ
Q)Ñ&TÑ(Q)Ñ)2TÒ#S Ò?TÓ 
SÓ
TÓSÓTÓ	TÓ5TÔTré  Ú
prev_toolsc                 óî  •—  ‰¦   «         sd S 	 g }|pg D ]d}t          |t          ¦  «        r+|                     |                     d¦  «        pd¦  «         ŒB|                     t	          |¦  «        ¦  «         Œet          j        ‰                     d‰	j        r‰	j        j	        nd‰	j
        ‰| ||dœ¦  «        ‰¦  «         d S # t          $ r&}t                               d|¦  «         Y d }~d S d }~ww xY w)Nr  rp   z
agent:step)r  rp  rM  ré  Ú
tool_namesrÜ  zagent:step hook error: %s)rÈ   rÉ   rá   r¸   rò   rž  Úrun_coroutine_threadsafer¤  r  r!  rp  r·   r³   rË   )
ré  rý	  Ú_namesÚ_trÔ  Ú
_hooks_refÚ_loop_for_stepr�	  rM  r$  s
        €€€€€r!   Ú_step_callback_syncz5GatewayRunner._run_agent.<locals>._step_callback_syncÛ%  s9  ø€ Ø%Ð%Ñ'Ô'ð Ø�ð>ð %'�Ø%Ð+¨ð /ð /�BÝ! "¥dÑ+Ô+ð /ØŸš b§f¢f¨V¡n¤nÐ&:¸Ñ;Ô;Ð;Ð;àŸš¥c¨"¡g¤gÑ.Ô.Ð.Ð.ÝÔ0Ø—O’O LØ=C¼_Ð$T F¤OÔ$9Ð$9ÐRTØ#)¤>Ø&0Ø%.Ø&,Ø!+ð3ð 3ñ ô ð #ñ
ô 
ð 
ð 
ð 
øõ ð >ð >ð >Ý—’Ð8¸"Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=øøøøð>øøøs   �B3C Ã
C4ÃC/Ã/C4rï   c                 óä   •— ‰r
 ‰¦   «         sd S 	 t          j        ‰                     ‰|‰¬¦  «        ‰¦  «         d S # t          $ r'}t                               d| |¦  «         Y d }~d S d }~ww xY w)Nr  zstatus_callback error (%s): %s©rž  r 
  r	  r·   r³   rË   )rÐ	  rï   rÔ  r
  r�	  Ú_status_adapterÚ_status_chat_idÚ_status_thread_metadatas      €€€€€r!   Ú_status_callback_syncz7GatewayRunner._run_agent.<locals>._status_callback_syncû%  sº   ø€ Ø"ð Ð*<Ð*<Ñ*>Ô*>ð Ø�ð
OÝÔ0Ø#×(Ò(Ø'ØØ!8ð )ñ ô ð
 #ñô ð ð ð øõ ð Oð Oð OÝ—’Ð=¸zÈ2ÑNÔNÐNÐNÐNÐNÐNÐNÐNøøøøðOøøøs   ‘+> ¾
A/ÁA*Á*A/c                  ó
  •‡T‡U‡V‡W‡X‡Y— ‰spdt           j        d<   t          t          j        dd¦  «        ¦  «        } ‰tj        ‰[j        k    rdn‰tj        j        }‰hpd}‰gpd                     ¦   «         }|r|dz   |z                        ¦   «         }‰qj        r|dz   ‰qj        z                        ¦   «         }	 t          t          dd¬	¦  «         n2# t          $ r t          t          dd
¬	¦  «         Y nt          $ r Y nw xY w	 ‰q                     ‰t‰s‰x¬¦  «        \  }}t                               d||                     d¦  «        ‰spd¦  «         n!# t          $ r}d|› �g dg dœcY d }~S d }~ww xY w‰qj        }‰q                     ‰t‰s¬¦  «        }|‰q_        ‰q                     ¦   «         ‰q_        d ŠYd }	t-          t-          ‰qdd ¦  «        dd ¦  «        }
|
€ddlm}  |¦   «         }
 ‰n‰x|d¦  «        }|€|
j        o
|
j        dk    nt7          |¦  «        }|}‰k}|}|s|ræ	 ddlm}m} ‰qj                             ‰tj        ¦  «        }|r‰t-          |dd¦  «        }|stA          d¦  «        ‚|
j!        }d}‰tj        ‰[j"        k    rd}d} ||
j#        |
j$        ||¬¦  «        } ||‰tj%        |‰_rd‰_ind ¬¦  «        ŠY|rdtL          dd fˆ`ˆYfd„}	‰Y‰ud<   n2# t          $ r%}t                               d |¦  «         Y d }~nd }~ww xY wdd!œdtL          d"t6          dd fˆ^ˆ`ˆaˆcˆdˆYfd#„}‰q '                    ‰l||¦  «        }‰q (                    |d$         |d%         ‰i|¦  «        }d }t-          ‰qd&d ¦  «        }t-          ‰qd'd ¦  «        }|r¯|�­|5  |                     ‰s¦  «        }|r||d(         |k    rp|d         }tS          |d)¦  «        r'	 | *                    ‰s¦  «         n# tV          $ r Y nw xY w‰q ,                    |‰]¦  «         t                               d*‰s¦  «         d d d ¦  «         n# 1 swxY w Y   |�€w ‰ZdŠd$|d$         i|d%         ¤i d+| “d,d“d-d“d.‰i“d/|pd “d0‰qj-        pd “d1|“d2‰qj        “d3|                     d3¦  «        “d4|                     d5¦  «        “d6|                     d7¦  «        “d8|                     d9¦  «        “d:|                     d;¦  «        “d<|                     d=d¦  «        “d>|                     d?¦  «        “d@‰r“dA|“dB‰tj.        “dC‰tj/        “dD‰tj%        “dE‰tj0        “dF‰tj1        “d‰tj2        “dG‰s“dH‰qj3        “dI‰qj4        “¤Ž}|r7|�5|5  ||f|‰s<   ‰q 5                    ¦   «          d d d ¦  «         n# 1 swxY w Y   t                               dJ‰s|¦  «         ‰vr‰mnd |_6        ‰\j7        r‰end |_8        |	|_9        |r|nd |_:        ‰b|_;        ||_<        ‰qj        |_=        |                     d3¦  «        |_>        t          j@        ¦   «         ŠWg ŠUt          jA        ¦   «         ŠVdKtL          dd fˆ^ˆ`ˆaˆcˆdfdL„ŠXd‹ˆUˆVˆWˆXfdM„} dKtL          dd fˆUˆVˆWˆXˆ`ˆafdN„}!|!|_B        ‰arQ‰srOt-          t‡          ‰a¦  «        dOd ¦  «        �‰a D                    ‰s| ‰p¬P¦  «         nt-          ‰adQd ¦  «        }"|"�| |"‰s<   |‰fd<   tS          |dR¦  «        r|jE        nd ‰wd<   g }#‰jD ]ù}$|$                     dS¦  «        }%|%sŒ|%dTv rŒ|%dUk    rŒ&dV|$v }&dW|$v }'|%dXk    }(|&s|'s|(r4dY„ |$ F                    ¦   «         D ¦   «         })|# G                    |)¦  «         Œn|$                     dZ¦  «        }*|*rt|$                     d[¦  «        r|$                     d\d]¦  «        }+d^|+› d_|*› �}*|%|*d`œ},|%dak    r!dbD ]}-|$                     |-¦  «        }.|.r|.|,|-<   Œ|# G                    |,¦  «         Œút‘          ¦   «         }/|#D ]œ}0|0                     dS¦  «        dcv rƒ|0                     dZd¦  «        }1dd|1v rit“          jJ        de|1¦  «        D ]S}2|2 K                    d(¦  «                             ¦   «          L                    df¦  «        }3|3r|/ M                    |3¦  «         ŒTŒ�ddglNmO}4mP}5mQ}6mR}7 dht¦          dd fˆTˆ^ˆaˆcˆdfdi„}8t-          ‰qdji ¦  «        }9‰sr|9 T                    ‰sd ¦  «        nd }:|:r|:dz   ‰lz   Šld };‰sr3	 ‰qjU        jV                             ‰s¦  «        };n# t          $ r d };Y nw xY wt7          |;d uot-          |;dkd¦  «        ¦  «        }<|<r/t-          |;dld ¦  «        pdm}=|=dmk    rdnn	|=dok    rdpndq}>dr|>› ds�‰lz   Šln&|#r$|#dt                              dS¦  «        dXk    rdu‰lz   Šl‰spdŠT |6‰T¦  «        }? |4‰T|8¦  «         	 | W                    ‰l|#‰r¬v¦  «        }@ |7‰T¦  «          |5|?¦  «         n#  |7‰T¦  «          |5|?¦  «         w xY w|@‰od<   ‰Y�‰Y X                    ¦   «          |@                     dw¦  «        }Ad}Bd}Cd}D‰fd         }E|ErHtS          |Edx¦  «        r8t-          |EjY        dyd¦  «        }Bt-          |Edzd¦  «        }Ct-          |Ed{d¦  «        }D|Ert-          |Ed$d ¦  «        nd }F|As•|@                     d|¦  «        rd}|@d|         › �nd}G|G|@                     d~g ¦  «        |@                     dd¦  «        |@                     d€d¦  «        |@                     d�d¦  «        ‰wd         pg tµ          |#¦  «        |B|C|D|Fd‚œS dd|Av�r<g }Hd}I|@                     d~g ¦  «        D ]©}$|$                     dS¦  «        dcv r�|$                     dZd¦  «        }*dd|*v rvt“          jJ        de|*¦  «        D ]Z}J|J K                    d(¦  «                             ¦   «          L                    df¦  «        }K|Kr|K|/vr|H G                    dd|K› �¦  «         Œ[dƒ|*v rd}IŒª|Hrvt‘          ¦   «         }Lg }M|HD ]0}N|N|Lvr*|L M                    |N¦  «         |M G                    |N¦  «         Œ1|Ir|M [                    ddƒ¦  «         |Ad„z   d„ \                    |M¦  «        z   }A‰fd         }d}O|r†‰sr„tS          |d@¦  «        rt|j]        ‰rk    rid}Ot           ^                    d…‰r|j]        ¦  «         ‰qjU        jV                             ‰s¦  «        },|,r%|j]        |,_]        ‰qjU         _                    ¦   «          |rt-          |d@‰r¦  «        n‰r}P|Ordntµ          |#¦  «        }Q|ArY‰qj3        rR	 dd†l`ma}R ‰od         r‰od                              d~g ¦  «        ng }S |R‰qj3        |P‰l|A|S¦  «         n# t          $ r Y nw xY w|A|@                     d‡¦  «        ‰od         r‰od                              d~g ¦  «        ng ‰od         r‰od                              dd¦  «        nd‰wd         pg |Q|B|C|D|F|P|@                     dˆd¦  «        d‰œS )ŒNrp   ÚHERMES_SESSION_KEYrs   rä  r  rÛ  Tr-   )r4  r/   zlatin-1r+  z3run_agent resolved: model=%s provider=%s session=%sra   u'   âš ï¸� Provider authentication failed: r   r‹	  rŸ  r)  r”	  r•	  rë  r—	  rš	  z(skip streaming for non-editable platformFr›	  rF  r 	  r]  r   c                 óJ   •—  ‰¦   «         r‰                      | ¦  «         d S d S rr  )r°	  )r]  r�	  rµ	  s    €€r!   Ú_stream_delta_cbzDGatewayRunner._run_agent.<locals>.run_sync.<locals>._stream_delta_cb‚&  s;   ø€ Ø#5Ð#5Ñ#7Ô#7ð !DØ$4×$=Ò$=¸dÑ$CÔ$CÐ$CÐ$CÐ$Cð!Dð !Dré   z$Could not set up stream consumer: %s)Úalready_streamedr
  c                ó�  •—  ‰¦   «         sd S ‰�.|r‰                      ¦   «          n‰                     | ¦  «         d S |s%‰r#t          | pd¦  «                             ¦   «         sd S 	 t	          j        ‰                     ‰| ‰¬¦  «        ‰¦  «         d S # t          $ r&}t           	                    d|¦  «         Y d }~d S d }~ww xY w)Nrp   r  z$interim_assistant_callback error: %s)
Úon_segment_breakÚon_commentaryrò   ró   rž  r 
  r	  r·   r³   rË   )	r]  r
  rÔ  r
  r�	  r
  r	
  r

  rµ	  s	      €€€€€€r!   Ú_interim_assistant_cbzIGatewayRunner._run_agent.<locals>.run_sync.<locals>._interim_assistant_cb‰&  s  ø€ Ø)Ð)Ñ+Ô+ð Ø�FØ#Ð/Ø'ð =Ø(×9Ò9Ñ;Ô;Ð;Ð;à(×6Ò6°tÑ<Ô<Ð<Ø�FØ#ð ¨?ð Å#ÀdÀjÈbÁ/Ä/×BWÒBWÑBYÔBYð Ø�Fð
MÝÔ4Ø'×,Ò,Ø+Ø Ø%<ð -ñ ô ð
 'ñô ð ð ð øõ !ð Mð Mð MÝ—L’LÐ!GÈÑLÔLÐLÐLÐLÐLÐLÐLÐLøøøøðMøøøs   Á(+B Â
CÂC Ã Crb   rº   r¬  rª  r)   rq	  z#Reusing cached agent for session %srÎ  r±  ræ  r³  Úephemeral_system_promptÚprefill_messagesr¢  r@  r=  rç  rè  ré  rˆ  rê  rë  rì  r¶  rí  rî  rï  rð  rM  r  rp  rÖ  rC  rQ  rB  Úgateway_session_keyrñ  rÁ   z)Created new agent for session %s (sig=%s)rï   c                 óâ   •— ‰r
 ‰¦   «         sd S 	 t          j        ‰                     ‰| ‰¬¦  «        ‰¦  «         d S # t          $ r&}t                               d|¦  «         Y d }~d S d }~ww xY w)Nr  z$background_review_callback error: %sr
  )rï   rÔ  r
  r�	  r
  r	
  r

  s     €€€€€r!   Ú_deliver_bg_review_messagezNGatewayRunner._run_agent.<locals>.run_sync.<locals>._deliver_bg_review_messageò&  s¸   ø€ Ø&ð Ð.@Ð.@Ñ.BÔ.Bð Ø�Fð
MÝÔ4Ø'×,Ò,Ø+Ø#Ø%<ð -ñ ô ð
 'ñô ð ð ð øõ !ð Mð Mð MÝ—L’LÐ!GÈÑLÔLÐLÐLÐLÐLÐLÐLÐLøøøøðMøøøs   ‘+> ¾
A.ÁA)Á)A.c                  óÊ   •— ‰                      ¦   «          ‰5  t          ‰¦  «        } ‰                     ¦   «          d d d ¦  «         n# 1 swxY w Y   | D ]} ‰|¦  «         Œd S rr  )r½  r¹   r  )rã  ÚqueuedÚ_bg_review_pendingÚ_bg_review_pending_lockÚ_bg_review_releaser
  s     €€€€r!   Ú_release_bg_review_messageszOGatewayRunner._run_agent.<locals>.run_sync.<locals>._release_bg_review_messages'  s¿   ø€ Ø"×&Ò&Ñ(Ô(Ð(Ø,ð /ð /Ý"Ð#5Ñ6Ô6�GØ&×,Ò,Ñ.Ô.Ð.ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /ð &ð 7ð 7�FØ.Ð.¨vÑ6Ô6Ð6Ð6ð7ð 7s   ˜$AÁAÁAc                 ó  •— ‰r
 ‰¦   «         sd S ‰                      ¦   «         sR‰5  ‰                      ¦   «         s#‰                     | ¦  «         	 d d d ¦  «         d S 	 d d d ¦  «         n# 1 swxY w Y    ‰| ¦  «         d S rr  )Úis_setrá   )rï   r
  r
  r
  r
  r�	  r
  s    €€€€€€r!   Ú_bg_review_sendzCGatewayRunner._run_agent.<locals>.run_sync.<locals>._bg_review_send
'  s  ø€ Ø&ð Ð.@Ð.@Ñ.BÔ.Bð Ø�FØ)×0Ò0Ñ2Ô2ð #Ø0ð #ð #Ø1×8Ò8Ñ:Ô:ð #Ø.×5Ò5°gÑ>Ô>Ð>Ø"ð#ð #ð #ñ #ô #ð #ð #ð #ð#ð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð +Ð*¨7Ñ3Ô3Ð3Ð3Ð3s   ¦+A+Á+A/Á2A/Úregister_post_delivery_callbackrÆ  rÈ  rÜ  r©  )rÝ  rà  rŠ  ra  Útoolc                 ó&   — i | ]\  }}|d k    ¯||“ŒS )rÞ  r  )r  r+  rÏ  s      r!   rÁ  z>GatewayRunner._run_agent.<locals>.run_sync.<locals>.<dictcomp>F'  s(   € Ð RÐ RÐ R©$¨!¨QÀÀkÒAQÐAQ  AÐAQÐAQÐAQré   rÊ  ÚmirrorÚmirror_sourcezanother sessionz[Delivered from rI  r­  r¬  )r¾  Úreasoning_detailsÚcodex_reasoning_items)r$
  r‡  zMEDIA:zMEDIA:(\S+)z",})Úregister_gateway_notifyÚreset_current_session_keyÚset_current_session_keyÚunregister_gateway_notifyÚapproval_datac           	      ó>  •— ‰	                      ‰
¦  «         |                      dd¦  «        }|                      dd¦  «        }t          t          ‰	¦  «        dd¦  «        �ž	 t	          j        ‰	                     ‰
|‰|‰¬¦  «        ‰¦  «                             d¬	¦  «        }|j        rdS t           
                    d
|j        ¦  «         n2# t          $ r%}t           
                    d|¦  «         Y d}~nd}~ww xY wt          |¦  «        dk    r|dd…         dz   n|}d|› d|› d�}	 t	          j        ‰	                     ‰
|‰¬¦  «        ‰¦  «                             d¬	¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)aY  Send the approval request to the user from the agent thread.

                If the adapter supports interactive button-based approvals
                (e.g. Discord's ``send_exec_approval``), use that for a richer
                UX.  Otherwise fall back to a plain text message with
                ``/approve`` instructions.
                r¬   rp   rÜ  zdangerous commandÚsend_exec_approvalN)rC  r¬   rê   rÜ  rÌ  rØ  rÌ  zLButton-based approval failed (send returned error), falling back to text: %sz6Button-based approval failed, falling back to text: %srÍ  r®  u4   âš ï¸� **Dangerous command requires approval:**
```
z
```
Reason: zš

Reply `/approve` to execute, `/approve session` to approve this pattern for the session, `/approve always` to approve permanently, or `/deny` to cancel.r  z#Failed to send approval request: %s)Úpause_typing_for_chatr¸   rÜ   rK  rž  r 
  r0
  rG  r¸  r³   r´   rO  r·   rÞ   r	  )r.
  rE  rã  Ú_approval_resultrÔ  Úcmd_previewr  Ú_approval_session_keyr
  r
  r	
  r

  s          €€€€€r!   Ú_approval_notify_synczIGatewayRunner._run_agent.<locals>.run_sync.<locals>._approval_notify_syncu'  s:  ø€ ð  ×5Ò5°oÑFÔFÐFà#×'Ò'¨	°2Ñ6Ô6�Ø$×(Ò(¨Ð8KÑLÔL�õ
 �4 Ñ0Ô0Ð2FÈÑMÔMÐYðÝ+2Ô+KØ+×>Ò>Ø(7Ø(+Ø,AØ,0Ø)@ð ?ñ ô ð +ñ	,ô 	,÷ !š&¨˜&Ñ,Ô,ð )ð ,Ô3ð #Ø"˜FÝŸšØjØ,Ô2ñô ð ð øõ %ð ð ð ÝŸšØTÐVXñô ð ð ð ð ð ð øøøøðøøøõ 47°s±8´8¸c²>°>˜c $ 3 $œi¨%Ñ/Ð/Às�ðhØ'ðhð hà#ðhð hð hð ð
LÝÔ4Ø'×,Ò,Ø+ØØ%<ð -ñ ô ð
 'ñô ÷ ’f R�fÑ(Ô(Ð(Ð(Ð(øÝ ð Lð Lð LÝ—L’LÐ!FÈÑKÔKÐKÐKÐKÐKÐKÐKÐKøøøøðLøøøs7   Á"AC Â, C Ã
C<ÃC7Ã7C<Ä+?E, Å,
FÅ6FÆFr  Úresume_pendingÚresume_reasonr÷  za gateway restartrø  za gateway shutdownza gateway interruptionzD[System note: Your previous turn in this session was interrupted by z». The conversation history below is intact. If it contains unfinished tool result(s), process them first and summarize what was accomplished, then address the user's new message below.]

rE  a)  [System note: Your previous turn was interrupted before you could process the last tool result(s). The conversation history contains tool outputs you haven't responded to yet. Please finish processing those results and summarize what was accomplished, then address the user's new message below.]

)Úconversation_historyrÔ  rÉ  r:  râ  Úsession_prompt_tokensÚsession_completion_tokensrO  rC  rË  rÌ  rÍ  rÛ  )rÉ  rË  rÌ  rÍ  rÛ  rÜ  rß  râ  ry  rz  rb   z[[audio_as_voice]]rÛ   u/   Session split detected: %s â†’ %s (compression))Úmaybe_auto_titler×  r¤	  )rÉ  r×  rË  rÌ  rÜ  rß  râ  ry  rz  rb   rM  r¤	  r  rS  )br   r   rµ  r²   r  r   r!  ró   rŒ  r'   Ú	_env_pathÚUnicodeDecodeErrorr·   r8  r³   rË   r¸   r–  r¡  rŽ  r�  r�  rÜ   rà  r–	  r  r©	  r¶  rª	  r˜	  r™	  r‡  r¶   rž	  rU  rœ	  r�	  rC  rò   rB  rK	  r  rq	  ÚKeyErrorrl	  rŠ  rp  rÖ  rQ  rB  rF  r±  r˜  r~	  Útool_progress_callbackr£  Ústep_callbackÚstream_delta_callbackÚinterim_assistant_callbackÚstatus_callbackr¢  r@  r=  r©  rŸ  r«  Úbackground_review_callbackrK  r#
  rÜ  rò  rá   r½  rl  ÚfinditerrØ  rô  r  r$  r*
  r+
  r,
  r-
  rÉ   rT  r›  r  rò  r­	  r:  rÞ   rv  râ   rM  rÊ   r/  Úagent.title_generatorr;
  )yrÎ  ró  Úcombined_ephemeralÚevent_channel_promptrb   r7  r½   rô  r¢  r
  r¶	  r–	  r·	  r¸	  Ú_want_stream_deltasÚ_want_interim_messagesÚ_want_interim_consumerr˜	  r™	  rˆ  r¹	  rº	  r»	  r¼	  r½	  r
  rõ  Ú_sigrq   rÚ  r  rˆ  r
  r"
  Ú_pdcÚagent_historyr  r©  Úhas_tool_callsÚhas_tool_call_idÚis_tool_messageÚ	clean_msgrÊ  Ú
mirror_srcrÒ   Ú_rkeyÚ_rvalÚ_history_media_pathsÚ_hmÚ_hcÚ_matchÚ_pr*
  r+
  r,
  r-
  r5
  Ú_pending_notesÚ_msnÚ_resume_entryÚ_is_resume_pendingÚ_reasonÚ_reason_phraseÚ_approval_session_tokenrG  rÉ  Ú_last_prompt_toksÚ_input_toksÚ_output_toksr  Ú_resolved_modelÚ	error_msgÚ
media_tagsÚhas_voice_directiver×  r   ÚseenÚunique_tagsr6  Ú_session_was_splitÚeffective_session_idÚ_effective_history_offsetr;
  Úall_msgsr4
  r
  r
  r
  r
  rµ	  r¦  r�   r
  rÈ	  r
  Ú_progress_thread_idr�	  r
  r
  r	
  r

  r
  rå	  r¬  rÂ  r³  rF  Ú"interim_assistant_messages_enabledrï   rì	  rÖ  Úresult_holderrŠ  r¿  rM  rê   r$  Ústream_consumer_holderÚtool_progress_enabledÚtools_holderr,  sy                                                                                       @@@@@@€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€r!   rö  z*GatewayRunner._run_agent.<locals>.run_sync
&  sD  øøøøøøø€ ð 0;Ð/@¸b�BŒJÐ+Ñ,õ !¥¤Ð+BÀDÑ!IÔ!IÑJÔJˆNð %+¤O°x´~Ò$EÐ$E˜5˜5È6Ì?ÔK`ˆLð "0Ð!5°2ÐØ$2Ð$8°b×#?Ò#?Ñ#AÔ#AÐ Ø#ð bØ&8¸6Ñ&AÐDXÑ&X×%_Ò%_Ñ%aÔ%aÐ"ØÔ,ð kØ&8¸6Ñ&AÀDÔDaÑ&a×%hÒ%hÑ%jÔ%jÐ"ðÝ�I°¸wÐGÑGÔGÐGÐGøÝ%ð Jð Jð JÝ�I°¸yÐIÑIÔIÐIÐIÐIÝð ð ð Ø�ðøøøðØ(,×(KÒ(KØ!Ø +Ø +ð )Lñ )ô )Ñ%��~õ
 —’ØIØ˜>×-Ò-¨jÑ9Ô9¸;Ð;LÈ"ñô ð ð øõ ð ð ð à&UÐPSÐ&UÐ&UØ "Ø!"Øð	ð ð ð ð ð ð ð øøøøðøøøð Ô'ˆBØ#×EÒEØØ'ð  Fñ  ô  Ðð &6ˆDÔ"Ø!%×!8Ò!8Ñ!:Ô!:ˆDÔà#ÐØ#ÐÝ�G D¨(°DÑ9Ô9¸;ÈÑMÔMˆEØˆ}Ø:Ð:Ð:Ð:Ð:Ð:Ø'˜Ñ)Ô)�ð
 6Ð5Ø˜\¨;ñô ˆOð #Ð*ð ”Ð: %¤/°UÒ":øå˜/Ñ*Ô*ð ð
 #5ÐØ%GÐ"Ø%;Ð"Ø"ð 'RÐ&<ð 'Rð&RØcÐcÐcÐcÐcÐcÐcÐcØ#œ}×0Ò0°´ÑAÔA�HØð !Eõ 29¸ÐC]Ð_cÑ1dÔ1dÐ.Ø5ð [Ý".Ð/YÑ"ZÔ"ZÐZØ,1¬LÐ)ð (-˜Ø!œ?¨h¬oÒ=Ð=Ø02Ð-Ø+/˜LØ(<Ð(<Ø*/Ô*=Ø-2Ô-CØ#4Ø(4ð	)ñ )ô )˜ð ,AÐ+@Ø$,Ø$*¤NØ#0ØK^Ð%h kÐ3FÐ%GÐ%GÐdhð	,ñ ,ô ,Ð(ð /ð DðDµsð D¸tð Dð Dð Dð Dð Dð Dð Dð 5EÐ.¨qÑ1øøÝ ð Rð Rð RÝ—L’LÐ!GÈÑQÔQÐQÐQÐQÐQÐQÐQøøøøðRøøøð NSð Mð Mð M­Cð MÅdð MÐW[ð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð. ×8Ò8¸À%ÈÑXÔXˆJð
 ×/Ò/Ø˜7Ô#Ø˜9Ô%Ø Ø"ñ	ô ˆDð ˆEÝ! $Ð(;¸TÑBÔBˆKÝ˜T >°4Ñ8Ô8ˆFØð Y˜vÐ1Ø ð Yð YØ#ŸZšZ¨Ñ4Ô4�FØð 
Y &¨¤)¨tÒ"3Ð"3Ø & q¤	˜õ # 6¨=Ñ9Ô9ð %ð%Ø &× 2Ò 2°;Ñ ?Ô ?Ð ?Ð ?øÝ#+ð %ð %ð %Ø $ ð%øøøà×8Ò8¸Ð@PÑQÔQÐQÝŸšÐ%JÈKÑXÔXÐXðYð Yð Yñ Yô Yð Yð Yð Yð Yð Yð Yøøøð Yð Yð Yð Yð ‰}à˜ð ð Ø$ WÔ-ðà  Ô+ðð ð ð $2 >ðð  $˜tð	ð
 %* Eðð &6Ð%5ðð -?Ð,FÀ$øðð &*Ô%;Ð%C¸tøðð &6Ð%5ðð "&Ô!3Ð!3ðð '1§n¢nÐ5HÑ&IÔ&IÐ&Iðð ')§f¢f¨V¡n¤n nðð ')§f¢f¨XÑ&6Ô&6Ð&6ðð %'§F¢F¨7¡O¤O Oðð #%§&¢&¨¡.¤. .ðð  13·²Ð7KÈUÑ0SÔ0SÐ0Sð!ð" .0¯VªVÐ4EÑ-FÔ-FÐ-Fð#ð$  *˜zð%ð& *˜\ð'ð( #œN˜Nð)ð* %Ô.Ð.ð+ð, #œN˜Nð-ð. %Ô.Ð.ð/ð0 %Ô.Ð.ð1ð2 %Ô.Ð.ð3ð4 )4¨ð5ð6  $Ô/Ð/ð7ð8 $(Ô#7Ð#7ð9ð �ð< ð 8 6Ð#5Ø$ð 8ð 8Ø/4°d¨m˜˜{Ñ+Ø×5Ò5Ñ7Ô7Ð7ð8ð 8ð 8ñ 8ô 8ð 8ð 8ð 8ð 8ð 8ð 8øøøð 8ð 8ð 8ð 8õ —’ÐHÈ+ÐW[Ñ\Ô\Ð\ð AVÐ+_Ð+<Ð+<Ð[_ˆEÔ(Ø9CÔ9PÐ"ZÐ"5Ð"5ÐVZˆEÔØ*:ˆEÔ'ØH^Ð/hÐ/DÐ/DÐdhˆEÔ,Ø$9ˆEÔ!Ø%5ˆEÔ"Ø!%Ô!3ˆEÔØ&0§n¢nÐ5HÑ&IÔ&IˆEÔ#å!*¤Ñ!2Ô!2ÐØ,.ÐÝ&/¤nÑ&6Ô&6Ð#ðMµCð M¸Dð Mð Mð Mð Mð Mð Mð Mð Mð Mð Mð7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð 7ð4­ð 4°ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 4ð 0?ˆEÔ,ð ð 
H ;ð 
HÝ�4 Ñ0Ô0Ð2SÐUYÑZÔZÐfØ#×CÒCØ#Ø3Ø#1ð Dñ ô ð ð õ # ?Ð4NÐPTÑUÔU�DØÐ'Ø,G˜˜[Ñ)ð $ˆL˜‰Oå-4°U¸GÑ-DÔ-DÐN˜eœk˜kÈ$ˆL˜‰Oð ˆMØð *4ð *4�Ø—w’w˜v‘”�Øð Øð Ð,Ð,Ð,Øð ˜8Ò#Ð#Øð ".°Ð!4�Ø#1°SÐ#8Ð Ø"&¨&¢.�à!ð 4Ð%5ð 4¸ð 4Ø RÐ R°#·)²)±+´+Ð RÑ RÔ R�IØ!×(Ò(¨Ñ3Ô3Ð3Ð3ð "Ÿgšg iÑ0Ô0�GØð 4àŸ7š7 8Ñ,Ô,ð QØ),¯ª°ÐBSÑ)TÔ)T˜JØ&P¸Ð&PÐ&PÀwÐ&PÐ&P˜GØ)-¸'Ð BÐ B˜ð
   ;Ò.Ð.ð*Cð 9ð 9 à(+¯ª°©¬ Ø#(ð !9Ø38 E¨%¡LøØ%×,Ò,¨UÑ3Ô3Ð3øõ
 ),©¬Ð Ø$ð =ð =�Ø—7’7˜6‘?”?Ð&:Ð:Ð:ØŸ'š' )¨RÑ0Ô0�CØ 3��Ý&(¤k°.À#Ñ&FÔ&Fð =ð =˜FØ!'§¢¨a¡¤×!6Ò!6Ñ!8Ô!8×!?Ò!?ÀÑ!FÔ!F˜BØ!ð =Ø 4× 8Ò 8¸Ñ <Ô <Ð <øøðð ð ð ð ð ð ð ð ð ð ð ðALµTð AL¸dð ALð ALð ALð ALð ALð ALð ALð ALð ALð ALõH % TÐ+AÀ2ÑFÔFˆNØ<GÐQ�>×%Ò% k°4Ñ8Ô8Ð8ÈTˆDØð 2Ø ™-¨'Ñ1�ð !ˆMØð )ð)Ø$(Ô$6Ô$?×$CÒ$CÀKÑ$PÔ$P�M�MøÝ ð )ð )ð )Ø$(�M�M�Mð)øøøå!%Ø TÐ)Ð]­g°mÐEUÐW\Ñ.]Ô.]ñ"ô "Ðð "ð Ý! -°À$ÑGÔGÐ\ÐK\�ð Ð"3Ò3Ð3ð (Ð'ð Ð"4Ò4Ð4ð .Ð-à1ð ð+Ø(ð+ð +ð +ð
 ñð �ð ð  =°Ô#4×#8Ò#8¸Ñ#@Ô#@ÀFÒ#JÐ#Jð5ð
 ñð ð %0Ð$5°2Ð!Ø&=Ð&=Ð>SÑ&TÔ&TÐ#Ø#Ð#Ð$9Ð;PÑQÔQÐQðCØ×/Ò/°ÈmÐeoÐ/ÑpÔp�à)Ð)Ð*?Ñ@Ô@Ð@Ø)Ð)Ð*AÑBÔBÐBÐBøð *Ð)Ð*?Ñ@Ô@Ð@Ø)Ð)Ð*AÑBÔBÐBÐBøøøØ%ˆM˜!Ñð  Ð+Ø ×'Ò'Ñ)Ô)Ð)ð $ŸZšZÐ(8Ñ9Ô9ˆNð !"ÐØˆKØˆLØ! !”_ˆFØð O�' &Ð*>Ñ?Ô?ð OÝ$+¨FÔ,EÐG[Ð]^Ñ$_Ô$_Ð!Ý% fÐ.EÀqÑIÔI�Ý& vÐ/JÈAÑNÔN�Ø@FÐP�g f¨g°tÑ<Ô<Ð<ÈDˆOà!ð Ø;A¿:º:ÀgÑ;NÔ;NÐVÐ7 f¨W¤oÐ7Ð7Ð7ÐTV�	à&/Ø &§
¢
¨:°rÑ :Ô :Ø!'§¢¨K¸Ñ!;Ô!;Ø$Ÿjšj¨°5Ñ9Ô9Ø-3¯ZªZÐ8OÐQVÑ-WÔ-WØ)¨!œ_Ð2°Ý&)¨-Ñ&8Ô&8Ø*;Ø$/Ø%1Ø,ðð ð ð0 ˜~Ð-Ñ-Ø�
Ø&+Ð#Ø!Ÿ:š: j°"Ñ5Ô5ð 	;ð 	;�CØ—w’w˜v‘”Ð*>Ð>Ð>Ø"%§'¢'¨)°RÑ"8Ô"8˜Ø# wÐ.Ð.Ý)+¬°^ÀWÑ)MÔ)Mð Gð G Ø',§{¢{°1¡~¤~×';Ò';Ñ'=Ô'=×'DÒ'DÀUÑ'KÔ'K Ø#'ð !G¨DÐ8LÐ,LÐ,LØ$.×$5Ò$5°o¸t°o°oÑ$FÔ$FÐ$FøØ3°wÐ>Ð>Ø6:Ð 3øàð 	TÝ™5œ5�DØ"$�KØ)ð 4ð 4˜Ø d˜?˜?Ø ŸHšH S™MœM˜MØ'×.Ò.¨sÑ3Ô3Ð3øØ*ð DØ#×*Ò*¨1Ð.BÑCÔCÐCØ%3°dÑ%:¸T¿YºYÀ{Ñ=SÔ=SÑ%S�Nð ! ”OˆEØ!&ÐØð 	/˜ð 	/­°¸Ñ)EÔ)Eð 	/È%ÔJZÐ^hÒJhÐJhØ%)Ð"Ý—’ØEØ Ô 0ñô ð ð Ô*Ô3×7Ò7¸ÑDÔD�Øð /Ø',Ô'7�EÔ$ØÔ&×,Ò,Ñ.Ô.Ð.àOTÐ#d¥7¨5°,À
Ñ#KÔ#KÐ#KÐZdÐ ð .@Ð(W¨¨ÅSÈÑEWÔEWÐ%ð ð  $Ô"2ð ðØFÐFÐFÐFÐFÐFØGTÐUVÔGWÐ_˜}¨QÔ/×3Ò3°JÀÑCÔCÐCÐ]_�HØ$Ð$ØÔ(Ø,ØØ&Ø ñô ð ð øõ !ð ð ð Ø�Dðøøøð #1Ø"(§*¢*Ð-=Ñ">Ô">ØDQÐRSÔDTÐ\˜M¨!Ô,×0Ò0°¸RÑ@Ô@Ð@ÐZ\ØERÐSTÔEUÐ\˜]¨1Ô-×1Ò1°+¸qÑAÔAÐAÐ[\Ø% aœÐ.¨BØ";Ø&7Ø +Ø!-Ø(Ø2Ø&,§j¢jÐ1EÀuÑ&MÔ&Mðð ð sÉ   Â6C Ã!C=Ã1	C=Ã<C=ÄAE Å
E-Å	E(Å"E-Å(E-ÈB2K Ë
LËK<Ë<LÎ<P'ÏOÏP'Ï
O'Ï$P'Ï&O'Ï'4P'Ð'P+Ð.P+ÕVÖV	ÖV	ã$d ädädæ+g çg2ô.A u/ õ/
u<õ;u<c               “   óº   •K  — t          d¦  «        D ]G} ‰d         �#‰d                              ¦   «         ƒ d{V —†  dS t          j        d¦  «        ƒ d{V —† ŒHdS )z8Wait for the stream consumer to be created, then run it.rÍ  r   NrN  )rÎ  r	  rž  rü  )rû   rr
  s    €r!   Ú_start_stream_consumerz8GatewayRunner._run_agent.<locals>._start_stream_consumer~(  s†   øè è € å˜3‘Z”Zð *ð *�Ø)¨!Ô,Ð8Ø0°Ô3×7Ò7Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ø�F�FÝ”m DÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð	*ð *ré   c               “   ó4  •K  — ‰ d         €"t          j        d¦  «        ƒ d {V —† ‰ d         ®"‰sd S ‰�6‰                     ‰‰¦  «        s t                               d‰pd‰¦  «         d S ‰ d         ‰j        ‰<   ‰j        r‰                     d¦  «         d S d S )Nr   rN  uL   Skipping stale agent promotion for %s â€” generation %s is no longer currentrp   rô  )rž  rü  rþ  r³   rÊ   r¤  rf  r…  )rå	  rŠ  r¿  rê   s   €€€€r!   Útrack_agentz-GatewayRunner._run_agent.<locals>.track_agentŠ(  sÚ   øè è € à˜q”/Ð)Ý”m DÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð ˜q”/Ð)àð Ø�ð
 Ð)°$×2NÒ2NØ˜^ñ3ô 3Ð)õ —’ØbØÐ% 2Ø"ñô ð ð
 �Ø0<¸Q´ˆDÔ  Ñ-ØŒ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7Ð7Ð7ð8ð 8ré   c               “   óF  •K  — ‰sd S 	 t          j        d¦  «        ƒ d {V —† 	 ‰j                             ‰	j        ¦  «        } | sŒ>t          | d¦  «        r‰|                      ‰¦  «        rt‰d         }|rj| j                             ‰¦  «        }|r|j        nd }t           
                    d¦  «         |                     |¦  «         ‰                     ¦   «          d S nA# t           j        $ r ‚ t          $ r%}t           
                    d|¦  «         Y d }~nd }~ww xY w�Œ)NTgš™™™™™É?Úhas_pending_interruptr   z3Interrupt detected from adapter, signaling agent...z,monitor_for_interrupt error (will retry): %s)rž  rü  r‡  r¸   r  r  rz
  r¥  r]  r³   rË   rb  r½  r®	  r·   )
rˆ  rq   Ú_peek_eventÚpending_textÚ_mon_errÚ_interrupt_detectedrå	  r¿  rê   r$  s
        €€€€€r!   Úmonitor_for_interruptz7GatewayRunner._run_agent.<locals>.monitor_for_interrupt«(  sp  øè è € Øð Ø�ð [Ý”m CÑ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð[ð  $œ}×0Ò0°´ÑAÔA�HØ#ð !Ø õ
 ˜xÐ)@ÑAÔAð "Àh×FdÒFdÐepÑFqÔFqð "Ø ,¨Q¤˜Ø ð "ð +3Ô*D×*HÒ*HÈÑ*UÔ*U˜KØ?JÐ+T¨;Ô+;Ð+;ÐPT˜LÝ"ŸLšLÐ)^Ñ_Ô_Ð_Ø!ŸOšO¨LÑ9Ô9Ð9Ø/×3Ò3Ñ5Ô5Ð5Ø!˜EøøÝÔ-ð ð ð ØÝ ð [ð [ð [Ý—L’LÐ!OÐQYÑZÔZÐZÐZÐZÐZÐZÐZøøøøð[øøøñ? [s   ¤!C  ÁBC  Ã DÃ9DÄDry   é´   c               “   ó0  •K  — ‰€d S ‰j                              ‰j        ¦  «        } | sd S 	 t          j        ‰¦  «        ƒ d {V —† t          t          j        ¦   «         ‰z
  dz  ¦  «        }‰
d         }d}|rÀt          |d¦  «        r°	 |                     ¦   «         }d|d         › d|d	         › �g}|                     d
¦  «        r| 	                    d|d
         › �¦  «         n)| 	                    |                     dd¦  «        ¦  «         dd 
                    |¦  «        z   }n# t          $ r Y nw xY w	 |                      ‰j        d|› d|› d�‰	¬¦  «        ƒ d {V —† n2# t          $ r%}t                               d|¦  «         Y d }~nd }~ww xY w�Œl)NTrÐ  r   rp   rß  rÒ  rÍ  r  rÎ  rÏ  rÓ  r�  r  rÕ  u   â�³ Still working... (rÑ  rÖ  r  z#Long-running notification error: %s)r‡  r¸   r  rž  rü  rµ  rV  r  rß  rá   râ   r·   r	  rC  r³   rË   )Ú_notify_adapterÚ_elapsed_minsÚ
_agent_refÚ_status_detailÚ_arÕ  Ú_neÚ_NOTIFY_INTERVALÚ_notify_startr

  rå	  r¿  r$  s          €€€€€€r!   Ú_notify_long_runningz6GatewayRunner._run_agent.<locals>._notify_long_runningÜ(  s"  øè è € ØÐ'Ø�Ø"œm×/Ò/°´Ñ@Ô@ˆOØ"ð Ø�ðMÝ”mÐ$4Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ý #¥T¤Y¡[¤[°=Ñ%@ÀRÑ$GÑ HÔ H�à)¨!œ_�
Ø!#�Øð 
¥'¨*Ð6LÑ"MÔ"Mð 
ð	Ø'×<Ò<Ñ>Ô>˜Ø"\¨rÐ2BÔ/CÐ"\Ð"\ÀbÐIYÔFZÐ"\Ð"\Ð!]˜ØŸ6š6 .Ñ1Ô1ð LØ"ŸMšMÐ*J°b¸Ô6HÐ*JÐ*JÑKÔKÐKÐKà"ŸMšM¨"¯&ª&Ð1EÀrÑ*JÔ*JÑKÔKÐKØ)0°4·9²9¸VÑ3DÔ3DÑ)D˜˜øÝ$ð ð ð Ø˜ðøøøðMØ)×.Ò.ØœØ]°Ð]Ð]ÈNÐ]Ð]Ð]Ø!8ð /ñ ô ð ð ð ð ð ð ð ð øõ
 !ð Mð Mð MÝ—L’LÐ!FÈÑLÔLÐLÐLÐLÐLÐLÐLøøøøðMøøøñ/Ms+   Â	BD( Ä(
D5Ä4D5Ä9*E$ Å$
FÅ.FÆFru   rš  rw   i„  rù  rÌ  rz
  zABackup interrupt detected for session %s (monitor task state: %s)r±  r‹  rò  rß  rœ  rÐ  r)   u   âš ï¸� No activity for zB min. If the agent does not respond soon, it will be timed out in z- min. You can continue waiting or use /reset.r  z!Inactivity warning send error: %sr�  rN  rÏ  rÍ  rÎ  zaAgent idle for %.0fs (timeout %.0fs) in session %s | last_activity=%s | iteration=%s/%s | tool=%sr¦  rb  u   â�±ï¸� Agent inactive for u(    min â€” no tool calls or API responses.z!The agent appears stuck on tool `z` (rž  z!s since last activity, iteration r  z).zLast activity: rÔ  zs ago, iteration z6). The agent may have been waiting on an API response.z¢To increase the limit, set agent.gateway_timeout in config.yaml (value in seconds, 0 = no limit) and restart the gateway.
Try again, or use /reset to start fresh.rÛ   rË  )rÉ  rË  rÌ  rÜ  rß  rÍ  rÍ  rb   ÚinterruptedÚinterrupt_messagez5Ignoring control interrupt message for session %s: %srR  z9Processing queued message after agent completion: '%s...'rL  Úpending_steerz0Delivering leftover /steer as next turn: '%s...'rp   )r£  uZ   Discarding command '/%s' from pending queue â€” commands must not be passed as agent inputz=Discarding pending follow-up for session %s during gateway %sz#Processing pending message: '%s...'r_	  u^   Interrupt recursion depth %d reached for session %s â€” queueing message instead of recursing.Úqueue_message)rÉ  rË  rR	  rô  z5Stream consumer wait before queued message failed: %sr¤	  Úfinal_response_sentrÉ  zoQueued follow-up for session %s: final stream delivery not confirmed; sending first response before continuing.z7Failed to send first response before queued message: %sz_Queued follow-up for session %s: skipping resend because final streamed delivery was confirmed.rÅ  rÆ  rÈ  r$  rÁ  rÝ  r¬  )
rï   rÂ  rF  r$  rM  rê   rŠ  rÈ	  rÃ  r¬  rÊ  zjSuppressing normal final send for session %s: final delivery already confirmed (streamed=%s previewed=%s).rä  ©NNN)cr‡	  rÇ	  rõ  r¦  rl  r¶  r(  r#  r  rú  rã  rÉ  r¸   rÈ   rÉ   r  rÖ  rÛ	  rË	  rµ  r·   r   r²   rà  r�   rÉ  r&   ÚQueuerò   r?  rF  rž  rõ  rº  r¹   r‡  rC  rT  rŸ  r³  rV  Úensure_futurerû  r  rG  r!
  r  rz
  r¥  r]  r³   rÊ   r±  rb  r½  rß  r	  rË   rO  Ú_INTERRUPT_REASON_TIMEOUTrá   râ   r-  rb   rQ	  rÊ  rî   ry  rø   rè   ró   rß   rô   rõ   rà  r£  rf  rf  r_	  r  Ú_MAX_INTERRUPT_DEPTHr´   rž   rŽ
  r  r  r  r®	  rÞ  r…  rÜ   rK  rÅ  ÚcallablerÈ  rT  r‰  r«	  rý  ){r¿  rï   rÂ  rF  r$  rM  rê   rŠ  rÈ	  rÃ  r¬  ró  rã  Údisplay_configrË	  Ú_tplÚ_resolved_tprü	  rö  Úprogress_taskr¾	  rv
  rx
  Útracking_taskr
  Úinterrupt_monitorÚ_NOTIFY_INTERVAL_RAWrŠ
  Ú_notify_taskÚ_agent_timeout_rawÚ_agent_timeoutÚ_agent_warning_rawÚ_agent_warningÚ_warning_firedÚ_executor_taskÚ_inactivity_timeoutÚ_POLL_INTERVALrÙ  r±  rû   Ú_backup_adapterÚ_backup_agentÚ	_bp_eventÚ_bp_textr„
  Ú
_idle_secsÚ_actÚ_warn_adapterÚ_elapsed_warnÚ_remaining_minsÚ	_warn_errÚ_timed_out_agentÚ	_activityÚ
_last_descÚ	_secs_agoÚ	_cur_toolÚ_iter_nÚ	_iter_maxÚ_timeout_minsÚ_diag_linesr  Ú_result_for_fbÚ_run_failedÚ
_cfg_modelrG  rí   rt  rã  rŒ
  Ú_leftover_steerÚ_pending_partsÚ_pending_cmd_wordÚ_rc_pendingrV  Úwas_interruptedÚ_scrÁ  Ú
_previewedÚ_already_streamedÚfirst_responseÚ_bg_cbÚupdated_historyÚnext_sourceÚnext_messageÚnext_message_idÚnext_channel_promptÚ_followup_adapterÚ_finalÚ_is_empty_sentinelÚ	_streamedr¦  r�   rä	  rˆ
  r
  r~
  r
  r‰
  rû	  ro
  r�	  r
  r
  r	
  r

  r
  rå	  r³  rp
  ræ	  rç	  rè	  rì	  ré	  rê	  rl  rë	  rÖ  rq
  rr
  rs
  rt
  r,  s{   ````````` `                                                                               @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r!   rý  zGatewayRunner._run_agent`$  s³"  øøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøøè è € ð4 ×ÒÑ Ô ð 
	Ø×2Ò2ØØ-ØØØ%Ø'Ø-Ø!1ð 3ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	&Ð%Ð%Ð%Ð%Ð%Øˆˆˆð	M¥Dð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mõ
 +Ñ,Ô,ˆÝ+¨F¬OÑ<Ô<ˆà?Ð?Ð?Ð?Ð?Ð?Ý!Ð"5Ð"5°kÀ<Ñ"PÔ"PÑQÔQÐà$Ÿš¨°BÑ7Ô7ˆÝ˜.­$Ñ/Ô/ð 	 ØˆNð
 	CÐBÐBÐBÐBÐBð	Ø>Ð>Ð>Ð>Ð>Ð>Ø*Ð*¨;¸ÐF[Ð]^Ñ_Ô_ˆDØ$Ð$°$Ð%=¥S¨¡Y¤Y Y¸AÑ>Ô>Ð>Ð>øÝð 	ð 	ð 	ØˆDð	øøøð /Ð.¨{¸LÈ/ÑZÔZˆàð ÝŒyÐ4Ñ5Ô5ðàð 	ð 	,Ð+Ð+Ð+Ð+Ð+Ø -°Ò 6Ð ^¸6¼?ÈhÔN^Ò;^Ðð
 ŒO˜xÔ/Ò/ð ÝØ×"Ò"Ð#?Ñ@Ô@Øðñ ô ð 	+ð +@ÐI˜Ÿš™œ˜ÀTˆØ�Fˆ	Ø!˜FÐØ�sˆð !&˜wÐØ!%Ððh	$ð h	$­#ð h	$½#ð h	$Ísð h	$Õaeð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ð h	$ðd Œ?˜hœnÒ,Ð,Ø"(Ô"2Ð"FÐ6FÐÐà"(Ô"2ÐØCVÐ`˜kÐ+>Ð?Ð?Ð\`ÐðR	+ð R	+ð R	+ð R	+ð R	+ð R	+ð R	+ð R	+ð R	+ð R	+ð R	+ðj �vˆØ˜ˆØ�vˆØ"& Ðõ !Ô1Ñ3Ô3ˆØ”Zˆ
ð	>­3ð 	>½Dð 	>ÀTð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð8 œ-×+Ò+¨F¬OÑ<Ô<ˆØ œ.ˆØH[Ð"e ;Ð0CÐ"DÐ"DÐaeÐð	O­cð 	O½Cð 	OÀDð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oði		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ð i		ðX ˆØ ð 	JÝ#Ô/Ð0FÐ0FÑ0HÔ0HÑIÔIˆMð ˆð	*ð 	*ð 	*ð 	*ð 	*õ Ô)Ð*@Ð*@Ñ*BÔ*BÑCÔCˆð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8õ.  Ô+¨K¨K©M¬MÑ:Ô:ˆõ &œm™oœoÐð$	[ð $	[ð $	[ð $	[ð $	[ð $	[ð $	[ð $	[ð $	[õL $Ô/Ð0EÐ0EÑ0GÔ0GÑHÔHÐõ  %¥R¤YÐ/MÈsÑ%SÔ%SÑTÔTÐØ3GÈ!Ò3KÐ3KÐ/Ð/ÐQUÐÝœ	™œˆð	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	Mõ@ Ô*Ð+?Ð+?Ñ+AÔ+AÑBÔBˆðs	õ "'¥r¤yÐ1GÈÑ'NÔ'NÑ!OÔ!OÐØ3EÈÒ3IÐ3IÐ/Ð/ÈtˆNÝ!&¥r¤yÐ1OÐQTÑ'UÔ'UÑ!VÔ!VÐØ3EÈÒ3IÐ3IÐ/Ð/ÈtˆNØ"ˆNÝ$Ô2Ø×2Ò2°8Ñ<Ô<ñô ˆNð #(ÐØ ˆNàÑ%ð  �ð6Ý$+¤LØ'Ð(°.ð%ñ %ô %ð ð ð ð ð ð ‘G�D˜!ð ð Ø#1×#8Ò#8Ñ#:Ô#:˜Øð /×5Ò5Ñ7Ô7ð 6¸Kð 6Ø*.¬-×*;Ò*;¸F¼OÑ*LÔ*L˜Ø(4°Q¬˜Ø+ð 6°ð 6Ý$+¨OÐ=TÑ$UÔ$Uð6à$3×$IÒ$IÈ+Ñ$VÔ$Vð6ð )8Ô(I×(MÒ(MÈkÑ(ZÔ(Z˜IØ9BÐ'L y¤~ ~È˜HÝ"ŸKšKð!;à +Ø*;×*@Ò*@Ñ*BÔ*BÐ Q  È	ñ	ô ð ð *×3Ò3°HÑ=Ô=Ð=Ø/×3Ò3Ñ5Ô5Ð5ñ16ñ ð.  �ð66Ý$+¤LØ'Ð(°.ð%ñ %ô %ð ð ð ð ð ð ‘G�D˜!ð ð Ø#1×#8Ò#8Ñ#:Ô#:˜Ùà!-¨a¤�JØ!$�JØ!ð !¥g¨jÐ:PÑ&QÔ&Qð !ð!Ø#-×#BÒ#BÑ#DÔ#D˜DØ)-¯ªÐ2JÈCÑ)PÔ)P˜J˜JøÝ(ð !ð !ð !Ø ˜Dð!øøøð +ð ]¨~Ð/IØ *¨nÒ <Ð <Ø)-˜Ø(,¬×(9Ò(9¸&¼/Ñ(JÔ(J˜Ø(ð ]Ý,/°À"Ñ0DÑ,EÔ,EÐ,JÈ˜MÝ.1°>ÀNÑ3RÐWYÑ2YÑ.ZÔ.ZÐ._Ð^_˜Oð
]Ø&3×&8Ò&8Ø$*¤Nð%O¸mð %Oð %Oà7Fð%Oð %Oð %Oð .Eð '9ñ '"ô '"ð !"ð !"ð !"ð !"ð !"ð !"ð !"ð !"øõ $-ð ]ð ]ð ]Ý &§¢Ð-PÐR[Ñ \Ô \Ð \Ð \Ð \Ð \Ð \Ð \øøøøð]øøøà! ^Ò3Ð3Ø.2Ð+Øà.×5Ò5Ñ7Ô7ð 6¸Kð 6Ø*.¬-×*;Ò*;¸F¼OÑ*LÔ*L˜Ø(4°Q¬˜Ø+ð 6°ð 6Ý$+¨OÐ=TÑ$UÔ$Uð6à$3×$IÒ$IÈ+Ñ$VÔ$Vð6ð )8Ô(I×(MÒ(MÈkÑ(ZÔ(Z˜IØ9BÐ'L y¤~ ~È˜HÝ"ŸKšKð!;à +Ø*;×*@Ò*@Ñ*BÔ*BÐ Q  È	ñ	ô ð ð *×3Ò3°HÑ=Ô=Ð=Ø/×3Ò3Ñ5Ô5Ð5ñm66ðp #ñ =à#/°¤?Ð Ø�	Ø#ð ­Ð0@ÐBXÑ(YÔ(Yð ðØ$4×$IÒ$IÑ$KÔ$K˜	˜	øÝ$ð ð ð Ø˜ðøøøð 'Ÿ]š]Ð+?ÀÑKÔK�
Ø%ŸMšMÐ*BÀAÑFÔF�	Ø%ŸMšM¨.Ñ9Ô9�	Ø#Ÿ-š-Ð(8¸!Ñ<Ô<�Ø%ŸMšMÐ*:¸AÑ>Ô>�	å—’ðEà˜~¨{Ø ¨ØÐ' ñô ð ð $ð J­Ð0@À+Ñ(NÔ(Nð JØ$×.Ò.Õ/HÑIÔIÐIå # N°bÑ$8Ñ 9Ô 9Ð >¸Q�ð)°ð )ð )ð )ð�ð ð Ø×&Ò&ð=¸Ið =ð =Ø%ÐBð=ð =à%,ð=ð =à/8ð=ð =ð =ñô ð ð ð  ×&Ò&ðN¨*ð Nð N¸	ÐNð Nð NØ%,ðNð NØ/8ðNð Nð Nñô ð ð
 ×"Ò"ð?ñô ð ð '+§i¢i°Ñ&<Ô&<ØHUÐVWÔHXÐ ` ¨aÔ 0× 4Ò 4°ZÀÑ DÔ DÐ DÐ^`Ø!(Ø)¨!œ_Ð2°Ø&'Ø"ðð �ð" " !”_ˆFØ*¨1Ô-ˆNØ:HÐS˜.×,Ò,¨XÑ6Ô6Ð6ÈeˆKØÐ!¥g¨f°gÑ&>Ô&>Ð!À{Ð!Ý3Ñ5Ô5�
Ø”< :Ò-Ð-°d×6WÒ6WÐXcÐekÔeqÑ6rÔ6rÐ-ð ×,Ò,¨[Ñ9Ô9Ð9ð # 1Ô%ˆFØ”m×'Ò'¨¬Ñ8Ô8ˆGð !ˆMØˆGØð l˜'ð l kð lÝ 6°wÀÑ LÔ L�ð !%× :Ò :¸;ÈÐQ^Ñ _Ô _�Ø—:’:˜mÑ,Ô,ð l°]ð lÀvÇzÂzÐReÑGfÔGfð lØ(.¯
ª
Ð3FÑ(GÔ(GÐ%Ý4Ð5FÑGÔGð 4ÝŸšØSØ'Ð.¨3Ø-ñô ð ð ð #4˜˜Ø"ð lØ+Ô0Ð[Õ4LÈ]Ñ4[Ô4[�GÝ—L’LÐ!\Ð^eÐfiÐgiÐfiÔ^jÑkÔkÐkð ð c˜gð c¨mð cØ"(§*¢*¨_Ñ"=Ô"=�Ø"ð cØ-�GÝ—L’LÐ!SÐU\Ð]`Ð^`Ð]`ÔUaÑbÔbÐbð ð ˜7Ÿ=š=™?œ?×5Ò5°cÑ:Ô:ð Ø!(§¢¡¤×!6Ò!6°t¸QÑ!?Ô!?�ØESÐ$[ N°1Ô$5°a°b°bÔ$9×$?Ò$?Ñ$AÔ$AÐ$AÐY[Ð!Ø$ð ðØVÐVÐVÐVÐVÐVØ&˜;Ð'8Ñ9Ô9ð +Ý"ŸKšKð!Mà 1ñô ð ð
 -1˜MØ&*˜GøøÝ$ð ð ð Ø˜ðøøøð Œ~ð  =ð °Gð Ý—’ØSØÐ& 3Ø×-Ò-Ñ/Ô/ñô ð ð
 !%�Ø�àð C ñ CÝ—’ÐBÀGÈCÈRÈCÄLÑQÔQÐQð
 ð B�w wÐ0BÑCÔCð BÈð BÐXcÐgnÔgÐXÐXØÔ,¨[Ô9×?Ò?ÑAÔAÐAð $ tÔ'@Ò@Ñ@Ý—N’NðAà(¨+ñô ð ð
 #œm×/Ò/°´Ñ@Ô@�GØð D =ð DÝ3°GÔ4MÈ{Ð\iÑjÔjÐjÐjØ ð D¥W¨W°oÑ%FÔ%Fð DØ×-Ò-¨k¸7ÑCÔCÐCØ(¨Ô+Ð`À(ÐX_Ð/`Ð/`Ð`ð` ð 'Ø×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ð ð ðÝ!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð ð ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ"Ô1ð ð ð Ø˜ðøøøøøð	øøøð × Ò Ñ"Ô"Ð"Øð ð ×1Ò1Ø°ð 2ñ ô ð ð Œ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7ð 'Ð(9¸=È,ÐWð ð �Øð ðØ"˜
˜
˜
˜
˜
˜
˜
˜
øÝ"Ô1ð ð ð Ø˜ðøøøððð[ #)§*¢*¨]Ñ";Ô";�Ø&ñ <%ð 1°Ô3�CØð 
e˜{ð 
eð	eÝ")Ô"2°;ÈÐ"LÑ"LÔ"LÐLÐLÐLÐLÐLÐLÐLÐLøÝ 'Ô 4µgÔ6LÐMð %ð %ð %Ø'×.Ò.Ñ0Ô0Ð0ð%Ø&1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1øÝ#*Ô#9ð %ð %ð %Ø $ ð%øøøøøå(ð eð eð eÝ"ŸLšLÐ)`ÐbcÑdÔdÐdÐdÐdÐdÐdÐdøøøøðeøøøå!% f§j¢jÐ1EÑ&FÔ&FÑ!GÔ!G�JÝ(,ØÐK¥¨Ð.CÀUÑ!KÔ!Kð &Ø%ñ)ô )Ð%ð &,§Z¢ZÐ0@À"Ñ%EÔ%E�NØ%ð Ð.?ð ðiÝ"ŸKšKð !RØ +Ð 2¨sñô ð ð #*§,¢,Ø &¤Ø .Ø)@ð #/ñ #ô #ð ð ð ð ð ð ð ð øõ
  )ð ið ið iÝ"ŸNšNÐ+dÐfgÑhÔhÐhÐhÐhÐhÐhÐhøøøøðiøøøà'ð ÝŸšØ}Ø'Ð.¨3ñô ð õ �t G™}œ}Ð.JÈDÑQÔQÐ]Ø!(×!CÒ!CØ'Ø'5ð "Dñ "ô "˜õ $ FÑ+Ô+ð %ð%Ø & ¡¤  øÝ#,ð %ð %ð %Ø $ ð%øøøð%ð
 !ð %¥W¨WÐ6PÑ%QÔ%Qð %Ø!(Ô!A×!EÒ!EÀkÐSWÑ!XÔ!X˜Ý# FÑ+Ô+ð %ð%Ø & ¡¤  øÝ#,ð %ð %ð %Ø $ ð%øøøð #)§*¢*¨Z¸Ñ"AÔ"A�Ø$�Ø&�Ø"&�Ø&*Ð#Ø Ñ,Ý")¨-¸À4Ñ"HÔ"HÐ"RÈF�KØ)-×)KÒ)KØ+Ø*Ø /ð *Lñ *ô *ð $ð $ð $ð $ð $ð $�Lð
 $Ñ+Ø%ð> ð 'Ø×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ð ð ðÝ!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð ð ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ"Ô1ð ð ð Ø˜ðøøøøøð	øøøð × Ò Ñ"Ô"Ð"Øð ð ×1Ò1Ø°ð 2ñ ô ð ð Œ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7ð 'Ð(9¸=È,ÐWð ð �Øð ðØ"˜
˜
˜
˜
˜
˜
˜
˜
øÝ"Ô1ð ð ð Ø˜ðøøøððõ{ '.¨m¸\È4Ñ&PÔ&P�OÝ*1°-ÐAQÐSWÑ*XÔ*XÐ'ð
 %)¤M×$5Ò$5°f´oÑ$FÔ$FÐ!Ø$ð ðØ/×;Ò;Ø"œNØ%<ð <ñ ô ð ð ð ð ð ð ð ð øõ %ð ð ð Ø˜ðøøøð "Ÿ_š_Ø(Ø#1Ø+Ø&Ø)Ø +Ø#1Ø%5¸Ñ%9Ø%4Ø#6ð -ñ ô ð ð ð ð ð ð ð ð ð 'Ø×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ð ð ðÝ!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð ð ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ"Ô1ð ð ð Ø˜ðøøøøøð	øøøð × Ò Ñ"Ô"Ð"Øð ð ×1Ò1Ø°ð 2ñ ô ð ð Œ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7ð 'Ð(9¸=È,ÐWð ð �Øð ðØ"˜
˜
˜
˜
˜
˜
˜
˜
øÝ"Ô1ð ð ð Ø˜ðøøøðððKCðL ð 'Ø×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ð ð ðÝ!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð ð ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ"Ô1ð ð ð Ø˜ðøøøøøð	øøøð × Ò Ñ"Ô"Ð"Øð ð ×1Ò1Ø°ð 2ñ ô ð ð Œ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7ð 'Ð(9¸=È,ÐWð ð �Øð ðØ"˜
˜
˜
˜
˜
˜
˜
˜
øÝ"Ô1ð ð ð Ø˜ðøøøðñøð? ð 'Ø×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×ÒÑ!Ô!Ð!ð ð ðÝ!Ô*¨;ÀÐDÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDøÝÔ,­gÔ.DÐEð ð ð Ø×&Ò&Ñ(Ô(Ð(ðØ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ"Ô1ð ð ð Ø˜ðøøøøøð	øøøð × Ò Ñ"Ô"Ð"Øð ð ×1Ò1Ø°ð 2ñ ô ð ð Œ~ð 8Ø×+Ò+¨JÑ7Ô7Ð7ð 'Ð(9¸=È,ÐWð ð �Øð ðØ"˜
˜
˜
˜
˜
˜
˜
˜
øÝ"Ô1ð ð ð Ø˜ðøøøððøøøð( % QÔ'ˆÝ�h¥Ñ%Ô%ð 	0¨h¯lªl¸8Ñ.DÔ.Dð 	0Ø—\’\Ð"2Ñ3Ô3Ð9°rˆFØ%+ Ð!B¨v¸Ò/BÐÝØÐB� Ð%:¸EÑBÔBñô ˆIõ
 ˜hŸlšlÐ+?Ñ@Ô@ÑAÔAˆJØ%ð 0¨9ð 0¸
ð 0Ý—’ð AØÐ& 3ØØñ	ô ð ð ,0�˜Ñ(àˆsõ  Ã30D$ Ä$
D1Ä0D1ÏHAU ×"*X ØAU Ø
XØAU ØXØAAU Ù6*Z! Ú AU Ú!
[Ú+[ÛAU Û[ÛDAU ß$_9 ß8AU ß9
`àAU à`àOAU ï0o> ï=AU ï>
pðAU ð
pðD<AU ö	v&ö&/w7÷w÷w7÷w1÷.w7÷0w1÷1w7÷6w7ùyùy)ù(y)ù.$AU úz0 ú/AU ú0/|.û {)û(|.û){;û8|.û:{;û;|.û>AU ü 	|.ü	|)ü$AU ü)|.ü.A!AU þA  ÿAU ÿ
A@ ÿ;ÿ6AU ÿ;A@ Á@ A&AU ÁA'
AA2 ÁA1AU ÁA2
AA?ÁA<AU ÁA>AA?ÁA?A AU ÁC 
AC ÁC
AU ÁC
ACÁCAU ÁCACÁCAAU ÁE2AFÁF/AG ÁF?AGÁGAG ÁGAGÁGAG ÁGAGÁGAG ÁGAG ÁH7AI ÁI AIÁIAIÁIAAU ÁJ"AJ> ÁJ=AU ÁJ>
AKÁKAU ÁK
AKÁK*AU ÁL7AMÁM/AN%ÁNANÁNAN%ÁNANÁNAN%ÁNANÁNAN%ÁN$AN%ÁO<APÁPAPÁPAPÁQAQ; ÁQ;/ASÁR+AR4ÁR3ASÁR4ASÁSASÁSASÁSASÁSASÁT#AT,ÁT,AT>ÁT=AT>ÁUAAY+ÁVAV#ÁV"AY+ÁV#/AW4ÁWAWÁWAW4ÁWAW.	ÁW+AW4ÁW-AW.	ÁW.AW4ÁW1AY+ÁW3AW4ÁW4AAY+ÁYAYÁYAY+ÁYAY&	ÁY#AY+ÁY%AY&	ÁY&AY+rr  rS  )NN)r¿  rû  )rë  rì  rí  r�
  )NNr   NN)Ër  Ú
__module__Ú__qualname__Ú__doc__ra  r	   rò   r³  Ú__annotations__rc  rŸ   rd  re  r
   rµ  rf  r¶  rg  rh  ri  rj  rk  rž  ÚTaskrl  rm  r   r‘   rÄ  rˆ  rå  rÅ   rí  r�   rè  r»  rý  r  r	  r  r  Úpropertyr  r  r!  r#  r”   r*  rÉ   r>  r8  rB  r›   r[  r_  ra  rf  rj  rm  rs  ry  r}  r…  rR  Ústaticmethodr   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'  r2  r4  rH  rW  r¾  r¬  r­  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  rb  rc  rp  ro  r  r  r  r  rë  rà  rõ  rö  rì  rí  rü  r  r  r  rý  rþ  rÿ  Ú_APPROVAL_TIMEOUT_SECONDSrè  ré  Ú	frozensetr9  r;  r?  r=  rA  rS  rU  rC  rE  rG  rI  rK  rO  rM  rQ  rZ  r\  r   rÞ  r   rñ  r¨  ré  r§  r©  r•   rë  rÿ  rû  re  rf  r+	  r  r«  r”
  rK	  r1  rQ	  rÞ  r�  r  rÝ  rþ  rü  râ  rÊ  rl	  ro	  r~	  rÌ  r‡	  rÇ	  rý  r  ré   r!   r`  r`  l  sS  € € € € € € ðð ð ,.Ð˜˜S %˜ZÔ(Ð-Ð-Ñ-Ø'Ð�cÐ'Ð'Ñ'Ø$IÐ˜EÐIÐIÑIØ $€J�˜”Ð$Ð$Ñ$Ø€IˆtÐÐÑØ$Ð˜Ð$Ð$Ñ$Ø"'Ð˜4Ð'Ð'Ñ'Ø#Ð�tÐ#Ð#Ñ#Ø!&Ð˜$Ð&Ð&Ñ&Ø)-€J�˜œÔ&Ð-Ð-Ñ-Ø:<Ð˜d 3¨¨S°#¨X¬Ð#6Ô7Ð<Ð<Ñ<Ø>@Ð  $ s¨D°°c°¬NÐ':Ô";Ð@Ð@Ñ@ðK,ð K,˜x¨Ô6ð K,ð K,ð K,ð K,ð\-
ð -
ð -
ð -
ðf $ð ð ð ð ð $Ð&?Ñ?Ðð- 8ð -°cð -¸cð -ð -ð -ð -ð 4¨¨S¨¤>ð ð ð ð ð4@ð @ð @ð @ð,¸sð ,Èdð ,ÐW[ð ,ð ,ð ,ð ,ð+¸cð +ÈDð +ÐUYð +ð +ð +ð +ð$*ð *ð *ð *ðXð ð ð ð( ð" Tð "ð "ð "ñ „Xð"ð ð'¨$ð 'ð 'ð 'ñ „Xð'ð ð!˜X cœ]ð !ð !ð !ñ „Xð!ð ð˜8 Cœ=ð ð ð ñ „Xðð
¨mð 
Àð 
ð 
ð 
ð 
ð& +/Ø%)Ø&*ðH%ð H%ð H%ð ˜Ô'ðH%ð ˜c”]ð	H%ð
 ˜d”^ðH%ð 
ˆs�DˆyÔ	ðH%ð H%ð H%ð H%ðT*°sð *À3ð *ÐX\ð *Ðaeð *ð *ð *ð *ðXAÐ9Lð AÐQUð Að Að Að AðF#¨#ð #°$ð #ð #ð #ð #ð
) cð )ð )ð )ð )ðD cð Dð Dð Dð DðL sð Lð Lð Lð LðL¨Tð Lð Lð Lð Lð5¨ð 5¸Nð 5ÐUXð 5Ð]að 5ð 5ð 5ð 5ð !àð!ð ð!ð   Ô/ð	!ð
 
�.Ô	!ð!ð !ð !ð !ðF @Dð ð ð ¨ð ¸ð Èð ð ð ð ð
ð 
°H¸S´Mð 
ÐW_Ð`cÔWdð 
Ðptð 
ð 
ð 
ð 
ð  )-Ø$(Ø'+ðð ð àðð ! œð	ð
 ˜S”Mðð   ”}ðð 
ðð ð ð ð& ð# D¨¨c°3¨h¬Ô$8ð #ð #ð #ñ „\ð#ðJ ð¨3ð ð ð ñ „\ðð( ð D¨4¡Kð ð ð ñ „\ðð. ðF°ð F¸¸cÀ4¸iÔ8Hð Fð Fð Fñ „\ðFð8 +/Ø%)ð	-ð -ð -ð ˜Ô'ð-ð ˜c”]ð	-ð
 
�‰ð-ð -ð -ð -ð&TàðTð # 4œ.ðTð 
ð	Tð Tð Tð Tð ð  d¡
ð ð ð ñ „\ðð4 ð $ð ð ð ñ „\ðð ð; 3ð ;ð ;ð ;ñ „\ð;ð ð¨ð ð ð ñ „\ðð2 ð °ð  ð  ð  ñ „\ð ðD ð Dð ð ð ñ „\ðð ð $¨¡+°Ñ"4ð ð ð ñ „\ðð(
¨$¨s°C¨x¬.ð 
ð 
ð 
ð 
ðS¸3ð SÀ|ð SÐX\ð Sð Sð Sð Sðv¸|ð vÐZ]ð vÐbfð vð vð vð vðp#°%ð #¸EÀ$ÀsÈCÀxÄ.ÐRVÐBVÔ<Wð #ð #ð #ð #ð<Q°ð Q¸ð Qð Qð Qð QðKð Kð Kð KðZ1°t¸CÀ¸H´~ð 1È$ð 1ð 1ð 1ð 1ð¨cð °dð ð ð ð ð$ ÐØ0ÐðÀSð ÈTð ð ð ð ð6/¨cð /ð /ð /ð /ðb¸ð Àð ð ð ð ð*ð ð ð ð> 38ÈUð ð ð ¨4ð Àdð ÐW[ð ð ð ð ð"S˜Tð Sð Sð Sð Sðj
`'ð `'°cð `'ð `'ð `'ð `'ðD}'ð }'ð }'ð }'ðD Ø!&Ø %ðmð mð mð ðmð ð	mð
 ðmð 
ðmð mð mð mð^*ð *ð *ð *ðZàðZð ðZð 
Ð%Ô	&ð	Zð Zð Zð ZðxP-¨-ð P-¸Dð P-ð P-ð P-ð P-ðd6°h¸xÔ6Hð 6ÈSð 6ð 6ð 6ð 6ðpL<¨<ð L<¸HÀS¼Mð L<ð L<ð L<ð L<ð\Wð ðWð ð	Wð
 �d˜3 ˜8”nÔ%ðWð 
�#ŒðWð Wð Wð WðrS9È#ð S9Ð_bð S9ð S9ð S9ð S9ðjT  cð T ð T ð T ð T ðln&°ð n&À#ð n&ð n&ð n&ð n&ð` °<ð  ÀCð  ð  ð  ð  ð* °,ð * À3ð * ð * ð * ð * ðXX °,ð X À3ð X ð X ð X ð X ðt%-°ð %-Àð %-ð %-ð %-ð %-ðNJK°<ð JKÀCð JKð JKð JKð JKðX/8°,ð /8À4ð /8ð /8ð /8ð /8ðd °ð  Àð  ð  ð  ð  ð,3 °Lð 3 ÀSð 3 ð 3 ð 3 ð 3 ðjN °ð N À(È3Ä-ð N ð N ð N ð N ð`
IJ°|ð IJÈð IJð IJð IJð IJðV"7°ð "7À#ð "7ð "7ð "7ð "7ðHS°ð SÀð Sð Sð Sð Sð2
°Lð 
ÀSð 
ð 
ð 
ð 
ð: ð˜\ð ¨h°s¬mð ð ð ñ „\ððK.°ð K.À#ð K.ð K.ð K.ð K.ðZ1X°lð 1XÀsð 1Xð 1Xð 1Xð 1Xðf%°|ð %Èð %ð %ð %ð %ð.M°Sð M¸Tð Mð Mð Mð Mð9,Øð9,Ø&)ð9,Ø7:ð9,ð 9,ð 9,ð 9,ð@ #ð4ð 4àð4ð ð4ð ð	4ð
 ð4ð 
ð4ð 4ð 4ð 4ðl8¨\ð 8Àð 8Èð 8ð 8ð 8ð 8ðtJIàðJIð ðJIð
 
ðJIð JIð JIð JIðX9(°Lð 9(ÀSð 9(ð 9(ð 9(ð 9(ðvJ°lð JÀsð Jð Jð Jð Jð:KØðKØ#2ðKØ=@ðKà	ðKð Kð Kð KðZoM°\ð oMÀcð oMð oMð oMð oMðb:O°ð :OÀð :Oð :Oð :Oð :Oðxm°ð mÀð mð mð mð mð"AR°<ð ARÀCð ARð ARð ARð ARðF\.°Lð \.ÀSð \.ð \.ð \.ð \.ð|.f°ð .fÀ#ð .fð .fð .fð .fð`GT°,ð GTÀ3ð GTð GTð GTð GTðRZ
°,ð Z
À3ð Z
ð Z
ð Z
ð Z
ðxG;°ð G;À#ð G;ð G;ð G;ð G;ðR/5°Lð /5ÀSð /5ð /5ð /5ð /5ðbA1°lð A1Àsð A1ð A1ð A1ð A1ðN !$Ðð;q°<ð ;qÀHÈSÄMð ;qð ;qð ;qð ;qðz#K°ð #KÀð #Kð #Kð #Kð #KðN !* 	ØÔ˜8Ô+¨X¬^¸XÔ=NØŒ˜Ô,¨h¬oØÔ ¤°´¸hÔ>OØŒ˜œ¨Ô)@À(Ä/ÐS[ÔSgÐiqÔiwð  zBô  zHð	+ñ !ô !Ðð*E°ð *EÀ#ð *Eð *Eð *Eð *EðX[J°,ð [JÀ3ð [Jð [Jð [Jð [JðzXð Xð Xð Xð  #Ø!$Øð	B?ð B?àðB?ð ðB?ð ð	B?ð
 
ðB?ð B?ð B?ð B?ðHT°ð Tð Tð Tð Tðl&0ð &0ð &0ð &0ðP
¨ð 
¸4ð 
ð 
ð 
ð 
ð(#¨ð #°$ð #ð #ð #ð #ð
Fð Fð FðAàðAð ˜#”YðAð 
ð	Að Að Að AðFSàðSð ˜#”YðSð 
ð	Sð Sð Sð Sðj7
¨tð 7
ð 7
ð 7
ð 7
ðr$F¸3ð $FÀTð $FÈdð $Fð $Fð $Fð $FðLW>°$ð W>¸4ð W>ð W>ð W>ð W>ðr Ðàð%>Øð%>àð%>ð ð%>ð ð	%>ð
 
ð%>ð %>ð %>ñ „\ð%>ðN%Øð%Ø'*ð%Ø<@ð%à	ð%ð %ð %ð %ð*M¸ð MÈ#ð MÐRVð Mð Mð Mð Mð )-ð	'ð 'ð 'àð'ð ! œð	'ð
 
ð'ð 'ð 'ð 'ðRÀ#ð È$ð ð ð ð ð.¸ð Àð ð ð ð ð$ UWð 
ð 
ð 
¸cð 
Ècð 
Ð[^ð 
ð 
ð 
ð 
ðG°3ð GÀCð GÈDð Gð Gð Gð Gðàðð ðð ˜$‘Jð	ð
 
ðð ð ð ð. '+ð;ð ;ð ;àð;ð ð;ð
 ð;ð !ð;ð  $ð;ð 
ð;ð ;ð ;ð ;ð29¨sð 9°tð 9ð 9ð 9ð 9ð ð"¨3ð "Àð "Èð "ð "ð "ñ „\ð"ð$°ð ¸ð ð ð ð ð,Jð Jð Jð JðX/¨3ð /ð /ð /ð /ðj ¨¤ð ð ð ð ð,  Ø(,Ø*.ðP
ð P
àðP
ð ðP
ð �d˜3 ˜8”nÔ%ð	P
ð
  ðP
ð ðP
ð ðP
ð ! œðP
ð # 3œ-ðP
ð 
ˆc�3ˆhŒðP
ð P
ð P
ð P
ðv  Ø(,Ø !Ø*.Ø(,ðsð sàðsð ðsð �d˜3 ˜8”nÔ%ð	sð
 ðsð ðsð ðsð ! œðsð ðsð # 3œ-ðsð ! œðsð 
ˆc�3ˆhŒðsð sð sð sð sð sré   r`  rÐ  Ú
stop_eventrÀ  c                 ó"  — ddl m} ddlm}m} d}d}t
                               d|¦  «         d}	|                      ¦   «         �s°	  |d||¬¦  «         n2# t          $ r%}
t
           	                    d	|
¦  «         Y d
}
~
nd
}
~
ww xY w|	dz  }	|	|z  dk    rr|rp	 ddl
m} |�4t          j         ||¦  «        |¦  «        }|                     d¬¦  «         n2# t          $ r%}
t
           	                    d|
¦  «         Y d
}
~
nd
}
~
ww xY w|	|z  dk    rº	  |d¬¦  «        }|rt
                               d|¦  «         n2# t          $ r%}
t
           	                    d|
¦  «         Y d
}
~
nd
}
~
ww xY w	  |d¬¦  «        }|rt
                               d|¦  «         n2# t          $ r%}
t
           	                    d|
¦  «         Y d
}
~
nd
}
~
ww xY w|                      |¬¦  «         |                      ¦   «         �¯°t
                               d¦  «         d
S )aê  
    Background thread that ticks the cron scheduler at a regular interval.
    
    Runs inside the gateway process so cronjobs fire automatically without
    needing a separate `hermes cron daemon` or system cron entry.

    When ``adapters`` and ``loop`` are provided, passes them through to the
    cron delivery path so live adapters can be used for E2EE rooms.

    Also refreshes the channel directory every 5 minutes and prunes the
    image/audio/document cache once per hour.
    r   )Útick)Úcleanup_image_cacheÚcleanup_document_cacherÐ  r=  z"Cron ticker started (interval=%ds)F)r³  r‡  rQ  zCron tick error: %sNr)   r�  rK  rÌ  z#Channel directory refresh error: %sr‚  )Úmax_age_hoursz-Image cache cleanup: removed %d stale file(s)zImage cache cleanup error: %sz0Document cache cleanup: removed %d stale file(s)z Document cache cleanup error: %szCron ticker stopped)Úcron.schedulerrÚ
  rÞ  rÛ
  rÜ
  r³   rÊ   r!
  r·   rË   r¥  rŽ  rž  r 
  rG  r  )rØ
  r‡  rQ  rÀ  Ú	cron_tickrÛ
  rÜ
  ÚIMAGE_CACHE_EVERYÚCHANNEL_DIR_EVERYÚ
tick_countrÁ  rŽ  Úfutr¨  s                 r!   Ú_start_cron_tickerrä
  Ö*  sç  € ð 1Ð0Ð0Ð0Ð0Ð0ØRÐRÐRÐRÐRÐRÐRÐRàÐØÐå
‡K‚KÐ4°hÑ?Ô?Ð?Ø€JØ×ÒÑ!Ô!ñ %*ð	3ØˆI˜e¨h¸TÐBÑBÔBÐBÐBøÝð 	3ð 	3ð 	3Ý�LŠLÐ.°Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð	3øøøð 	�a‰ˆ
àÐ)Ñ)¨QÒ.Ð.°8Ð.ðGØMÐMÐMÐMÐMÐMØÐ#õ
 "Ô:Ø/Ð/°Ñ9Ô9¸4ñô �Cð —J’J r�JÑ*Ô*Ð*øøÝð Gð Gð GÝ—’ÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøð Ð)Ñ)¨QÒ.Ð.ðAØ-Ð-¸BÐ?Ñ?Ô?�Øð ZÝ—K’KÐ OÐQXÑYÔYÐYøøÝð Að Að AÝ—’Ð<¸aÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@øøøøðAøøøðDØ0Ð0¸rÐBÑBÔB�Øð ]Ý—K’KÐ RÐT[Ñ\Ô\Ð\øøÝð Dð Dð DÝ—’Ð?ÀÑCÔCÐCÐCÐCÐCÐCÐCøøøøðDøøøð 	�Š ˆÑ)Ô)Ð)ðK ×ÒÑ!Ô!ñ %*õL ‡K‚KÐ%Ñ&Ô&Ð&Ð&Ð&s`   ÁA Á
BÁA?Á?BÂ<C Ã
DÃC?Ã?DÄ)D; Ä;
E*ÅE%Å%E*Å.)F Æ
GÆ"GÇGFr
  Ú	verbosityc              ƒ   óz  ‡"‡#K  — ddl m}m}m}m}m}m}  |¦   «         }	|	��•|	t          j        ¦   «         k    �r}|�r. ||	¦  «        }
t           
                    d|	¦  «         	 ddl m}  ||	¦  «         n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY w	  ||	d¬¦  «         n`# t          $ r Y nTt          t           f$ rA t                               d	|	¦  «         	 dd
l m}  |¦   «          n# t          $ r Y nw xY wY dS w xY wt'          d¦  «        D ]D}	 t          j        |	d¦  «         t+          j        d¦  «         Œ-# t          t          f$ r Y  n_w xY wt                               d|	¦  «         	  ||	d¬¦  «         t+          j        d¦  «         n# t          t          t           f$ r Y nw xY w |¦   «          	 t1          ¦   «         dz                       d¬¦  «         n# t          $ r Y nw xY w	 dd
l m}  |¦   «          n# t          $ r Y nw xY w	 ddl m}  ||	|
¬¦  «        }|rt           
                    d|¦  «         n\# t          $ r Y nPw xY wt7          t1          ¦   «         ¦  «        }t                               d|	|¦  «         t9          d|	› d�¦  «         dS 	 ddlm}  |d¬¦  «         n# t          $ r Y nw xY wddlm }  |tB          d¬¦  «         |�ëddl"m#} tH          j%        tH          j&        dœ '                    |tH          j(        ¦  «        }tI          j)        ¦   «         }| *                    |¦  «         | +                     |d¦  «        ¦  «         tI          j,        ¦   «          -                    |¦  «         |tI          j,        ¦   «         j.        k     r&tI          j,        ¦   «          *                    |¦  «         t_          | ¦  «        Š#dŠ"ˆ"ˆ#fd„}ˆ#fd „}ta          j1        ¦   «         }te          j3        ¦   «         te          j4        ¦   «         u rŠtj          j6        tj          j7        fD ])}	 | 8                    ||¦  «         Œ# tr          $ r Y Œ&w xY wtu          tj          d!¦  «        r2	 | 8                    tj          j;        |¦  «         n+# tr          $ r Y nw xY wnt           
                    d"¦  «         ddl<}dd#l m=}m}m}  |¦   «         }|�4|t          j        ¦   «         k    rt                               d$|¦  «         dS  |¦   «         st                               d%¦  «         dS 	  |¦   «          n5# t|          $ r(  |¦   «          t                               d&¦  «         Y dS w xY w| ?                    |¦  «         | ?                    |¦  «         ‰# @                    ¦   «         ƒ d{V —†}|sdS ‰#jA        r)‰#jB        r t                               d'‰#jB        ¦  «         dS te          jC        ¦   «         }te          jD        tŠ          |f‰#jF        ta          j1        ¦   «         d(œdd)¬*¦  «        } |  @                    ¦   «          ‰# G                    ¦   «         ƒ d{V —† ‰#jH        r)‰#jB        r t                               d+‰#jB        ¦  «         dS | I                    ¦   «          |  J                    d,¬-¦  «         	 dd.lKmL}!  |!¦   «          n# t          $ r Y nw xY w‰#jM        �t�          ‰#jM        ¦  «        ‚‰"r#‰#jO        st           
                    d/¦  «         dS dS )0a7  
    Start the gateway and run until interrupted.
    
    This is the main entry point for running the gateway.
    Returns True if the gateway ran successfully, False if it failed to start.
    A False return causes a non-zero exit code so systemd can auto-restart.
    
    Args:
        config: Optional gateway configuration override.
        replace: If True, kill any existing gateway instance before starting.
                 Useful for systemd services to avoid restart-loop deadlocks
                 when the previous process hasn't fully exited yet.
    r   )Úacquire_gateway_runtime_lockÚget_running_pidÚget_process_start_timerü  rû  Úterminate_pidNz<Replacing existing gateway instance (PID %d) with --replace.)Úwrite_takeover_markerz#Could not write takeover marker: %sFrˆ   z1Permission denied killing PID %d. Cannot replace.)Úclear_takeover_markerrå  g      à?zAOld gateway (PID %d) did not exit after SIGTERM, sending SIGKILL.Tzgateway.pidr,  )Úrelease_all_scoped_locks)Ú	owner_pidÚowner_start_timez2Released %d stale scoped lock(s) from old gateway.z‘Another gateway instance is already running (PID %d, HERMES_HOME=%s). Use 'hermes gateway restart' to replace it, or 'hermes gateway stop' first.u"   
â�Œ Gateway already running (PID zš).
   Use 'hermes gateway restart' to replace it,
   or 'hermes gateway stop' to kill it first.
   Or use 'hermes gateway run --replace' to auto-replace.
)Úsync_skills)Úquiet)Úsetup_loggingr  )r*   rõ  )ÚRedactingFormatter)r   r)   z#%(levelname)s %(name)s: %(message)sc                  ó�  •— d} 	 ddl m}  |¦   «         } n2# t          $ r%}t                               d|¦  «         Y d }~nd }~ww xY w| rt                               d¦  «         ndŠt                               d¦  «         	 dd l}|                     dd	gddd
¬¦  «        }d„ |j         	                    ¦   «         D ¦   «         }|r/t           
                    dd                     |¦  «        ¦  «         nt                               d¦  «         n# t          $ r Y nw xY wt          j        ‰                     ¦   «         ¦  «         d S )NFr   )Ú consume_takeover_marker_for_selfz Takeover marker check failed: %suD   Received SIGTERM as a planned --replace takeover â€” exiting cleanlyTu/   Received SIGTERM/SIGINT â€” initiating shutdownÚpsÚauxr@  )Úcapture_outputr]  r6   c                 óâ   — g | ]l}d |                      ¦   «         v sd|                      ¦   «         v r>t          t          j        ¦   «         ¦  «        |                     ¦   «         dd…         v¯j|‘ŒmS )r/  r  r)   r?  )rõ   rò   r   r@  rô   )r  rÄ	  s     r!   rÌ  zBstart_gateway.<locals>.shutdown_signal_handler.<locals>.<listcomp>Ö+  sq   € ð ð ð ØØ §
¢
¡¤Ð,Ð,°	¸T¿ZºZ¹\¼\Ð0IÐ0IÝ�œ	™œÑ$Ô$¨D¯JªJ©L¬L¸¸1¸Ô,=Ð=Ð=ð à=Ð=Ð=ré   u<   Shutdown diagnostic â€” other hermes processes running:
  %sz
  u7   Shutdown diagnostic â€” no other hermes processes found)r„  rõ
  r·   r³   rË   rÊ   r?  r	  r<  r  r´   râ   rž  rT  rX  )Úplanned_takeoverrõ
  rÁ  Ú_spÚ_psÚ_hermes_procsÚ_signal_initiated_shutdownÚrunners         €€r!   Úshutdown_signal_handlerz.start_gateway.<locals>.shutdown_signal_handler¶+  s°  ø€ ð !Ðð	@ØGÐGÐGÐGÐGÐGØ?Ð?ÑAÔAÐÐøÝð 	@ð 	@ð 	@Ý�LŠLÐ;¸QÑ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð	@øøøð ð 	KÝ�KŠKØVñô ð ð ð *.Ð&Ý�KŠKÐIÑJÔJÐJð	Ø$Ð$Ð$Ð$Ø—'’'Ø�u�Ø#¨$¸ð ñ ô ˆCðð Ø!$¤×!6Ò!6Ñ!8Ô!8ðñ ô ˆMð
 ð WÝ—’ØSØ—K’K Ñ.Ô.ñô ð ð õ
 —’ÐUÑVÔVÐVøøÝð 	ð 	ð 	ØˆDð	øøøåÔ˜FŸKšK™MœMÑ*Ô*Ð*Ð*Ð*s'   … –
A A Á AÂBD Ä
DÄDc                  ó6   •— ‰                       dd¬¦  «         d S )NFTrI  )rW  )rÿ
  s   €r!   Úrestart_signal_handlerz-start_gateway.<locals>.restart_signal_handleræ+  s"   ø€ Ø×Ò¨¸4ÐÑ@Ô@Ð@Ð@Ð@ré   ÚSIGUSR1z6Skipping signal handlers (not running in main thread).)Úwrite_pid_filerû  rè
  z^Another gateway instance (PID %d) started during our startup. Exiting to avoid double-running.zBGateway runtime lock is already held by another instance. Exiting.z8PID file race lost to another gateway instance. Exiting.zGateway exiting cleanly: %s)r‡  rQ  zcron-ticker)r¹  r­   rÜ	  rv	  r  z Gateway exiting with failure: %sr=  rÌ  )r   z}Exiting with code 1 (signal-initiated shutdown without restart request) so systemd Restart=on-failure can revive the gateway.)Pr„  rç
  rè
  ré
  rü  rû  rê
  r   r@  r³   rÊ   rë
  r·   rË   ÚProcessLookupErrorÚPermissionErrorrñ  rO  rì
  rÎ  ÚkillrV  rü  r´   r#   r0  rí
  rò   ÚprintÚtools.skills_syncrð
  Úhermes_loggingrò
  rÅ   Úagent.redactró
  ÚloggingÚWARNINGÚINFOr¸   ÚDEBUGÚStreamHandlerÚsetLevelÚsetFormatterÚ	getLoggerÚ
addHandlerr  r`  rž  rõ  r©  Úcurrent_threadÚmain_threadÚsignalÚSIGINTÚSIGTERMÚadd_signal_handlerÚNotImplementedErrorr  r  Úatexitr  ÚFileExistsErrorÚregisterr¾  r  r!  rŸ  rx	  rä
  r‡  r  r  r½  râ   r£  r   r#  Ú
SystemExitrg  )$r)  r
  rå
  rç
  rè
  ré
  rü  rû  rê
  Úexisting_pidÚexisting_start_timerë
  rÁ  rì
  rû   rí
  Ú	_releasedr*   rð
  rò
  ró
  Ú_stderr_levelÚ_stderr_handlerr   r  rQ  Úsigr  r  Ú_current_pidr¸  Ú	cron_stopÚcron_threadr   rþ
  rÿ
  s$                                     @@r!   Ústart_gatewayr)  +  sÐ	  øøè è € ð&ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð #�?Ñ$Ô$€LØÑ LµB´I±K´KÒ$?Ñ$?Øñ [	Ø"8Ð"8¸Ñ"FÔ"FÐÝ�KŠKØNØñô ð ðGØ@Ð@Ð@Ð@Ð@Ð@Ø%Ð% lÑ3Ô3Ð3Ð3øÝð Gð Gð GÝ—’ÐBÀAÑFÔFÐFÐFÐFÐFÐFÐFøøøøðGøøøðØ�˜l°%Ð8Ñ8Ô8Ð8Ð8øÝ%ð ð ð Ø�Ý#¥WÐ-ð ð ð Ý—’ØGØ ñô ð ðØDÐDÐDÐDÐDÐDØ)Ð)Ñ+Ô+Ð+Ð+øÝ ð ð ð Ø�Dðøøøà�u�uðøøøõ ˜2‘Y”Yð ð �ðÝ”G˜L¨!Ñ,Ô,Ð,Ý”J˜s‘O”O�O�OøÝ*­OÐ<ð ð ð Ø�E�Eðøøøõ —’ØWØ ñô ð ðØ!�M ,°dÐ;Ñ;Ô;Ð;Ý”J˜s‘O”O�O�OøÝ*­O½WÐEð ð ð Ø�DðøøøàˆOÑÔÐðÝ Ñ"Ô" ]Ñ2×:Ò:ÀdÐ:ÑKÔKÐKÐKøÝð ð ð Ø�ðøøøðØ@Ð@Ð@Ð@Ð@Ð@Ø%Ð%Ñ'Ô'Ð'Ð'øÝð ð ð Ø�ðøøøð
	ØCÐCÐCÐCÐCÐCØ4Ð4Ø*Ø%8ðñ ô �	ð ð aÝ—K’KÐ TÐV_Ñ`Ô`Ð`øøÝð ð ð Ø�ðøøøõ �oÑ/Ô/Ñ0Ô0ˆKÝ�LŠLð^à˜kñô ð õ
 ðO°lð Oð Oð Oñô ð ð �5ðØ1Ð1Ð1Ð1Ð1Ð1Øˆ˜$ÐÑÔÐÐøÝð ð ð Øˆðøøøð -Ð,Ð,Ð,Ð,Ð,Ø€M�l°Ð;Ñ;Ô;Ð;ð ÐØ3Ð3Ð3Ð3Ð3Ð3å#œOµ´Ð=Ð=×AÒAÀ)ÍWÌ]Ñ[Ô[ˆÝ!Ô/Ñ1Ô1ˆØ× Ò  Ñ/Ô/Ð/Ø×$Ò$Ð%7Ð%7Ð8]Ñ%^Ô%^Ñ_Ô_Ð_ÝÔÑÔ×&Ò& Ñ7Ô7Ð7à�7Ô,Ñ.Ô.Ô4Ò4Ð4ÝÔÑÔ×(Ò(¨Ñ7Ô7Ð7å˜6Ñ"Ô"€Fð "'Ðð.+ð .+ð .+ð .+ð .+ð .+ð`Að Að Að Að Aõ Ô#Ñ%Ô%€DÝÔÑ!Ô!¥YÔ%:Ñ%<Ô%<Ð<Ð<Ý”M¥6¤>Ð2ð 	ð 	ˆCðØ×'Ò'¨Ð-DÑEÔEÐEÐEøÝ&ð ð ð Ø�ðøøøå•6˜9Ñ%Ô%ð 	ðØ×'Ò'­¬Ð8NÑOÔOÐOÐOøÝ&ð ð ð Ø�ðøøøð	õ 	�ŠÐLÑMÔMÐMð €M€M€MØOÐOÐOÐOÐOÐOÐOÐOÐOÐOØ"�?Ñ$Ô$€LØÐ LµB´I±K´KÒ$?Ð$?Ý�Šð/Ø0<ñ	
ô 	
ð 	
ð ˆuØ'Ð'Ñ)Ô)ð Ý�ŠØPñ	
ô 	
ð 	
ð ˆuðØˆÑÔÐÐøÝð ð ð Ø$Ð$Ñ&Ô&Ð&Ý�ŠØFñ	
ô 	
ð 	
ð ˆuˆuðøøøð ‡O‚O�OÑ$Ô$Ð$Ø
‡O‚OÐ0Ñ1Ô1Ð1ð —L’L‘N”NÐ"Ð"Ð"Ð"Ð"Ð"€GØð ØˆuØÔ!ð ØÔð 	LÝ�LŠLÐ6¸Ô8JÑKÔKÐKØˆtõ ”Ñ!Ô!€IÝÔ"Ý!Øˆ\Ø"œOµWÔ5MÑ5OÔ5OÐPÐPØØðñ ô €Kð ×ÒÑÔÐð ×
"Ò
"Ñ
$Ô
$Ð$Ð$Ð$Ð$Ð$Ð$Ð$àÔ&ð ØÔð 	QÝ�LŠLÐ;¸VÔ=OÑPÔPÐPØˆuð ‡M‚M�O„O€OØ×Ò˜QÐÑÔÐðØ7Ð7Ð7Ð7Ð7Ð7ØÐÑÔÐÐøÝð ð ð Øˆðøøøð ÔÐ#Ý˜Ô)Ñ*Ô*Ð*ð "ð ¨&Ô*Cð Ý�ŠðMñ	
ô 	
ð 	
ð ˆuàˆ4s  Á$A6 Á6
B%Â B Â B%Â)B7 Â7
DÃ+DÃ/D Ã?DÄ 
DÄ
DÄDÄDÄDÄ))EÅE(Å'E(Æ!F) Æ)GÇGÇ%G7 Ç7
HÈHÈH È
H&È%H&È*0I É
I(É'I(Ê8K Ë
KËKÑQ'Ñ'
Q4Ñ3Q4Ò R. Ò.
R;Ò:R;Õ
U Õ.VÖ
VÛ[+ Û+
[8Û7[8c                  óþ  — ddl } |                      d¬¦  «        }|                     ddd¬¦  «         |                     d	d
dd¬¦  «         |                     ¦   «         }d}|j        r[ddl}t          |j        d¬¦  «        5 }|                     |¦  «        }t          j	        |¦  «        }ddd¦  «         n# 1 swxY w Y   t          j        t          |¦  «        ¦  «        }|st          j        d¦  «         dS dS )z CLI entry point for the gateway.r   Nz)Hermes Gateway - Multi-platform messaging)rÜ  z--configrÝ  zPath to gateway config file)r´  z	--verbosez-vÚ
store_truezVerbose output)r  r´  r-   r.   r)   )ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsr)  rÄ   rÆ   rÇ   r‘   r|  rž  r	  r)  r6  Úexit)r,  Úparserr­   r)  rÄ   r'  ró  r¸  s           r!   r>  r>  T,  sI  € à€O€O€Oà×$Ò$Ð1\Ð$Ñ]Ô]€FØ
×Ò˜
 DÐ/LÐÑMÔMÐMØ
×Ò˜ T°,ÐEUÐÑVÔVÐVà×ÒÑÔ€Dà€FØ„{ð 3ØˆˆˆÝ�$”+¨Ð0Ñ0Ô0ð 	3°AØ—>’> !Ñ$Ô$ˆDÝ"Ô,¨TÑ2Ô2ˆFð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3õ Œk�-¨Ñ/Ô/Ñ0Ô0€GØð ÝŒ�‰Œˆˆˆðð s   Â*B9Â9B=Ã B=Ú__main__rS  rr  )NNrÐ  )NFr   )¥rÑ
  rž  rÕ  rÔ  r  r   rl  r˜  r6  r  r›  r©  rV  Úcollectionsr   Úcontextvarsr   rº  r   r   Útypingr	   r
   r   r   Úagent.account_usager   r   rw	  r�	  r"   r   rv  rò   r  r  r  r#   Úutilsr$   r%   r&   rÅ   Údotenvr'   Úhermes_cli.env_loaderr(   r<
  r  r÷  ÚcompilerÖ  rÙ  rì  r   rÄ   Ú_yamlrÆ   rÎ   rÇ   r…   r³  r0   rò  Ú_keyÚ_valrÈ   rµ  r³  r¶  r   r¸   Ú_terminal_cfgrÉ   Ú_terminal_env_mapÚ_cfg_keyÚ_env_varr¹   rü  Ú_auxiliary_cfgÚ_aux_task_envÚ	_task_keyÚ_env_mapÚ	_task_cfgró   Ú_provrq  rr  rH	  Ú
_agent_cfgÚ_display_cfgÚ_tz_cfgÚ_security_cfgÚ_redactrõ   r·   r„   ÚdirÚ_network_cfgrŠ   r‹   Ú_configured_cwdr²   rÔ  Ú	_fallbackrà  r�   r‘   r’   r'	  r“   r”   r•   r–   r—   r˜   r™   Úgateway.deliveryrš   rÞ  r›   rœ   r�   rž   Úgateway.restartrŸ   r    r¡   Úgateway.whatsapp_identityr¢   Ú_canonical_whatsapp_identifierr£   rr  r¤   rs  r  r  r³   ÚobjectrÀ  r¾   rµ   rè   rî   rã  rä  r“
  Ú _INTERRUPT_REASON_SSE_DISCONNECTr   rÿ  r×
  rö   rø   r  r#  r(  r-  r:  rH  r^  r`  rŸ  rä
  r)  r>  r  ré   r!   ú<module>rW     s¥  ððð ð €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oð Ð Ø#Ð ð#ð #ð #ð #ðJ Ð Ñ Ô Ð ð „‡‚��3�3�t�t˜H‘~”~Ô,Ô3Ñ4Ô4Ñ 5Ô 5Ð 5ð -Ð ,Ð ,Ð ,Ð ,Ð ,Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØˆÑ Ô €ð Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø˜6Ñ!€	Ø Ð ˜|¸¸¸h¹¼×9OÒ9OÑ9QÔ9QÔ9YÐZ[Ô9\Ð_eÑ9eÐ fÑ fÔ fÐ fð $˜œÐ$dÑeÔeÐ Ø(1°:Ð'>Ð $ð ˜mÑ+€Ø×ÒÑÔñ {ðzØÐÐÐØˆT�,¨Ð1Ñ1Ô1ð 	-°RØ"�5”? 2Ñ&Ô&Ð,¨"ˆDð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	7Ð6Ð6Ð6Ð6Ð6ØÐ Ñ%Ô%ˆàŸ*š*™,œ,ð 	-ð 	-‰JˆD�$Øˆz˜$  c¨5°$Ð 7Ñ8Ô8ð -¸TÈÌÐ=SÐ=SØ#& 3 t¡9¤9�”
˜4Ñ øð Ÿš ¨RÑ0Ô0ˆØð #	9˜Z˜Z¨°tÑ<Ô<ð #	9ð!Ø˜>ð!à�~ð!ð Ð-ð!ð #Ð$?ð	!ð
 Ð 7ð!ð %Ð&Cð!ð $Ð%Að!ð Ð5ð!ð  Ð!9ð!ð Ð/ð!ð Ð/ð!ð Ð/ð!ð Ð-ð!ð  Ð!9ð!ð #Ð$?ð!ð  !Ð";ð!!ð" 'Ð(Gð#!ð$ #<Ø5Ø$?ð)!ð !ð !Ðð, '8×&=Ò&=Ñ&?Ô&?ð 9ð 9Ñ"�˜(Ø˜}Ð,Ð,Ø(¨Ô2�Dð
   5Ò(Ð(¨S¨S°©Y¬YÐ:NÐ-NÐ-NØ Ø!�z $¨Ñ-Ô-ð 9Ø/9¨t¬z¸$Ñ/?Ô/?˜œ
 8Ñ,Ð,à/2¨s°4©y¬y˜œ
 8Ñ,øð
 Ÿš +¨rÑ2Ô2ˆØñ $	?˜j˜j¨¸Ñ>Ô>ñ $	?ð !<Ø5Ø ;Ø9ð	ð ð !AØ:Ø @Ø>ð	 ð  ð !>Ø7Ø =Ø;ð	ð ðð ˆMð( (5×':Ò':Ñ'<Ô'<ð ?ñ ?Ñ#�	˜8Ø*×.Ò.¨y¸"Ñ=Ô=�	Ø!�z )¨TÑ2Ô2ð ØØ˜˜IŸMšM¨*°bÑ9Ô9Ñ:Ô:×@Ò@ÑBÔB�Ø˜˜YŸ]š]¨7°BÑ7Ô7Ñ8Ô8×>Ò>Ñ@Ô@�Ø˜C 	§¢¨j¸"Ñ =Ô =Ñ>Ô>×DÒDÑFÔF�	Ø˜3˜yŸ}š}¨Y¸Ñ;Ô;Ñ<Ô<×BÒBÑDÔD�Øð =˜U fš_˜_Ø7<�B”J˜x¨
Ô3Ñ4Øð ;Ø4:�B”J˜x¨Ô0Ñ1Øð AØ7@�B”J˜x¨
Ô3Ñ4Øð ?Ø6>�B”J˜x¨	Ô2Ñ3ùØ—X’X˜g rÑ*Ô*ˆ
Øð 	f˜*˜* Z°Ñ6Ô6ð 	fØ˜jÐ(Ð(Ø69°c¸*À[Ô:QÑ6RÔ6R�”
Ð2Ñ3ð ! JÐ.Ð.Ð3IÐQSÔQ[Ð3[Ð3[Ø58°S¸ÐDUÔ9VÑ5WÔ5W�”
Ð1Ñ2Ø(¨JÐ6Ð6Ð;YÐacÔakÐ;kÐ;kØ=@¸SÀÐLeÔAfÑ=gÔ=g�”
Ð9Ñ:Ø(¨JÐ6Ð6Ð;YÐacÔakÐ;kÐ;kØ=@¸SÀÐLeÔAfÑ=gÔ=g�”
Ð9Ñ:Ø&¨*Ð4Ð4Ð9WÐ_aÔ_iÐ9iÐ9iØ=@¸SÀÐLcÔAdÑ=eÔ=e�”
Ð9Ñ:Ø—x’x 	¨2Ñ.Ô.ˆØð 	d˜J˜J |°TÑ:Ô:ð 	dØ  LÐ0Ð0Ð5UÐ]_Ô]gÐ5gÐ5gØ?B¸sÀ<ÐPaÔCbÑ?cÔ?c�”
Ð;Ñ<ð —(’(˜: rÑ*Ô*ˆØð 	<�z�z '¨3Ñ/Ô/ð 	<Ð4EÈRÌZÐ4WÐ4WØ,3¯MªM©O¬OˆBŒJÐ(Ñ)àŸš ¨RÑ0Ô0ˆØˆ:�m TÑ*Ô*ð 	KØ#×'Ò'Ð(8Ñ9Ô9ˆGØÐ"Ø69°c¸'±l´l×6HÒ6HÑ6JÔ6J�”
Ð2Ñ3øøØð ð ð Øˆðøøøð	Ø6Ð6Ð6Ð6Ð6Ð6Ø" c c¡e¤e˜O˜O�D�D°×8Ò8¸ÀBÑGÔG€LØ€z�, Ñ%Ô%ð *¨,×*:Ò*:¸<Ñ*HÔ*Hð *ØÐ DÐ)Ñ)Ô)Ð)øøØð 	ð 	ð 	Ø€Dð	øøøð	Ø7Ð7Ð7Ð7Ð7Ð7ØÐÑÔÐÐøØð 	ð 	ð 	Ø€Dð	øøøð	Ø>Ð>Ð>Ð>Ð>Ð>Ø Ð Ñ"Ô"Ð"Ð"øØð 	ð 	ð 	Ø€Dð	øøøð !€„
ˆ>Ñ ð !$€„
ÐÑ ð ”*—.’. °Ñ4Ô4€Øð +˜/Ð-AÐAÐAØ�”	˜/Ñ*Ô*Ð>¨c¨c°)°$´)±+´+Ñ.>Ô.>€IØ!*€B„Jˆ~Ñðð ð ð ð ð ð ð ð ð ð
ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +ðð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð 
ˆÔ	˜8Ñ	$Ô	$€ð !˜&™(œ(Ð ð$ tð $ð $ð $ð $ðN'¨¨t©ð 'ð 'ð 'ð 'ðT sð ð ð ð ð,4°ð 4¸ÈÑ9Lð 4ð 4ð 4ð 4ð *Ð Ø3Ð Ø>Ð Ø#<Ð  Ø%<Ð "Ø$8Ð !à'˜ià×$Ò$Ñ&Ô&Ø×%Ò%Ñ'Ô'Ø!×'Ò'Ñ)Ô)Ø(×.Ò.Ñ0Ô0Ø*×0Ò0Ñ2Ô2Ø)×/Ò/Ñ1Ô1ðñ	ô 	Ð ð5¨8°C¬=ð 5¸Tð 5ð 5ð 5ð 5ð-¨3ð -°3¸±:ð -ð -ð -ð -ð`C :ð C°#ð Cð Cð Cð Cð

˜dð 
ð 
ð 
ð 
ðð  4¨$¡;ð ¸#ð ð ð ð ð ˜X d¨3¤iÔ0ð ð ð ð ð6 Cð ¨Mð ð ð ð ð4¨dð °|ð ð ð ð ð6gað gað gað gað gañ gaô gað gaðTC;'ð ;' 9¤?ð ;'ÐX[ð ;'ð ;'ð ;'ð ;'ð|}ð } ¨Ô 7ð }Èð }ÐbjÐknÔboð }Ðx|ð }ð }ð }ð }ð@
ð ð ð0 ˆzÒÐØ€D�F„F€F€F€Fð Ðsn   Ä8W2 Å	E(ÅW2 Å(E,Å,W2 Å/E,Å0RW2 ×2W:×9W:×>AY ÙYÙYÙ"Y3 Ù3Y;Ù:Y;Ù?Z ÚZÚZ