Ë
    âß²jBa ã                   ó  — d Z 	 ddlZddlZddlZ ej
                  e«      ZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZmZmZmZmZ ddlmZ ddlmZ ddlmZ dedee   fd	„Z ed
dh«      ZdZ edeh«      Zdee   defd„Z dddee   fd„Z!ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(  e«       Z) e%e) ee*«      jV                  dz  ¬«      Z,e,D ]  Z-ej]                  de-«       Œ e,sej]                  d«       ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z6 ddl7m8Z8 ddl9m:Z:m;Z; ddl<m=Z= dd l>m?Z? dd!l@mAZA dd"lBmCZC dd#lDmEZE dd$lFmGZGmHZH dd%lImJZJ dd&lKmLZL dd'lMmNZN dd(lOmPZP dd)lQmRZR dd*lSmTZT dd+lUmVZV dd,lWmXZX dd-lYmZZZ dd.l[m\Z]m^Z_ dd/l`maZa dd0lbmcZc dd1ldmeZfmgZhmiZj dd2lkmlZmmnZompZp dd3lqmrZrmsZsmtZt dd4lumvZvmwZwmxZxmyZy d5Zz ejö                  «       Z|d6eddfd7„Z}d8ed9eddfd:„Z~d;edee   fd<„Z€ded=eeeef      de�fd>„Z‚dedefd?„Zƒded@ee„   ddfdA„Z…de�fdB„Z† G dC„ dDe‡«      Zˆ G dE„ de?eAeCeEeHeJeLeNePeReTeVeXeZ«      Z‰h dF£ZŠh dG£Z‹dHZŒdŠdI„Z�dJee   dKedeee      fdL„ZŽdddMe�dNedOeddf
dP„Z�	 	 	 d‹dQedOedRedSedTedUedVedWe�dXe�dYe�dZe�d[efd\„Z‘ed]k(  rddl’Z’ e’�j&                  e‘«       dd^l”m•Z• ddl–Z–ddl—Z—ddl˜Z˜ddl™Z™ddlšZši d_d`“dadb“dcdd“dedf“dgdh“didj“dkdl“dmdn“dodp“dqdr“dsdt“dudv“dwdx“dydz“d{d|“d}d~“dd€“d�d‚dƒd„d…d†d‡dˆœ¥Z›d‰„ Zœy# e$ r Y �Œýw xY w)Œa-  AIAgent: the tool-calling agent runner (conversation loop, tool execution, session lifecycle).

    from run_agent import AIAgent
    agent = AIAgent(base_url="http://localhost:30000/v1", model="claude-opus-4-20250514")
    response = agent.run_conversation("Tell me about the latest Python updates")
é    N)ÚListÚDictÚAnyÚOptionalÚCallable)Údatetime)ÚPath)Úget_hermes_homeÚsourceÚreturnc                 óÞ   — | t         vsAt        j                  j                  d«      xs dj	                  «       j                  «       dvry	 t        j                  «       S # t        $ r Y yw xY w)zçcwd to stamp on a new session row (``hermes -c`` / ``--resume``), or None.

    Only local CLI sessions record one: gateway/cron/remote backends (non-"local" ``TERMINAL_ENV``) have no
    stable host cwd for the agent's tools.
    ÚTERMINAL_ENVÚlocal)Ú r   N)ÚCLI_FAMILY_SOURCESÚosÚenvironÚgetÚstripÚlowerÚgetcwdÚOSError)r   s    ú./home/ubuntu/.hermes/hermes-agent/run_agent.pyÚ_launch_cwd_for_sessionr       s_   € ð Ô'Ñ'¬B¯J©J¯N©N¸>Ó,JÒ,UÈg×+\Ñ+\Ó+^×+dÑ+dÓ+fÐn{Ñ+{ØðÜ�y‰y‹{ÐøÜò Ùðús   ÁA  Á 	A,Á+A,ÚtuiÚdesktopÚoneshotÚcliÚplatformc                 ó0  — 	 ddl m} t         |dd«      xs d«      j                  «       } |dd«      dk(  } |dd«      dk(  }|r|s
|t        v rd}|r|s| xs ddk(  rt        S |xs | xs dS # t        $ r t        j                  j
                  }Y ŒŒw xY w)	Nr   )Úget_session_envÚHERMES_SESSION_SOURCEr   ÚHERMES_SINGLE_QUERY_SESSIONÚ1ÚHERMES_SESSION_SOURCE_EXPLICITr   )
Úgateway.session_contextr!   Ú	Exceptionr   r   r   Ústrr   Ú_UI_TRANSPORT_SOURCESÚONESHOT_SOURCE)r   r!   r   Úsingle_queryÚexplicits        r   Ú_session_source_for_agentr-   ;   s§   € ð)Ý;ô ‘Ð!8¸"Ó=ÒCÀÓD×JÑJÓL€FÙ"Ð#@À"ÓEÈÑL€LÙÐ?ÀÓDÈÑK€HÙ™H¨Ô3HÑ)HØˆÙ™F¨Ò(9°E¸eÒ'CÜÐØÒ&�XÒ& Ð&øô ò )ÜŸ*™*Ÿ.™.Šð)ús   ‚A/ Á/#BÂBÚagentÚAIAgentc                 óê  — t        | dd«      }t        | dd«      }t        | dd«      }|s|s|syt        | dd«      xs d|t        | dd«      t        | dd«      xs d	|t        | d
d«      t        | dd«      dœ}t        | dd«      r| j                  |d<   t        | dd«      }|s	 ddlm}  |«       }|dk(  rd}|r||d<   	 t        j                  |«      S # t        $ r d}Y Œ1w xY w# t        $ r Y yw xY w)zãGateway routing ``origin_json`` for a session row; None when the agent carries no gateway identity.

    Mirrors ``SessionSource.to_dict()`` so state.db consumers see the same fields ``record_gateway_session_peer`` writes.
    Ú_chat_idNÚ_gateway_session_keyÚ_user_idr   r   Ú
_chat_nameÚ
_chat_typeÚdmÚ
_user_nameÚ
_thread_id)r   Úchat_idÚ	chat_nameÚ	chat_typeÚuser_idÚ	user_nameÚ	thread_idÚ_user_id_altÚuser_id_altÚ_profile_namer   ©Úget_active_profile_nameÚdefaultÚprofile)Úgetattrr?   Úhermes_cli.profilesrC   r'   ÚjsonÚdumps)r.   r9   Úsession_keyr<   ÚoriginrE   rC   s          r   Ú_gateway_origin_jsonrL   J   s'  € ô
 �e˜Z¨Ó.€GÜ˜%Ð!7¸Ó>€KÜ�e˜Z¨Ó.€GÙ‘{¡gØä˜E :¨tÓ4Ò:¸ÀwÜ˜U L°$Ó7ÄgÈeÐUaÐcgÓFhÒFpÐlpØ¬°¸ÀdÓ)KÔZaÐbgÐiuÐw{ÓZ|ñ€Fô
 ˆu�n dÔ+Ø %× 2Ñ 2ˆˆ}ÑÜ�e˜_¨dÓ3€GÙð	ÝCÙ-Ó/ˆGð �iÒØˆGÙØ#ˆˆyÑðÜ�z‰z˜&Ó!Ð!øô ò 	ØŠGð	ûô ò Ùðús$   Â$C Ã C& ÃC#Ã"C#Ã&	C2Ã1C2)ÚIterationBudget)Úload_hermes_dotenv)Úget_provider_request_timeoutÚget_provider_stale_timeoutz.env)Úhermes_homeÚproject_envz$Loaded environment variables from %sz7No .env file found. Using system environment variables.)Úget_toolset_for_tool)Ú
cleanup_vmÚget_active_env)Úset_interrupt)Úcleanup_browser)Úagent_connection_surfaceÚscoped_connection_surface)Úis_trivial_prompt)ÚClientLifecycleMixin)ÚStreamDeliveryMixin)ÚStatusOutputMixin)ÚApiRequestHooksMixin)ÚPROVIDER_STREAM_PARSE_MARKERSÚApiErrorSummaryMixin)ÚInterruptControlMixin)ÚTurnExplainersMixin)ÚActivityTrackingMixin)ÚRateLimitCreditsMixin)ÚSessionPersistenceMixin)ÚCompressionFacadeMixin)ÚTurnFacadeMixin)ÚVisionMessagePrepMixin)ÚReasoningParamsMixin)ÚforwardÚforward_static)ÚActivityProvenance)Úis_local_endpoint)Úcoalesce_tool_call_idÚdeterministic_call_idÚuniquify_tool_call_ids)Ú"_derive_responses_function_call_idÚ_split_responses_tool_idÚ_summarize_user_message_for_log)ÚToolGuardrailDecisionÚappend_toolguard_guidanceÚtoolguard_synthetic_result)Úbase_url_host_matchesÚbase_url_hostnameÚ	env_floatÚ"model_forces_max_completion_tokensé   Úfnc                 ó4   — 	  | |i |¤Ž y# t         $ r Y yw xY w)zKRun one teardown step, swallowing any exception so sibling steps still run.N)r'   )r|   ÚargsÚkwargss      r   Ú_quietlyr€   ¥   s&   € ðÙ
ˆDÐ�FÓøÜò Ùðús   ‚ ‹	–ÚengineÚhookc                 óž   — t        | |«      sy	  t        | |«      |i |¤Ž y# t        $ r!}t        j	                  d||«       Y d}~yd}~ww xY w)zTInvoke an optional context-engine lifecycle hook; failures are logged, never raised.Nz'context engine %s during transition: %s)ÚhasattrrF   r'   ÚloggerÚdebug)r�   r‚   r~   r   Úexcs        r   Ú_call_engine_hookrˆ   ­   sQ   € ä�6˜4Ô ØðKØŒ�˜Ó˜tÐ. vÓ.øÜò KÜ�‰Ð>ÀÀc×JÑJûðKús   �" ¢	A«AÁAÚvaluec                 óT   — t        | t        «      rt        | t        «      s| dkD  r| S dS )zE``value`` when it is a real positive int (bools excluded), else None.r   N)Ú
isinstanceÚintÚbool)r‰   s    r   Ú_positive_intrŽ   ·   s'   € ä˜u¤cÔ*´:¸eÄTÔ3JÈuÐWXÊyˆ5ÐbÐ^bÐbó    Útask_cfgc                 ó>   — ddl m}m}  ||«      dk(  xr	  || |«      S )zaTrue when an automatic background review targets the managed local runtime under ``defer: auto``.r   )Ú
defer_modeÚreview_targets_managed_localÚauto)Úagent.review_idle_queuer’   r“   )r.   r�   r’   r“   s       r   Ú_review_should_deferr–   ¼   s#   € çPÙ�hÓ 6Ñ)Ò[Ñ.JÈ5ÐRZÓ.[Ð[r�   c                 óH   — t        t        | dd «      xs t        | «      «      S )NÚ
session_id)r(   rF   Úid)r.   s    r   Ú_review_queue_keyrš   Â   s   € ÜŒw�u˜l¨DÓ1Ò>´R¸³YÓ?Ð?r�   Úmessagesc                 óJ   ‡ ‡‡— t        ‰ dd«      Š‰rt        ˆ ˆˆfd„«       yy)z·Tell the context engine the session ended (flush DAG, close DBs) at the same lifecycle moment as the
    memory manager, so per-session engine state never leaks into the next session.Úcontext_compressorNc                  óL   •— ‰j                  ‰ j                  xs d‰xs g «      S ©Nr   )Úon_session_endr˜   )r.   r�   r›   s   €€€r   ú<lambda>z4_notify_context_engine_session_end.<locals>.<lambda>Ë   s$   ø€ ˜×.Ñ.¨u×/?Ñ/?Ò/EÀ2ÀxÂ~ÐSUÓV€ r�   )rF   r€   )r.   r›   r�   s   ``@r   Ú"_notify_context_engine_session_endr¢   Æ   s%   ú€ ô �UÐ0°$Ó7€FÙÜÕVÕWð r�   c                 ój   — | duxr. | j                  «       xr t        | j                  «       «      dkD  S )zùWait for credential-pool rotation (True) or fall back to ``fallback_model`` (False) after a 429.

    Rotation only helps when the pool has somewhere to go; a single-credential pool would retry the same quota.

    See issues #11314 and #13636.
    Né   )Úhas_availableÚlenÚentries)Úpools    r   Ú!_pool_may_recover_from_rate_limitr©   Î   s2   € ð �tÐÒP × 2Ñ 2Ó 4ÒP¼¸T¿\¹\»^Ó9LÈqÑ9PÐPr�   c                   óT   ‡ — e Zd ZdZddddœdedee   dee   dee   ddf
ˆ fd	„Zˆ xZS )
Ú_StreamErrorEventzÜProvider error synthesized from a standalone Responses ``type=error`` SSE frame (Codex-style backends).

    Gives ``_summarize_api_error`` / the entitlement detector the familiar ``.body`` / ``.status_code`` shape.
    N)ÚcodeÚparamÚstatus_codeÚmessager¬   r­   r®   r   c                ó~   •— t         ‰| �  |«       ||||f\  | _        | _        | _        | _        d|||ddœi| _        y )NÚerror)r¯   r¬   r­   Útype)ÚsuperÚ__init__r¯   r¬   r­   r®   Úbody)Úselfr¯   r¬   r­   r®   Ú	__class__s        €r   r´   z_StreamErrorEvent.__init__Þ   sH   ø€ ä‰Ñ˜Ô!Ø@GÈÈuÐVaÐ@aÑ=ˆŒ�d”i ¤¨TÔ-=à%,¸'È4ÐZ_ÐipÑ.qÐ$rˆ�	r�   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r   rŒ   r´   Ú__classcell__)r·   s   @r   r«   r«   Ø   sW   ø„ ñð
 ?CÐ[_Ø.2òs ð s¨h°s©mð sÈ8ÐTWÉ=ð sØ& s™mðsØ7;÷sñ sr�   r«   c            ¡       ó:  — e Zd ZdZdZedefd„«       Zej                  deddfd„«       Zddddddddde	j                  dddd	d	d	d
dddddddd	ddddddddddddddddddddddddddddddddddddddd	d	d	d	ddddddd	dddd	dddd	fRdedededededee   dz  dedee   dz  dedededee   dee   dedededed ed!ed"ed#ee   d$ee   d%ee   d&ed'ed(ed)ee   d*ed+ed,ed-ed.ed/ed0ed1ed2ed3ed4ed5ed6ed7ed8ed9ed:ed;ed<ed=ed>eeeegdf      d?eeegdf      d@edAeeef   dBedCeeef   dDeeeef      dEedFedGedHedIedJedKedLedMedNedOedPedQedRedSdTdUee   dVeeef   dWedXedYedZed[ed\ed]eeef   dz  d^edz  d_ef d`„Zda„ Zdefdb„Z�ddc„Zdddd	dddeœdfee   dgee   dhee   diedjeddfdk„Z	 	 �ddhee   dfee   diefdl„Zedmee   dnedee   fdo„«       Zedpedefdq„«       Z�ddmee   defdr„Z e dsdt«      Z!�ddueeeeef         deeef   fdv„Z" e#dwdx«      Z$ e dwdy«      Z% e#dwdz«      Z&d{e'defd|„Z( e dwd}«      Z) e dwd~«      Z*ded€e'ddfd�„Z+deeef   fd‚„Z, e dƒd„«      Z- e dƒd…«      Z.dee   defd†„Z/�ddedefd‡„Z0�ddedefdˆ„Z1�ddedefd‰„Z2defdŠ„Z3de4eef   fd‹„Z5dŒedefd�„Z6defdŽ„Z7�ddee   dee   fd�„Z8defd�„Z9defd‘„Z:defd’„Z;defd“„Z< e dsd”«      Z= e dsd•«      Z>ededefd–„«       Z?edd—œdedee   defd˜„«       Z@dedefd™„ZAedšedee   fd›„«       ZBdœedefd�„ZC e dsdž«      ZDedœedefdŸ„«       ZEdefd „ZF�dd¡eduee   defd¢„ZG e dsd£«      ZH e dsd¤«      ZI e d¥d¦«      ZJd§d¨lKmLZLmMZMmNZN  e#d©dª«      ZO	 	 �dd«ee   d¬ed­ed®ee   d¯eddfd°„ZP	 	 	 	 �dd«ee   d¬ed­ed®ee   d±eeeef      d²ed¯eddfd³„ZQd´ZR�ddµ„ZS e d©d¶«      ZT e dsd·«      ZUdefd¸„ZV�ddueddfd¹„ZW�ddueddfdº„ZXdd»œd¼ed½ed¾eduedz  ddf
d¿„ZY�ddÀ„ZZ�ddÁ„Z[dÂeddfdÃ„Z\dÄeegdf   ddfdÅ„Z]dÆeddfdÇ„Z^�ddÈ„Z_e�ddÉ„«       Z`�ddÊ„ZadËeeeef      ddfdÌ„ZbdËeeeef      dee4   fdÍ„ZceddËeeeef      dÎedefdÏ„«       ZeeddÐeeef   dÑedefdÒ„«       ZfedefdÓ„«       Zg e dÔdÕ«      Zh eei«      ZjedefdÖ„«       Zk elh d×£«      Zm e#dsdØ«      ZnedddÙœdÚeeef   dÛedefdÜ„«       ZoedœedefdÝ„«       Zp e#dsdÞ«      Zqedßedefdà„«       Zredßedefdá„«       Zs eet«      Zu e dsdâ«      Zv e dÔdã«      Zw eex«      Zy eez«      Z{ ee|«      Z} e d¥dä«      Z~ e d¥då«      Z e d¥dæ«      Z€defdç„Z� e dsdè«      Z‚ e dsdé«      Zƒ e d¥dê«      Z„dëe…ddfdì„Z†dëe…defdí„Z‡ddîœdïedðedñedòedÑedefdó„Zˆdefdô„Z‰dëe…defdõ„ZŠ�d	duedöed÷eddfdø„Z‹dðedefdù„ZŒ e dsdú«      Z�e�d
dûedüedýedefdþ„«       ZŽ e dÿ�d «      Z� e dÿ�d«      Z� e d¥�d«      Z‘dee   f�d„Z’y(  r/   z(AI Agent with tool calling capabilities.zŠ[hermes-agent: tool call arguments were corrupted in this session and have been dropped to keep the conversation alive. See issue #15236.]r   c                 ó   — | j                   S ©N)Ú	_base_url©r¶   s    r   Úbase_urlzAIAgent.base_urlò   s   € à�~‰~Ðr�   r‰   Nc                 ód   — || _         |r|j                  «       nd| _        t        |«      | _        y rŸ   )rÀ   r   Ú_base_url_lowerrx   Ú_base_url_hostname©r¶   r‰   s     r   rÂ   zAIAgent.base_urlö   s(   € àˆŒÙ05˜uŸ{™{œ}¸2ˆÔÜ"3°EÓ":ˆÕr�   r   FÚalléd   é   iô  é
   rÂ   Úapi_keyÚproviderÚapi_modeÚacp_commandÚacp_argsÚcommandr~   ÚmodelÚmax_iterationsÚ
tool_delayÚenabled_toolsetsÚdisabled_toolsetsÚsave_trajectoriesÚverbose_loggingÚ
quiet_modeÚtool_progress_modeÚephemeral_system_promptÚlog_prefix_charsÚ
log_prefixÚproviders_allowedÚproviders_ignoredÚproviders_orderÚprovider_sortÚprovider_require_parametersÚprovider_data_collectionÚopenrouter_min_coding_scorer˜   Útool_progress_callbackÚtool_start_callbackÚtool_complete_callbackÚthinking_callbackÚreasoning_callbackÚclarify_callbackÚread_terminal_callbackÚread_preview_callbackÚdrive_preview_callbackÚread_window_below_callbackÚconnection_callbackÚtour_callbackÚstep_callbackÚstream_delta_callbackÚinterim_assistant_callbackÚtool_gen_callbackÚstatus_callbackÚnotice_callbackÚnotice_clear_callbackÚevent_callbackÚreaction_callbackÚ
max_tokensÚreasoning_configÚservice_tierÚrequest_overridesÚprefill_messagesr   r<   r@   r=   r9   r:   r;   r>   Úgateway_session_keyÚskip_context_filesÚload_soul_identityÚskip_memoryÚskip_background_reviewÚparent_session_idÚiteration_budgetrM   Úrun_budget_secondsÚfallback_modelÚcheckpoints_enabledÚcheckpoint_max_snapshotsÚcheckpoint_max_total_size_mbÚcheckpoint_max_file_size_mbÚpass_session_idÚrequested_providerÚcapabilitiesÚcwdÚ
side_agentcS                 óÊ   — t        «       j                  «       D �S�Tci c]  \  }S}T|SdvsŒST“Œ }U}S}T|�t        j                  dt        d¬«       ddlm}V  |V| fi U¤Ž yc c}T}Sw )ub   Forwarder â€” see ``agent.agent_init.init_agent`` (same keyword parameters, minus ``tool_delay``).)r¶   rÓ   Nz_tool_delay is deprecated and ignored; sequential tool calls no longer sleep between executions.é   )Ú
stacklevelr   )Ú
init_agent)ÚlocalsÚitemsÚwarningsÚwarnÚDeprecationWarningÚagent.agent_initr  )Wr¶   rÂ   rË   rÌ   rÍ   rÎ   rÏ   rÐ   r~   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rã   r˜   rä   rå   ræ   rç   rè   ré   rê   rë   rì   rí   rî   rï   rð   rñ   rò   ró   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   r   r<   r@   r=   r9   r:   r;   r>   rþ   rÿ   r   r  r  Ú
session_dbr  r  r  r  Úcredential_poolr  r  r	  r
  r  r  r  r  r  ÚkÚvÚinit_kwargsr  sW                                                                                          r   r´   zAIAgent.__init__ü   sf   € ôV )/«¯©Ó(8×\¡  1¸AÐE[Ò<[�q˜!‘tÐ\ˆÑ\ØÐ!Ü�M‰Mð @ÜASÐ`aõcå/Ù�4Ñ'˜;Ó'ùó ]s
   œA©Ac                 óæ   — t        | dd«      ry| j                  �| j                  S 	 ddlm}  |«       | _        d| _        | j                  S # t
        $ r t        j                  dd¬«       Y yw xY w)	z”SessionDB for recall, opening the default state DB when no ``session_db`` was passed so the
        advertised ``session_search`` tool stays usable.Ú_persist_disabledFNr   )ÚacquireTz SessionDB unavailable for recall©Úexc_info)rF   Ú_session_dbÚhermes_state_registryr!  Ú_owns_session_dbr'   r…   r†   )r¶   r!  s     r   Ú_get_session_db_for_recallz"AIAgent._get_session_db_for_recall.  su   € ô
 �4Ð,¨eÔ4ØØ×ÑÐ'Ø×#Ñ#Ð#ð	Ý5á&›yˆDÔØ$(ˆDÔ!Ø×#Ñ#Ð#øÜò 	Ü�L‰LÐ;ÀdˆLÔKÙð	ús   ¨$A Á A0Á/A0c                 ó˜   — | j                   }	 ddlm}  || j                  «      rt	        |xs i «      }d|d<   |S # t
        $ r Y |S w xY w)zó``model_config`` for the session row: the init config plus the live YOLO bypass.

        The row is created lazily on the first turn, so this is the only chance to record a pre-first-turn
        /yolo toggle for ``hermes --resume``.
        r   )Úis_session_yolo_enabledTÚ	yolo_mode)Ú_session_init_model_configÚtools.approvalr)  r˜   Údictr'   )r¶   Úmodel_configr)  s      r   Ú_session_row_model_configz!AIAgent._session_row_model_configA  s^   € ð ×6Ñ6ˆð	Ý>Ù& t§¡Ô7Ü# LÒ$6°BÓ7�Ø,0�˜[Ñ)ð Ðøô ò 	ØØÐð	ús   Ž,< ¼	A	ÁA	c                 ó¦  — t        | dd«      s| j                  s| j                  syt        | j                  «      }	 	 ddlm}  |«       }| j                  j                  | j                  || j                  | j                  «       | j                  t        | dd«      t        | dd«      t        | dd«      t        | d	d«      t        | d
d«      t        | dd«      xs t        | dd«      t        | «      | j                  t        |«      |¬«       d| _        y# t        $ r d}Y ŒØw xY w# t        $ r }t         j#                  d|«       Y d}~yd}~ww xY w)zYCreate the session DB row on first use; a transient failure leaves it to retry next turn.r   FNr   rB   r3   r2   r1   r5   r8   r4   r7   )r˜   r   rÑ   r.  Úsystem_promptr<   rJ   r9   r;   r>   Údisplay_nameÚorigin_jsonr  r  Úprofile_nameTz5Session DB creation failed (will retry next turn): %s)rF   Ú_session_db_createdr$  r-   r   rG   rC   r'   Úcreate_sessionr˜   rÑ   r/  Ú_cached_system_promptrL   Ú_parent_session_idr   r…   Úwarning)r¶   r   rC   Úprofile_for_sessionÚes        r   Ú_ensure_db_sessionzAIAgent._ensure_db_sessionQ  sD  € ä�4Ð,¨eÔ4¸×8PÒ8PÐX\×XhÒXhØÜ*¨4¯=©=Ó9ˆð	Wð	+ÝGÙ&=Ó&?Ð#ð ×Ñ×+Ñ+ØŸ?™?°6ÀÇÁØ!×;Ñ;Ó=ÈT×MgÑMgÜ  j°$Ó7ÄWÈTÐSiÐkoÓEpÜ  j°$Ó7Ä7È4ÐQ]Ð_cÓCdÜ! $¨°dÓ;Ü$ T¨<¸Ó>ÒcÄ'È$ÐP\Ð^bÓBcÜ0°Ó6È$×JaÑJaÜ+¨FÓ3ÐBUð ,ô 	ð (,ˆDÕ$øô' ò +ð '+Ò#ð+ûô( ò 	Wä�N‰NÐRÐTU×VÑVûð	Wús6   ¾D ÁC
D' ÄD$Ä!D' Ä#D$Ä$D' Ä'	EÄ0EÅET©Úold_session_idÚnew_session_idÚprevious_messagesÚcarry_over_contextÚreset_enginer>  r?  r@  rA  rB  c          
      ó  — t        | dd«      }|sy|r|�t        |d||«       |rt        |d«       t        |xs |duxs |xs |«      }|xs t        | dd«      xs d}	|r„|	r‚t        |d«      rv||t	        t        | dd«      «      t        | d	d«      t        |d
d«      t        | dd«      dœ|¥}
|
j                  «       D ��ci c]  \  }}|dvsŒ||“Œ }
}}t        |d|	fi |
¤Ž |r|r|	rt        |d||	«       yyyyc c}}w )uÐ   Drive the context engine's session transition: on_session_end â†’ on_session_reset â†’ on_session_start
        â†’ carry_over_new_session_context. Each hook is optional (the built-in compressor only resets).r�   Nr    Úon_session_resetr˜   r   Úon_session_startr   rÑ   Úcontext_lengthr2   )r>  rA  r   rÑ   rF  Úconversation_idrŸ   Úcarry_over_new_session_context)rF   rˆ   r�   r„   r-   r  )r¶   r>  r?  r@  rA  rB  Úextra_contextr�   Úshould_startÚtarget_session_idÚstart_contextr  r  s                r   Ú"_transition_context_engine_sessionz*AIAgent._transition_context_engine_sessiont  sF  € ô ˜Ð3°TÓ:ˆÙØÙÐ/Ð;Ü˜fÐ&6¸ÐHYÔZÙÜ˜fÐ&8Ô9ä˜NÒrÐ.?ÀtÐ.KÒrÐOaÒrÐerÓsˆØ*ÒS¬g°d¸LÈ"Ó.MÒSÐQSÐÙÑ-´'¸&ÐBTÔ2Uà"0ÐHZÜ5´g¸dÀJÐPTÓ6UÓVÜ   w°Ó3ÄwÈvÐWgÐimÓGnÜ#*¨4Ð1GÈÓ#Nñ	ð S`ð	ˆMð /<×.AÑ.AÓ.C×[¡d a¨ÀqÐPZÒGZ˜Q ™TÐ[ˆMÑ[Ü˜fÐ&8Ð:KÑ]È}Ò]Ù¡.Ñ5FÜ˜fÐ&FÈÐXiÕjð 6G .Ðùó \s   ÃC=ÃC=c                 ó  — dD ]  }t        | |d«       Œ d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        | j                  |t        | dd«      ||d	¬
«       t        | dd«      }t        | dd«      xs d}|�@t        |d«      r3|r0|t        |dd«      k7  r	 |j                  t        | dd«      |«       yyyyy# t        $ r }t         j#                  d|«       Y d}~yd}~ww xY w)a  Reset session-scoped token/cost counters and compressor state for a fresh session.

        With ``previous_messages`` / ``old_session_id`` / ``carry_over_context`` the context engine gets the
        full transition lifecycle instead of a bare reset.
        )	Úsession_total_tokensÚsession_input_tokensÚsession_output_tokensÚsession_prompt_tokensÚsession_completion_tokensÚsession_cache_read_tokensÚsession_cache_write_tokensÚsession_reasoning_tokensÚsession_api_callsr   g        ÚunknownÚnoneNFr˜   Tr=  r�   r   Úbind_session_stateÚ_session_idr$  z2context engine bind_session_state during reset: %s)ÚsetattrÚsession_estimated_cost_usdÚsession_cost_statusÚsession_cost_sourceÚ_usage_anchorÚ_turn_base_usage_anchorÚ_frozen_workspace_snapshotÚ_user_turn_countÚ_compaction_prompt_drift_loggedÚ_turn_authorÚ_is_user_initiated_turnrM  rF   r„   rZ  r'   r…   r†   )r¶   r@  r>  rA  Úcounterr�   rK  r‡   s           r   Úreset_session_statezAIAgent.reset_session_state‘  sG  € ð
ò 	&ˆGô
 �D˜' 1Õ%ð	&ð +.ˆÔ'Ø#,ˆÔ Ø#)ˆÔ ð "ˆÔØ'+ˆÔ$ð +/ˆÔ'ð !"ˆÔà/4ˆÔ,à ˆÔà',ˆÔ$à×/Ñ/Ø)¼'À$ÈÐVZÓ:[Ø/ÐDVÐeið 	0ô 	
ô ˜Ð3°TÓ:ˆÜ# D¨,¸Ó;ÒA¸rÐØÐ¤7¨6Ð3GÔ#HÑM^Ø%¬°¸ÈÓ)KÒKðXØ×)Ñ)¬'°$¸ÀtÓ*LÐN_Õ`ð Lð N_Ð#HÐøô ò XÜ—‘ÐQÐSV×WÑWûðXús   Â;C Ã	DÃ&DÄDÚconfig_context_lengthÚruntime_context_lengthc                 óÎ   — t        | «      }t        t        |d|«      «      }t        t        |dd«      «      st        t        |dd«      «      r|€y|�|�t        ||«      S |�|S |S )zGReturn a safe context budget from explicit intent and verified runtime.rF  ÚrejectedFÚload_attemptedN)rŽ   rF   r�   Úmin)ri  rj  r,   Úruntimes       r   Ú"_effective_lmstudio_context_lengthz*AIAgent._effective_lmstudio_context_lengthÂ  sy   € ô !Ð!6Ó7ˆÜ¤Ð(>Ð@PÐRhÓ iÓjˆÜ”Ð.°
¸EÓBÔCÜ”Ð/Ð1AÀ5ÓIÔJÈwÈàØÐ 8Ð#7Ü�w Ó)Ð)Ø!Ð-ˆwÐ;°8Ð;r�   Úload_resultc                 ó€   — t        t        | dd«      «      xs' t        t        | dd«      «      xr t        | dd«      du S )z@Return true when a management load was rejected or unverifiable.rl  Frm  rF  N©r�   rF   )rq  s    r   Ú_lmstudio_load_was_unverifiedz%AIAgent._lmstudio_load_was_unverifiedÏ  sG   € ô ”G˜K¨°UÓ;Ó<ò 
Ü”˜Ð&6¸Ó>Ó?ÒxÄGÈKÐYiÐkoÓDpÐtxÐDxð	
r�   c           	      óp  — | j                   xs dj                  «       j                  «       dk7  ryt        | dd«      xs dj                  «       j                  «       dk(  rt        j                  d«       ydd	lm} |€t        | d
d«      } || j                  | j                  t        | dd«      |d¬«      S )z;Preload LM Studio unless configured to rely on JIT loading.r   ÚlmstudioNÚlmstudio_load_moder,   Újitz:LM Studio explicit preload skipped: lmstudio_load_mode=jitr   )Úensure_lmstudio_model_loadedÚ_config_context_lengthrË   T)Úreturn_load_result)
rÌ   r   r   rF   r…   r†   Úhermes_cli.models_localry  rÑ   rÂ   )r¶   ri  ry  s      r   Ú_ensure_lmstudio_runtime_loadedz'AIAgent._ensure_lmstudio_runtime_loadedÖ  s¦   € à�M‰MÒ˜R×&Ñ&Ó(×.Ñ.Ó0°JÒ>ØÜ�DÐ.°
Ó;ÒI¸z×PÑPÓR×XÑXÓZÐ^cÒcÜ�L‰LÐUÔVØÝHà Ð(Ü$+¨DÐ2JÈDÓ$QÐ!Ù+Ø�J‰J˜Ÿ™¤w¨t°YÀÓ'CÐEZÐosô
ð 	
r�   zagent.agent_runtime_helpersÚswitch_modelr›   c                 ó  — dx}}t        |t        «      r|ng D ]`  }t        |t        «      r|j                  d«      dk7  rŒ(|j	                  dd«      }t        |t        «      sŒK|sŒN|dz  }|t        |«      z  }Œb d| _        ||dœS )	z¿On HTTP 400 ``invalid_encrypted_content``: disable Responses reasoning replay and pop
        ``codex_reasoning_items`` from every assistant message. Returns ``{"messages", "items"}`` counts.r   ÚroleÚ	assistantÚcodex_reasoning_itemsNr¤   F)r›   r  )r‹   Úlistr-  r   Úpopr¦   Ú_codex_reasoning_replay_enabled)r¶   r›   Ústripped_messagesÚstripped_itemsÚmsgr  s         r   Ú_disable_codex_reasoning_replayz'AIAgent._disable_codex_reasoning_replayç  s�   € ð ./Ð.Ð˜NÜ *¨8´TÔ :‘HÀò 	-ˆCÜ˜c¤4Ô(¨C¯G©G°F«O¸{Ò,JØØ—G‘GÐ3°TÓ:ˆEÜ˜%¤Õ&ª5Ø! QÑ&Ð!Ø¤# e£*Ñ,‘ð	-ð 05ˆÔ,Ø-¸ÑGÐGr�   zagent.stream_diagÚstream_diag_initÚstream_diag_capture_responseÚflatten_exception_chainr±   c                 óÂ   ‡— t        | dd«      dk(  xrM t        ‰t        «      xr; t        ‰t        t        j
                  f«       xr t        ˆfd„t        D «       «      S )zÃTrue for a malformed Anthropic event-stream frame (surfaced by the SDK as a plain ``ValueError``);
        that is wire trouble, not local validation, so it follows the truncated-JSON retry path.rÍ   NÚanthropic_messagesc              3   óp   •K  — | ]-  }|t        ‰«      j                  «       j                  «       v –— Œ/ y ­wr¿   )r(   r   r   )Ú.0Úmarkerr±   s     €r   ú	<genexpr>z:AIAgent._is_provider_stream_parse_error.<locals>.<genexpr>þ  s,   øè ø€ ÒiÀ˜¤# e£*×"2Ñ"2Ó"4×":Ñ":Ó"<Ô<Ñiùs   ƒ36)rF   r‹   Ú
ValueErrorÚUnicodeEncodeErrorrH   ÚJSONDecodeErrorÚanyr_   )r¶   r±   s    `r   Ú_is_provider_stream_parse_errorz'AIAgent._is_provider_stream_parse_errorù  sb   ø€ ô ˜˜j¨$Ó/Ð3GÑGò jÌJÐW\Ô^hÓLiò jÜ" 5Ô+=¼t×?SÑ?SÐ*TÓUÐUòjäÓiÔKhÔiÓið	kr�   Úlog_stream_retryÚemit_stream_dropÚtaskr‡   c                 ó"  — 	 | j                  |«      }|xs |j                  j                  j                  «       }t        |«      dkD  r|dd j                  «       dz   }| j                  d|› d|› �«       y# t        $ r t        |«      }Y Œzw xY w)z4Surface a compact warning for failed auxiliary work.éÜ   NéÙ   z...u   âš  Auxiliary z	 failed: )	Ú_summarize_api_errorr'   r(   r·   r¸   r   r¦   ÚrstripÚ_emit_warning)r¶   rš  r‡   Údetails       r   Ú_emit_auxiliary_failurezAIAgent._emit_auxiliary_failure  s�   € ð	Ø×.Ñ.¨sÓ3ˆFð Ò2˜CŸM™M×2Ñ2×9Ñ9Ó;ˆÜˆv‹;˜ÒØ˜D˜S�\×(Ñ(Ó*¨UÑ2ˆFØ×Ñ˜^¨D¨6°¸6¸(ÐCÕDøô ò 	Ü˜“XŠFð	ús   ‚A7 Á7BÂBc           	      óL   — dD �ci c]  }|t        | |d«      xs d“Œ c}S c c}w )zBReturn the live main runtime for session-scoped auxiliary routing.)rÑ   rÌ   rÂ   rË   rÍ   Ú	auth_moder˜   r   ©rF   )r¶   Úkeys     r   Ú_current_main_runtimezAIAgent._current_main_runtime  s8   € ð kö
àð ”˜˜s BÓ'Ò-¨2Ñ-ò
ð 	
ùò 
s   …!zagent.conversation_compressionÚ#check_compression_model_feasibilityÚreplay_compression_warningc                 óf   — |�t        |«      S t        | dd«      xs t        t        | dd«      «      S )zCHostname of ``base_url``, or of the agent's own base URL when None.rÅ   r   rÄ   )rx   rF   ©r¶   rÂ   s     r   Ú_hostname_forzAIAgent._hostname_for  s:   € àÐÜ$ XÓ.Ð.Ü�tÐ1°2Ó6ÒqÔ:KÌGÐTXÐZkÐmoÓLpÓ:qÐqr�   c                 ó*   — | j                  |«      dk(  S )z8Return True when a base URL targets OpenAI's native API.zapi.openai.com)r¬  r«  s     r   Ú_is_direct_openai_urlzAIAgent._is_direct_openai_url  s   € à×!Ñ! (Ó+Ð/?Ñ?Ð?r�   c                 ór   — |�t        |«      j                  «       nt        | dd«      xs d}t        |d«      S )zZTrue when a base URL targets Azure OpenAI (standard client, but NO Responses API support).rÄ   r   zopenai.azure.com)r(   r   rF   rw   )r¶   rÂ   Úurls      r   Ú_is_azure_openai_urlzAIAgent._is_azure_openai_url"  s:   € à'/Ð';Œc�(‹m×!Ñ!Ô#Ä'È$ÐPaÐceÓBfÒBlÐjlˆÜ$ SÐ*<Ó=Ð=r�   c                 ón   — | j                  |«      }t        |«      xr |dk(  xs |j                  d«      S )zKReturn True when a base URL targets GitHub Copilot's OpenAI-compatible API.úapi.githubcopilot.comz.githubcopilot.com)r¬  r�   Úendswith)r¶   rÂ   Úhostnames      r   Ú_is_github_copilot_urlzAIAgent._is_github_copilot_url'  s8   € à×%Ñ% hÓ/ˆÜ�H‹~Òr 8Ð/FÑ#FÒ#qÈ(×J[ÑJ[Ð\pÓJqÐrr�   c                 ób   — t        | j                  | j                  «      }|�|S t        dd«      S )zˆPer-call request timeout: per-model ``timeout_seconds`` > provider ``request_timeout_seconds`` >
        ``HERMES_API_TIMEOUT`` > 1800s.ÚHERMES_API_TIMEOUTg      œ@)rO   rÌ   rÑ   ry   )r¶   Úcfgs     r   Ú_resolved_api_call_timeoutz"AIAgent._resolved_api_call_timeout,  s/   € ô +¨4¯=©=¸$¿*¹*ÓEˆØ�oˆsÐR¬9Ð5IÈ6Ó+RÐRr�   c                 óÔ   — t        | j                  | j                  «      }|�|dfS t        j                  d«      }|�t        |«      dfS ddlm}  || j                  «      }|�|dfS y)aS  Base non-stream stale timeout: per-model ``stale_timeout_seconds`` > provider-wide >
        ``HERMES_API_CALL_STALE_TIMEOUT`` > reasoning floor > 90s.

        Returns ``(seconds, uses_implicit_default)``; the implicit flag lets callers auto-disable the detector
        for local endpoints only when the user configured nothing.
        FÚHERMES_API_CALL_STALE_TIMEOUTr   )Ú!get_reasoning_stale_timeout_floor)g     €V@T)rP   rÌ   rÑ   r   ÚgetenvÚfloatÚagent.reasoning_timeoutsr½  )r¶   r¹  Úenv_timeoutr½  Úreasoning_floors        r   Ú%_resolved_api_call_stale_timeout_basez-AIAgent._resolved_api_call_stale_timeout_base2  st   € ô )¨¯©¸¿
¹
ÓCˆØˆ?Ø˜�:ÐÜ—i‘iÐ ?Ó@ˆØÐ"Ü˜Ó% uÐ,Ð,õ 	OÙ;¸D¿J¹JÓGˆØÐ&Ø" EÐ)Ð)Ør�   Úapi_payloadc                 ó$  — | j                  «       \  }}t        | dd«      xs | j                  xs d}|r|rt        |«      rt	        d«      S ddlm}m}  ||«      }|dkD  rt        |d«      n|d	kD  rt        |d
«      n|}| j                  «       }	| j                  dk(  r|	st        | || «      «      }t        | dd«      }
t        | dd«      }|
r@|r>|	s<t	        |
«      t        j                  «       |z
  z
  }t        |t        d|dz  «      «      }|S )z³Effective non-stream stale timeout for ``api_payload`` (an ``api_kwargs`` dict or legacy ``messages``
        list), scaled by estimated context size and capped by the run budget.rÀ   Nr   Úinfr   )Ú_high_effort_silence_floorÚestimate_request_context_tokensi † g      n@iPÃ  g     Àb@Úcodex_responsesr  Ú_run_budget_started_atg      N@g      à?)rÃ  rF   rÂ   rm   r¿  Úagent.chat_completion_helpersrÇ  rÈ  ÚmaxÚ_stale_timeout_is_explicitrÍ   Útimern  )r¶   rÄ  Ú
stale_baseÚuses_implicit_defaultrÂ   rÇ  rÈ  Ú
est_tokensÚtimeoutr,   Ú
run_budgetÚstartedÚ	remainings                r   Ú!_compute_non_stream_stale_timeoutz)AIAgent._compute_non_stream_stale_timeoutG  s  € ð -1×,VÑ,VÓ,XÑ)ˆ
Ð)Ü˜4 ¨dÓ3ÒJ°t·}±}ÒJÈˆÙ ¡XÔ2CÀHÔ2MÜ˜“<ÐçmÙ4°[ÓAˆ
Ø,6¸Ò,@”#�j %Ô(Ð`jÐmsÒ`sÄcÈ*ÐV[ÔF\ð  zDˆØ×2Ñ2Ó4ˆð �=‰=Ð-Ò-±hÜ˜'Ñ#=¸dÓ#CÓDˆGô ˜TÐ#7¸Ó>ˆ
Ü˜$Ð 8¸$Ó?ˆÙ™'©(Ü˜jÓ)¬T¯Y©Y«[¸7Ñ-BÑCˆIÜ˜'¤3 t¨Y¸©_Ó#=Ó>ˆGØˆr�   c                 óx   — t        | j                  | j                  «      duxs t        j                  d«      duS )zÀTrue when the user explicitly configured the stale timeout (config or env var); implicit values
        (reasoning floors, the 90s default) yield to the run-budget cap, explicit ones never do.Nr¼  )rP   rÌ   rÑ   r   r¾  rÁ   s    r   rÍ  z"AIAgent._stale_timeout_is_explicit`  s9   € ô +¨4¯=©=¸$¿*¹*ÓEÈTÐQò JÜ—9‘9Ð<Ó=ÀTÐIð	Kr�   c                 óÒ   — | j                   dk7  ryddlm}  || «      j                  sy|�|n| j                  xs d}t        j                  d|j                  «       «      syd|›d�S )	zÏActionable hint when the request matches a known Codex silent-reject shape (currently the ``gpt-5.5``
        family: connection accepted, no events, no error), else None. Makes the stale timeout actionable.rÉ  Nr   )Úclassify_responses_router   z(?:^|[/\-_])gpt-5\.5(?:$|[\-_])z/Codex backend appears to be silently rejecting ay   on chatgpt.com/backend-api/codex (no stream events, no error). This is a known backend-side pattern that has affected ChatGPT Plus accounts intermittently. Workaround: try `gpt-5.4` on the same OAuth profile, or switch to a different model/provider in your fallback chain. Some ChatGPT Codex accounts do not support `gpt-5.4-codex`. See hermes-agent#21444 for symptom history.)rÍ   Úagent.codex_responses_adapterrÙ  Úis_codex_backendrÑ   ÚreÚsearchr   )r¶   rÑ   rÙ  Ú	eff_models       r   Ú_codex_silent_hang_hintzAIAgent._codex_silent_hang_hintf  sm   € ð �=‰=Ð-Ò-ØÝJá'¨Ó-×>Ò>ØØ#Ð/‘U°T·Z±ZÒFÀBˆ	ä�y‰yÐ;¸Y¿_¹_Ó=NÔOØà=¸i¸]ð K:ð :ð		
r�   c                 ó.   — t        | j                  d«      S )z1Return True when the base URL targets OpenRouter.zopenrouter.ai©rw   rÄ   rÁ   s    r   Ú_is_openrouter_urlzAIAgent._is_openrouter_url~  s   € ä$ T×%9Ñ%9¸?ÓKÐKr�   c                 ó,   ‡ — t        ˆ fd„dD «       «      S )zFReturn True when the base URL targets GitHub Copilot or GitHub Models.c              3   óJ   •K  — | ]  }t        ‰j                  |«      –— Œ y ­wr¿   rá  )r�  Úhr¶   s     €r   r’  z*AIAgent._is_copilot_url.<locals>.<genexpr>„  s   øè ø€ ÒyÀaÔ(¨×)=Ñ)=¸q×AÑyùs   ƒ #)r³  zmodels.github.ai)r–  rÁ   s   `r   Ú_is_copilot_urlzAIAgent._is_copilot_url‚  s   ø€ äÓyÐKxÔyÓyÐyr�   c                 ó‚   — | j                   xs dj                  «       j                  «       dv xs | j                  «       S )zÆTrue when the active provider is GitHub Copilot under any alias (``copilot`` / ``github-copilot`` /
        ``github``) or by base URL; a bare equality check would silently skip credential recovery.r   >   úgithub-copilotÚgithubÚcopilot)rÌ   r   r   ræ  rÁ   s    r   Ú_is_copilot_providerzAIAgent._is_copilot_provider†  s:   € ð —‘Ò# ×*Ñ*Ó,×2Ñ2Ó4Ð8_Ð_ÒyÐcg×cwÑcwÓcyÐyr�   c                 óp   — t        | dd«      dk(  xr% t        | dd«      dk(  xr dt        | dd«      xs dv S )	z:Return True for the ChatGPT OAuth Codex Responses backend.rÍ   NrÉ  rÅ   r   zchatgpt.comz/backend-api/codexrÄ   r¥  rÁ   s    r   Ú_is_codex_backendzAIAgent._is_codex_backend‹  sP   € ä˜˜j¨$Ó/Ð3DÑDò YÜ˜DÐ"6¸Ó;¸}ÑLòYà(¬W°TÐ;LÈbÓ-QÒ-WÐUWÐXð	Zr�   Úanthropic_prompt_cache_policyÚ._direct_native_anthropic_tool_cache_capabilityc                 óf   — | j                  «       j                  dd«      d   j                  d«      S )zuTrue for GPT-5.x, which OpenAI and OpenRouter reject on /v1/chat/completions
        (``unsupported_api_for_model``).ú/r¤   éÿÿÿÿzgpt-5)r   ÚrsplitÚ
startswith)rÑ   s    r   Ú_model_requires_responses_apiz%AIAgent._model_requires_responses_api”  s-   € ð �{‰{‹}×#Ñ# C¨Ó+¨BÑ/×:Ñ:¸7ÓCÐCr�   )rÌ   c                óú   — ddl m} |xs dj                  «       j                  «       }|dv s ||«      ryddlm}  ||«      ry|dk(  r	 ddlm}  || «      S t        j                  | «      S # t        $ r Y Œ w xY w)	zCReturn True when this provider/model pair should use Responses API.r   )Úis_actual_router   )ÚnousÚcustomF)Ú_is_external_process_providerrê  )Ú!_should_use_copilot_responses_api)Úhermes_cli.providersr÷  r   r   Ú$hermes_cli.runtime_provider_backendsrú  Úhermes_cli.modelsrû  r'   r/   rõ  )rÑ   rÌ   r÷  Únormalized_providerrú  rû  s         r   Ú&_provider_model_requires_responses_apiz.AIAgent._provider_model_requires_responses_apiš  sŒ   € õ 	9Ø'š~¨2×4Ñ4Ó6×<Ñ<Ó>Ðð Ð"4Ñ4¹ÈÔ8QØõ
 	WÙ(Ð)<Ô=ØØ )Ò+ðÝOÙ8¸Ó?Ð?ô ×4Ñ4°UÓ;Ð;øô ò Ùðús   ÁA. Á.	A:Á9A:c                 óœ   — | j                  «       s5| j                  «       s%| j                  «       st        | j                  «      rd|iS d|iS )zÉ``max_completion_tokens`` for newer OpenAI families (and Azure / Copilot serving them), else
        ``max_tokens``. URL-first, then model-name fallback for third-party endpoints fronting those models.Úmax_completion_tokensrù   )r®  r±  r¶  rz   rÑ   rÆ   s     r   Ú_max_tokens_paramzAIAgent._max_tokens_param²  sH   € ð ×&Ñ&Ô(¨D×,EÑ,EÔ,GÈ4×KfÑKfÔKhÜ5°d·j±jÔAØ+¨UÐ3Ð3Ø˜eÐ$Ð$r�   Ú
api_kwargsc                 ó¦   — t        | t        «      sydD ]&  }	 t        | j                  |«      «      }|dkD  sŒ$|c S  y# t        t
        f$ r Y Œ;w xY w)z@Extract the outgoing response token cap from a prepared request.N)Úmax_output_tokensr  rù   r   )r‹   r-  rŒ   r   Ú	TypeErrorr“  )r  r¦  r‰   s      r   Ú%_requested_output_cap_from_api_kwargsz-AIAgent._requested_output_cap_from_api_kwargsº  sd   € ô ˜*¤dÔ+ØØOò 	ˆCðÜ˜JŸN™N¨3Ó/Ó0�ð �q‹yØ’ð	ð øô	 œzÐ*ò Ùðús   ˜>¾AÁAÚcontentc                 ól   — t        |«      xr( t        | j                  |«      j                  «       «      S )z[True when text remains after stripping reasoning blocks (reasoning-only output is retried).)r�   Ú_strip_think_blocksr   )r¶   r	  s     r   Ú_has_content_after_think_blockz&AIAgent._has_content_after_think_blockÈ  s*   € ä�G‹}ÒP¤ d×&>Ñ&>¸wÓ&G×&MÑ&MÓ&OÓ!PÐPr�   Ústrip_think_blocksc                 óˆ   — | xs dj                  «       }|sy|d   }|j                  d«      xs |dv xs t        |«      dk\  S )zCHeuristic: does visible assistant text look intentionally finished?r   Frò  z```u%   .!?:)"']}ã€‚ï¼�ï¼Ÿï¼šï¼‰ã€‘ã€�ã€�ã€‹^i ó )rŸ  r´  Úord)r	  ÚstrippedÚlasts      r   Ú_has_natural_response_endingz$AIAgent._has_natural_response_endingÎ  sS   € ð ’M˜r×)Ñ)Ó+ˆÙØØ˜‰|ˆà× Ñ  Ó'Òs¨4Ð3[Ð+[ÒsÔ_bÐcgÓ_hÐlsÑ_sÐsr�   c                 óÔ   — | j                   xs dj                  «       }| j                  xs dj                  «       }d|vr|dk7  ry| j                  }d|v sd|v ryd|v sd|v ry	|dk(  S )
uè  Ollama-hosted GLM models misreport finish_reason='stop'. Matches only explicit Ollama signatures
        (port 11434, "ollama" in URL, provider ollama), never arbitrary local proxies; excludes Ollama Cloud
        (``ollama.com`` / ``:cloud``), which reports faithfully â€” rewriting it would manufacture truncations.

        Crucially it does NOT match arbitrary local/private endpoints (LiteLLM/sglang/vLLM/LM Studio
        proxies, Tailscale boxes), which report finish_reason correctly and were the source of #13971's
        false-positive truncation continuations.
        Two signatures identify it: the ``ollama.com`` host (provider ``ollama-cloud``) and the ``:cloud``
        model suffix (cloud generation proxied through a local 11434 endpoint, #98406). Applying the
        stopâ†’length rewrite to them manufactures false truncations and causes the continuation nudge to
        consume the model's output budget on the next retry, making further false-positives more likely.
        r   ÚglmÚzaiFz
ollama.comz:cloudÚollamaz:11434T)rÑ   r   rÌ   rÄ   )r¶   Úmodel_lowerÚprovider_lowerÚbases       r   Ú_is_ollama_glm_backendzAIAgent._is_ollama_glm_backendØ  s~   € ð —z‘zÒ' R×.Ñ.Ó0ˆØŸ-™-Ò-¨2×4Ñ4Ó6ˆØ˜Ñ#¨¸%Ò(?ØØ×#Ñ#ˆà˜4Ñ 8¨{Ñ#:ØØ�tÑ˜x¨4Ñ/ØØ Ñ)Ð)r�   Úfinish_reasonc                 ó‚  — |dk7  s| j                   dk7  s| j                  «       syt        d„ |xs g D «       «      sy|�t        |dd«      ryt        |dd«      }t	        |t
        «      sy| j                  |«      j                  «       }t        |«      dk  st        j                  d	|«      sy| j                  |«       S )
zIDetect conservative stop->length misreports for Ollama-hosted GLM models.ÚstopÚchat_completionsFc              3   óh   K  — | ]*  }t        |t        «      xr |j                  d «      dk(  –— Œ, y­w)r€  ÚtoolN©r‹   r-  r   )r�  rˆ  s     r   r’  z:AIAgent._should_treat_stop_as_truncated.<locals>.<genexpr>õ  s,   è ø€ ÒcÈ3”:˜c¤4Ó(ÒF¨S¯W©W°V«_ÀÑ-FÓFÑcùó   ‚02NÚ
tool_callsr	  rÉ   z\s)rÍ   r  r–  rF   r‹   r(   r  r   r¦   rÜ  rÝ  r  )r¶   r  Úassistant_messager›   r	  Úvisible_texts         r   Ú_should_treat_stop_as_truncatedz'AIAgent._should_treat_stop_as_truncatedñ  s¹   € à˜FÒ" d§m¡mÐ7IÒ&IÐQU×QlÑQlÔQnØÜÑcÐS[ÒSaÐ_aÔcÔcØØÐ$¬Ð0AÀ<ÐQUÔ(VØÜÐ+¨Y¸Ó=ˆÜ˜'¤3Ô'ØØ×/Ñ/°Ó8×>Ñ>Ó@ˆÜˆ|Ó˜rÒ!¬¯©°5¸,Ô)GØØ×4Ñ4°\ÓBÐBÐBr�   Ú!looks_like_codex_intermediate_ackÚextract_reasoningzagent.chat_completion_helpersÚcleanup_task_resourcesr   )Ú_MEMORY_REVIEW_PROMPTÚ_SKILL_REVIEW_PROMPTÚ_COMBINED_REVIEW_PROMPTzagent.background_reviewÚ#summarize_background_review_actionsÚmessages_snapshotÚreview_memoryÚreview_skillsÚfocusr,   c                 ó  — |€t        | dd«      dkD  ryd}|€ddlm}  |«       \  }}|syddlm}	 t         |	|«      |||||¬«      }
|€1|s/t        | |«      r#ddlm} |j                  | t        | «      |
«       y | j                  di |
¤Ž y)	ay  Post-turn review entry point: decide WHEN, then spawn.

        A review whose runtime is the MANAGED LOCAL llama-server is queued for machine idle (``defer: auto``)
        instead of hitting the user's GPU mid-session; everything else spawns immediately. ``explicit``
        (/refine) is never deferred but does not touch the ``focus``-keyed delegate/enabled gates.
        NÚ_delegate_depthr   )Úload_background_review_settings)Ú!_clone_background_review_messages)r.  r/  r0  r1  r�   r,   ©ÚQUEUE© )rF   Úagent.background_reviewr4  Úagent.turn_finalizerr5  r-  r–   r•   r7  Úenqueuerš   Ú_spawn_background_review_now)r¶   r.  r/  r0  r1  r,   r�   r4  Úenabledr5  r   r7  s               r   Ú_spawn_background_reviewz AIAgent._spawn_background_review	  s¦   € ð ˆ=œW TÐ+<¸aÓ@À1ÒDØØˆØˆ=ÝOÙ ?Ó AÑˆG�XÙØõ 	KÜÑ(IÐJ[Ó(\Ø$1ÀÐV[ÐfnØ'ô)ˆð ˆ=¡Ô.BÀ4ÈÔ.RÝ5Ø�M‰M˜$Ô 1°$Ó 7¸Ô@ØØ)ˆ×)Ñ)Ñ3¨FÓ3r�   r�   Ú_requeue_attemptsc                 ó  ‡ ‡‡‡‡‡‡‡‡‡— ddl m}m}	m}
 ddlm}  |	‰ «      Š‰€y	  |
‰ ‰‰‰‰‰‰‰¬«      \  Š}d
ˆˆˆˆˆˆˆˆ ˆˆf
d„}t        j                   ||«      dd¬	«      j                  «        y# t        $ r  |‰ ‰«       ‚ w xY w)aó  Spawn the background memory/skill review thread.

        ``threading.Thread`` is constructed here so tests patching ``run_agent.threading.Thread`` keep working.
        ``focus`` is /refine steering text; ``task_cfg`` is the pre-loaded config block (None on direct calls).
        ``explicit`` (/refine) forks under the ``refine_review`` write origin, keeping the full
        memory operation set. A deferred review preempted by a live turn is requeued (bounded)
        rather than lost.
        r   )Úfinish_background_review_runÚprepare_background_review_runÚspawn_background_review_thread)Úpropagate_context_to_threadN)r/  r0  r1  r�   Ú
review_runr,   c                  ó^   •
—  ‰«        ‰j                  ‰t        ‰‰‰‰‰	‰ dz   ‰¬«      «       y )Nr¤   )r.  r/  r0  r1  r�   r?  r,   )Ú_maybe_requeue_preempted_reviewr-  )
r?  r,   r1  r.  r/  rE  r0  r¶   Útargetr�   s
   €€€€€€€€€€r   Ú_target_with_requeuezBAIAgent._spawn_background_review_now.<locals>._target_with_requeueC  s9   ø€ Ù”Ø×4Ñ4°ZÄØ&7À}ÐdqØ¨(ÐFWÐZ[ÑF[Ø%ôB'õ (r�   Tz	bg-review)rH  ÚdaemonÚname©r   N)
r9  rA  rB  rC  Útools.thread_contextrD  Ú	threadingÚThreadÚstartr'   )r¶   r.  r/  r0  r1  r�   r?  r,   rA  rB  rC  rD  Ú_promptrI  rE  rH  s   ````````      @@r   r<  z$AIAgent._spawn_background_review_now)  s›   ÿù€ ÷	
ñ 	
õ 	Eá2°4Ó8ˆ
ØÐØð	Ù<ØÐ'°}ÐTaØ h¸:ÐPXô‰OˆF�G÷
(ö (ô ×ÑÑ$?Ð@TÓ$UÐ^bÐitÔu×{Ñ{Õ}øÜò 	Ù(¨¨zÔ:Øð	ús   §AA6 Á6B
é   c                 ó¸  — 	 |j                   j                  «       r|j                  d«      �y|j                  dd«      | j                  kD  r!t        j                  d| j                  «       yt        | |j                  d«      «      syddlm} |j                  | t        | «      t        |«      «       y# t        $ r t        j                  dd	¬
«       Y yw xY w)z¿Requeue a deferred-mode review that a live turn cancelled.

        Only for automatic reviews on the managed local runtime; bounded attempts stop a busy box cycling
        forever.
        r1  Nr?  r   z5Preempted background review dropped after %d requeuesr�   r6  zPreempted-review requeue failedTr"  )Úcancel_requestedÚis_setr   Ú_REVIEW_REQUEUE_MAX_ATTEMPTSr…   Úinfor–   r•   r7  r;  rš   r-  r'   r†   )r¶   rE  r   r7  s       r   rG  z'AIAgent._maybe_requeue_preempted_reviewS  s³   € ð	Kà×.Ñ.×5Ñ5Ô7¸6¿:¹:ÀgÓ;NÐ;ZØØ�z‰zÐ-¨qÓ1°D×4UÑ4UÒUÜ—‘ÐSÐUY×UvÑUvÔwØÜ'¨¨f¯j©j¸Ó.DÔEØÝ5à�M‰M˜$Ô 1°$Ó 7¼¸f»ÕFøÜò 	KÜ�L‰LÐ:ÀTˆLÖJð	Kús"   ‚+B6 ®?B6 Á.B6 Â
+B6 Â6 CÃCÚbuild_memory_write_metadataÚ#apply_pending_steer_to_tool_resultsc                 ó0  — ddl m} t        | dd«      } |t        | dd«      t        | dd«      xs d|�|nt        j                  | j
                  | j                  | j                  | j                  j                  | j                  j                  dœ¬	«      S )
zaDiagnostic snapshot: ``last_activity_*`` plus the short aliases gateway and delegate readers use.r   )Úbuild_activity_snapshotÚ_last_activity_provenanceNÚ_last_activity_tsÚ_last_activity_descr   )Úcurrent_toolÚapi_call_countrÒ   Úbudget_usedÚ
budget_max)Úlast_activity_atÚlast_activity_descriptionÚlast_activity_provenanceÚextra)Úagent.session_activityr[  rF   rl   ÚUNKNOWNÚ_current_toolÚ_api_call_countrÒ   r  ÚusedÚ	max_total)r¶   r[  Ú
provenances      r   Úget_activity_summaryzAIAgent.get_activity_summaryk  sŽ   € åBä˜TÐ#>ÀÓEˆ
Ù&Ü$ TÐ+>ÀÓEÜ&-¨dÐ4IÈ4Ó&PÒ&VÐTVØ3=Ð3I¡ZÔOa×OiÑOià $× 2Ñ 2Àd×FZÑFZØ"&×"5Ñ"5Àd×F[ÑF[×F`ÑF`Ø"×3Ñ3×=Ñ=ñô		
ð 		
r�   c                 ó  ‡ — t        ‰ dd«      ryd‰ _        ‰ j                  r.	 ‰ j                  j                  |xs g «       t        ˆ fd„«       t        ‰ |«       y# t        $ r"}t
        j                  d|d¬«       Y d}~ŒAd}~ww xY w)z‡Shut down the memory provider and context engine at session end (idempotent: gateway cleanup and
        ``close()`` may both call it).Ú_memory_provider_shutdownFNTz9Memory provider on_session_end failed during shutdown: %sr"  c                  ó8   •— ‰ j                   j                  «       S r¿   )Ú_memory_managerÚshutdown_allrÁ   s   €r   r¡   z2AIAgent.shutdown_memory_provider.<locals>.<lambda>†  s   ø€ ˜T×1Ñ1×>Ñ>Ó@€ r�   )	rF   rp  rr  r    r'   r…   r9  r€   r¢   )r¶   r›   r;  s   `  r   Úshutdown_memory_providerz AIAgent.shutdown_memory_provider{  s…   ø€ ô �4Ð4°eÔ<ØØ)-ˆÔ&Ø×ÒðnØ×$Ñ$×3Ñ3°H²NÀÔCô Ó@ÔAÜ*¨4°Õ:øô ò nÜ—‘ÐZÐ\]Ðhl�×mÑmûðnús   ¤A Á	B	Á'BÂB	c                 óV   ‡ ‡— ‰ j                   rt        ˆˆ fd„«       t        ‰ ‰«       y)zrFlush end-of-session extraction on session_id rotation (/new, compression) without tearing providers
        down.c                  óB   •— ‰j                   j                  ‰ xs g «      S r¿   )rr  r    )r›   r¶   s   €€r   r¡   z/AIAgent.commit_memory_session.<locals>.<lambda>�  s   ø€ ˜T×1Ñ1×@Ñ@ÀÂÈRÓP€ r�   N)rr  r€   r¢   )r¶   r›   s   ``r   Úcommit_memory_sessionzAIAgent.commit_memory_session‰  s!   ù€ ð ×ÒÜÔPÔQÜ*¨4°Õ:r�   )r›   Úoriginal_user_messageÚfinal_responseÚinterruptedc                óŽ  — |s| j                   r|r|syt        |d¬«      }t        |d¬«      }|r|sy	 d| j                  xs di|�d|ini ¥}t        | dd«      }|�||d<    | j                   j                  ||fi |¤Ž t        |«      s,| j                   j                  || j                  xs d¬	«       yy# t        $ r Y yw xY w)
u  Mirror a completed turn into external memory providers (``sync_all`` + ``queue_prefetch_all``).

        Uses ``original_user_message`` (``user_message`` may carry injected skill content). Interrupted turns
        are skipped: partial output is not durable truth. Best-effort â€” an offline backend never blocks.

        A partial assistant output, an aborted tool chain, or a mid-stream reset is not durable
        conversational truth â€” mirroring it into an external memory backend pollutes future recall with
        state the user never saw completed. The prefetch is gated on the same flag: the user's next message
        is almost certainly a retry of the same intent, and a prefetch keyed on the interrupted turn would
        fire against stale context. See #15218.
        Nú
)Úsepr˜   r   r›   re  Úturn_author)r˜   )rr  rs   r˜   rF   Úsync_allrZ   Úqueue_prefetch_allr'   )	r¶   rx  ry  rz  r›   Ú	user_textÚresponse_textÚsync_kwargsr~  s	            r   Ú_sync_external_memory_for_turnz&AIAgent._sync_external_memory_for_turn�  sá   € ñ ˜t×3Ò3¹ÑK`Øä3Ð4IÈtÔTˆ	Ü7¸ÈDÔQˆÙ™mØð	Ø'¨¯©Ò)>¸BÐ{Ð]eÐ]qÀJÐPXÑCYÐwyÐ{ˆKä! $¨¸Ó=ˆKØÐ&Ø-8�˜MÑ*Ø)ˆD× Ñ ×)Ñ)¨)°]ÑRÀkÒRä$ YÔ/Ø×$Ñ$×7Ñ7¸	ÈdÏoÉoÒNcÐacÐ7Õdð 0øäò 	Ùð	ús   ´BB8 Â8	CÃCc                 ó¨   ‡ — ‰ j                  d¬«       t        ‰ j                  ˆ fd„«       ‰ j                  d«       t        ‰ j                  «       y)a  Release LLM clients and child agents WITHOUT tearing down session tool state (gateway cache
        eviction: the session may resume on the same task_id, so processes, sandbox, browser, computer-use and
        memory provider are kept). Idempotent; distinct from ``close()``.T©Úsoftc                 ó*   •— ‰j                  | d¬«      S )NÚcache_evict©Úreason)Ú_retire_shared_openai_client©Úcr¶   s    €r   r¡   z)AIAgent.release_clients.<locals>.<lambda>¸  s   ø€ °T×5VÑ5VÐWXÐanÐ5VÓ5o€ r�   r‰  N)Ú_close_active_childrenr€   Ú_drop_shared_clientÚ_close_request_clientsÚ_close_codex_sessionrÁ   s   `r   Úrelease_clientszAIAgent.release_clients±  sG   ø€ ð 	×#Ñ#¨Ð#Ô.ô 	�×)Ñ)Ó+oÔpØ×#Ñ# MÔ2ô 	�×*Ñ*Õ+r�   c                 óÐ  ‡ — t        ‰ dd«      }t        ‰ j                  t        |t        «      r|nd«       ‰ j                  t        ‰ dd«      xs d«       ‰ j                  d¬«       t        ‰ j                  ˆ fd„«       ‰ j                  d«       t        ‰ j                  «       g ‰ _
        d‰ _        g ‰ _        t        ‰ j                  «       t        ‰ j                  «       y)	zyRelease every resource this agent holds (idempotent); each phase is guarded so one failure never
        blocks the rest.Ú_session_messagesNr˜   r   Fr†  c                 ó,   •— ‰j                  | dd¬«      S )NÚagent_closeT)r‹  Úshared)Ú_close_openai_clientr�  s    €r   r¡   zAIAgent.close.<locals>.<lambda>Ç  s   ø€ °T×5NÑ5NÈqÐYfÐosÐ5NÓ5t€ r�   r—  )rF   r€   rt  r‹   rƒ  Ú_close_task_resourcesr�  r�  r‘  r’  r•  Ú_db_flush_scan_prefixÚ_streamed_assistant_text_partsÚ_trim_process_memoryÚ_finalize_owned_session_row)r¶   Úsession_messagess   ` r   ÚclosezAIAgent.close¾  sÄ   ø€ ô
 # 4Ð)<¸dÓCÐÜ�×.Ñ.ÄJÐO_ÔaeÔDfÑ0@ÐlpÔqØ×"Ñ"¤7¨4°¸tÓ#DÒ#JÈÔKØ×#Ñ#¨Ð#Ô/Ü�×)Ñ)Ó+tÔuØ×#Ñ# MÔ2Ü�×*Ñ*Ô+ð "$ˆÔØ%)ˆÔ"Ø.0ˆÔ+Ü�×*Ñ*Ô+Ü�×1Ñ1Õ2r�   r‡  c                ó6  ‡— 	 | j                   5  t        | j                  «      }| j                  j                  «        ddd«       D ]$  Š|r	 ‰j                  «        Œt        ˆfd„«       Œ& y# 1 sw Y   Œ3xY w# t        $ r Y yw xY w# t        $ r Y Œ7w xY w)zgDetach and close per-turn child agents; ``soft`` releases their clients first, falling back to close().Nc                  ó$   •— ‰ j                  «       S r¿   )r   )Úchilds   €r   r¡   z0AIAgent._close_active_children.<locals>.<lambda>ä  s   ø€ ˜UŸ[™[›]€ r�   )Ú_active_children_lockrƒ  Ú_active_childrenÚclearr'   r“  r€   )r¶   r‡  Úchildrenr£  s      @r   r�  zAIAgent._close_active_childrenÕ  s¡   ø€ ð	Ø×+Ñ+ñ .Ü × 5Ñ 5Ó6�Ø×%Ñ%×+Ñ+Ô-÷.ð
 ò 	,ˆEÙðØ×)Ñ)Ô+Øô Ó*Õ+ñ	,÷.ð .ûô ò 	Ùð	ûô !ò Ùðús9   ƒA= �0A1¿A= ÁBÁ1A:Á6A= Á=	B	ÂB	Â	BÂBÚclose_fnc                 óB   — t        | dd«      }|� ||«       d| _        yy)zLHand the shared OpenAI/httpx client to ``close_fn`` and clear the attribute.ÚclientN)rF   rª  )r¶   r¨  rª  s      r   r�  zAIAgent._drop_shared_clientæ  s,   € ô ˜˜x¨Ó.ˆØÐÙ�VÔØˆD�Kð r�   r‹  c                 ó`   — t        | j                  |¬«       t        | j                  |¬«       y)zNDrop the cached per-request wire clients (reused across sequential LLM calls).rŠ  N)r€   Ú#_close_cached_request_openai_clientÚ&_close_cached_request_anthropic_client)r¶   r‹  s     r   r‘  zAIAgent._close_request_clientsò  s"   € ä�×9Ñ9À&ÕIÜ�×<Ñ<ÀVÖLr�   c                 óR   — t        | dd«      }|�d| _        |j                  «        yy)z«Close the Codex app-server session (else the child keeps running); the attribute is cleared BEFORE
        close() so a concurrent reader can't grab a half-closed session.Ú_codex_sessionN)rF   r¯  r   )r¶   Úcodex_sessions     r   r’  zAIAgent._close_codex_session÷  s2   € ô   Ð&6¸Ó=ˆØÐ$Ø"&ˆDÔØ×ÑÕ!ð %r�   c                  ó$   — ddl m}   | dd¬«       y)zAReturn freed heap pages to the OS on glibc; safe no-op elsewhere.r   ©Útrim_memoryTzagent close)Úforcer‹  N)Úhermes_cli.mem_trimr³  r²  s    r   r�  zAIAgent._trim_process_memoryÿ  s   € õ 	4Ù˜$ }Ö5r�   c                 óÈ   ‡‡— t        | dd«      Št        | dd«      Št        | dd«      r‰r‰rt        ˆˆfd„«       t        | dd«      r‰�d| _        d	d
lm}  |‰«       yyy)u‰  End the session row unless ownership was handed forward (compression helpers, review forks sharing
        the parent's id; end_session() is first-reason-wins), then release the SQLite handle ONLY when this
        agent owns it â€” a dedicated handle left open pins its fds and token-writer thread for the process
        lifetime. The owner flag is cleared first so close() stays idempotent.r$  Nr˜   Ú_end_session_on_closeTc                  ó(   •— ‰ j                  ‰d«      S )Nr—  )Úend_session)r  r˜   s   €€r   r¡   z5AIAgent._finalize_owned_session_row.<locals>.<lambda>  s   ø€ ˜Z×3Ñ3°JÀÓN€ r�   r&  Fr   )Úrelease_or_close)rF   r€   r&  r%  rº  )r¶   rº  r  r˜   s     @@r   rž  z#AIAgent._finalize_owned_session_row  sk   ù€ ô
 ˜T =°$Ó7ˆ
Ü˜T <°Ó6ˆ
Ü�4Ð0°$Ô7¹JÉ:ÜÔNÔOÜ�4Ð+¨UÔ3¸
Ð8NØ$)ˆDÔ!õ ?Ù˜ZÕ(ð 9OÐ3r�   Úhistoryc                 óÆ  — | j                  |«      }|�¬|\  }}	 t        dt        |xs d«      «      }|t        | j
                  j                  «       j                  dd«      xs d«      kD  rS| j
                  j                  ||¬«       | j                  s*| j                  | j                  › dt        |«      › d�«       t        d«       y# t        t        f$ r d}Y Œ¬w xY w)	u  Replay the most recent todo tool response (the gateway builds a fresh AIAgent per message). Only
        results paired with an earlier assistant ``todo`` call count â€” a forged bare ``role: tool`` message
        must not seed the store (GHSA-5g4g-6jrg-mw3g).Nr   r¤   Úrevision)r½  u   ðŸ“‹ Restored z todo item(s) from historyF)Ú_latest_todo_responserÌ  rŒ   r  r“  Ú_todo_storeÚsnapshotr   ÚrestorerØ   Ú_vprintrÜ   r¦   Ú_set_interrupt)r¶   r»  ÚfoundÚlast_todo_responseÚlast_todo_revisionÚhistory_revisions         r   Ú_hydrate_todo_storezAIAgent._hydrate_todo_store  sá   € ð ×*Ñ*¨7Ó3ˆØÐØ5:Ñ2ÐÐ 2ð%Ü#& q¬#Ð.@Ò.EÀAÓ*FÓ#GÐ ð  ¤# d×&6Ñ&6×&?Ñ&?Ó&A×&EÑ&EÀjÐRSÓ&TÒ&YÐXYÓ"ZÒZØ× Ñ ×(Ñ(Ð);ÐFVÐ(ÔWØ—’Ø—L‘L D§O¡OÐ#4°NÄ3ÐGYÓCZÐB[Ð[uÐ!vÔwÜ�uÕøô œzÐ*ò %Ø#$Ò ð%ús   šC ÃC ÃC c                 ó8  — ddl m} t        t        |«      dz
  dd«      D ]Ù  }||   }|j	                  dd«      }|j	                  d«      dk7  s"t        |t        «      r| j                  ||«      sŒQt        |«      |kD  r/t        j                  d	| j                  xs d
t        |«      «       ŒŽd|vrŒ“	 t        j                  |«      }d|v sŒ®t        |d   t        «      sŒÂ|d   |j	                  dd«      fc S  y# t        j                  t        f$ r Y Œøw xY w)ua   Walk history backwards for the newest paired, size-bounded todo result â†’ ``(todos, revision)``.r   )ÚMAX_TODO_RESULT_CHARSr¤   rò  r	  r   r€  r   zKSkipping oversized todo tool response during hydration: session=%s chars=%drY  z"todos"Útodosr½  N)Útools.todo_toolrÊ  Úranger¦   r   r‹   r(   Ú _tool_response_matches_todo_callr…   r9  r˜   rH   Úloadsr•  r  rƒ  )r¶   r»  rÊ  Úidxrˆ  r	  Údatas          r   r¾  zAIAgent._latest_todo_response(  s  € å9äœ˜W›¨Ñ)¨2¨rÓ2ò 	>ˆCØ˜#‘,ˆCØ—g‘g˜i¨Ó,ˆGØ�w‰w�v‹ &Ò(´
¸7ÄCÔ0HÐPT×PuÑPuÐv}ð  @Cô  QDØÜ�7‹|Ð3Ò3Ü—‘ð  5Ø6:·o±oÒ6OÈÔQTÐU\ÓQ]ô_àØ Ñ'ØðÜ—z‘z 'Ó*�ð ˜$Š¤:¨d°7©m¼TÕ#BØ˜G‘} d§h¡h¨z¸1Ó&=Ð=Ò=ð!	>ð" øô	 ×(Ñ(¬)Ð4ò Ùðús   Â4C=Ã=DÄDÚ
tool_indexc                 óê   — d|cxk  rt        |«      k  rn n||   j                  d«      nd}|syt        |d| «      D ]2  }|j                  d«      }|dk(  r| j                  ||«      c S |dv sŒ2 y y)uº   True when the nearest prior assistant message issued a ``todo`` call with this ``tool_call_id``; a
        ``user``/``system`` boundary or missing id means unpaired â†’ must not hydrate.r   Útool_call_idNFr€  r�  >   ÚuserÚsystem)r¦   r   ÚreversedÚ_assistant_has_todo_tool_call)Úclsr»  rÒ  rÔ  Úpriorr€  s         r   rÎ  z(AIAgent._tool_response_matches_todo_call?  sŒ   € ð CDÀzÔB`ÔTWÐX_ÓT`ÕB`�w˜zÑ*×.Ñ.¨~Ô>ÐfjˆÙØÜ˜g k zÐ2Ó3ò 	ˆEØ—9‘9˜VÓ$ˆDØ�{Ò"Ø×8Ñ8¸ÀÓMÒMØÐ)Ò)Ùð	ð r�   Úassistant_msgrÔ  c                 óv   ‡ ‡— |j                  d«      }t        |t        «      xr t        ˆ ˆfd„|D «       «      S )zDTrue when the assistant message issued a ``todo`` call with this id.r#  c              3   ór   •K  — | ].  }‰j                  |«      ‰k(  xr ‰j                  |«      d k(  –— Œ0 y­w)ÚtodoN)Ú_get_tool_call_id_staticÚ_get_tool_call_name_static)r�  ÚtcrÙ  rÔ  s     €€r   r’  z8AIAgent._assistant_has_todo_tool_call.<locals>.<genexpr>R  sC   øè ø€ ò 4
àð ×(Ñ(¨Ó,°Ñ<ÒmÀ×A_ÑA_Ð`bÓAcÐgmÑAmÓmñ4
ùs   ƒ47)r   r‹   rƒ  r–  )rÙ  rÛ  rÔ  r#  s   ` ` r   rØ  z%AIAgent._assistant_has_todo_tool_callN  s=   ù€ ð #×&Ñ& |Ó4ˆ
Ü˜*¤dÓ+ò 
´ô 4
à ô4
ó 1
ð 	
r�   c                 ó   — | j                   S )z)Check if an interrupt has been requested.)Ú_interrupt_requestedrÁ   s    r   Úis_interruptedzAIAgent.is_interruptedW  s   € ð ×(Ñ(Ð(r�   zagent.system_promptÚbuild_system_promptc                 óÌ   — t        | t        «      r9| j                  d«      }t        |t        «      r|j                  dd«      xs dS dS t        t        | dd«      dd«      xs dS )zhFunction name of a tool_call entry (dict or object); Gemini requires it on every ``role: tool`` message.ÚfunctionrK  r   N)r‹   r-  r   rF   )rá  r|   s     r   rà  z"AIAgent._get_tool_call_name_statica  s]   € ô �bœ$ÔØ—‘˜
Ó#ˆBÜ1;¸BÄÔ1E�B—F‘F˜6 2Ó&Ò,¨"ÐMÈ2ÐMÜ”w˜r :¨tÓ4°f¸bÓAÒGÀRÐGr�   >   r   rÕ  rÖ  rç  r�  Ú	developerÚsanitize_api_messages)Údrop_codex_reasoning_itemsrˆ  rê  c                óT  — t        | t        «      r%| j                  d«      dk7  s| j                  d«      ry| j                  d«      ryt        j	                  | j                  d«      «      rydd	lm}  || j                  d
«      «      ry| j                  d«      xs | j                  d«      }| j                  d«      }t        |t        «      r|j                  «       st        |t        «      r|ry| j                  d
«      }|r"t        |t        «      rt        d„ |D «       «      S y)a0  True if ``msg`` is an assistant turn whose only payload is reasoning (no text, no tool_calls).

        Providers converting reasoning to thinking blocks reject it (400 "final block cannot be thinking"), so
        the turn is dropped from the API copy; the transcript keeps the reasoning block.
        r€  r�  r#  FÚ_thinking_prefillTr	  r   )Úhas_compaction_checkpointr‚  Úreasoning_contentÚ	reasoningÚreasoning_detailsc              3   óh   K  — | ]*  }t        |t        «      xr |j                  d «      dk(  –— Œ, y­w)r²   rï  Nr!  )r�  Úitems     r   r’  z6AIAgent._is_thinking_only_assistant.<locals>.<genexpr>�  s.   è ø€ ÒjÐVZ”z $¬Ó-ÒQ°$·(±(¸6Ó2BÀkÑ2QÓQÑjùr"  )r‹   r-  r   r/   Ú_content_has_real_payloadÚagent.native_compactionrí  r(   r   rƒ  r–  )rˆ  rê  rí  rï  ÚrdÚcodex_itemss         r   Ú_is_thinking_only_assistantz#AIAgent._is_thinking_only_assistantl  sô   € ô ˜#œtÔ$¨¯©°«¸;Ò(FÈ#Ï'É'ÐR^ÔJ_Øð �7‰7Ð&Ô'ØÜ×,Ñ,¨S¯W©W°YÓ-?Ô@Øõ 	Fá$ S§W¡WÐ-DÓ%EÔFØØ—G‘GÐ/Ó0ÒH°C·G±G¸KÓ4Hˆ	Ø�W‰WÐ(Ó)ˆÜ�y¤#Ô&¨9¯?©?Ô+<Ä*ÈRÔQUÔBVÑ[]Øð —g‘gÐ5Ó6ˆÙ%¬*°[Ä$Ô*GÜÑjÐ^iÔjÓjÐjØr�   c                 óh  — t        | t        «      rt        | j                  «       «      S t        | t        «      ro| D ]i  }t        |t
        «      s|r yŒ|j                  d«      }|dk(  r6|j                  dd«      }t        |t        «      sŒQ|j                  «       sŒb y|dvsŒi y y| duxr | dk7  S )z`True when assistant ``content`` carries anything beyond (redacted) thinking blocks / whitespace.Tr²   Útextr   >   ÚthinkingÚredacted_thinkingFN)r‹   r(   r�   r   rƒ  r-  r   )r	  ÚblockÚbtyperù  s       r   ró  z!AIAgent._content_has_real_payload�  sª   € ô �gœsÔ#Ü˜Ÿ™›Ó(Ð(Ü�gœtÔ$Ø ò  �Ü! %¬Ô.ÙÙ#ØØŸ	™	 &Ó)�Ø˜F’?Ø Ÿ9™9 V¨RÓ0�DÜ! $¬Õ,°·±µÙ#ØÐ"CÒCÙð ð Ø˜dÐ"Ò4 w°"¡}Ð4r�   Ú"drop_thinking_only_and_merge_usersr#  c                 ó  — ddl m}  |«       }t        d„ | D «       «      }||k  r| S dg }}| D ]7  }|j                  j                  dk(  r||k\  rŒ"|dz  }|j                  |«       Œ9 t        j                  d||z
  |«       |S )z›Cap delegate_task calls in one turn at max_concurrent_children (non-delegate calls all kept);
        returns the original list when nothing was truncated.r   )Ú_get_max_concurrent_childrenc              3   óT   K  — | ]   }|j                   j                  d k(  sŒd–— Œ" y­w)Údelegate_taskr¤   N)rç  rK  )r�  rá  s     r   r’  z3AIAgent._cap_delegate_task_calls.<locals>.<genexpr>­  s!   è ø€ Ò[ 2°r·{±{×7GÑ7GÈ?Ó7ZœQÑ[ùs   ‚(¡(r  r¤   zUTruncated %d excess delegate_task call(s) to enforce max_concurrent_children=%d limit)Útools.delegate_toolr   Úsumrç  rK  Úappendr…   r9  )r#  r   Úmax_childrenÚdelegate_countÚkept_delegatesÚ	truncatedrá  s          r   Ú_cap_delegate_task_callsz AIAgent._cap_delegate_task_calls§  s    € õ 	EÙ3Ó5ˆÜÑ[¨Ô[Ó[ˆØ˜\Ò)ØÐØ$% r˜	ˆØò 	!ˆBØ�{‰{×Ñ ?Ò2Ø! \Ò1ØØ !Ñ#�Ø×Ñ˜RÕ ð	!ô 	�‰ð :Ø;IÈLÑ;XÐZfô	hàÐr�   c                 óÞ  — t        «       g }}| D ]­  }|j                  j                  }	 t        j                  t        j
                  |«      dd¬«      }|j                  j                  |f}||v r+t        j                  d|j                  j                  «       ŒŒ|j                  |«       |j                  |«       Œ¯ t        |«      t        | «      k  r|S | S # t        t        f$ r Y Œ—w xY w)zÓDrop duplicate (tool_name, arguments) pairs in one turn (first wins). Valid JSON arguments are
        canonicalized so key order/whitespace can't evade dedup; returns the original list when nothing was removed.)ú,ú:T)Ú
separatorsÚ	sort_keyszRemoved duplicate tool call: %s)Úsetrç  Ú	argumentsrH   rI   rÏ  r  r“  rK  r…   r9  Úaddr  r¦   )r#  ÚseenÚuniquerá  r  r¦  s         r   Ú_deduplicate_tool_callszAIAgent._deduplicate_tool_calls»  sÓ   € ô “u˜bˆfˆØò 	ˆBØŸ™×-Ñ-ˆIðÜ ŸJ™J¤t§z¡z°)Ó'<ÈÐ_cÔd�	ð —;‘;×#Ñ# YÐ/ˆCØ�d‰{Ü—‘Ð@À"Ç+Á+×BRÑBRÔSØØ�H‰H�SŒMØ�M‰M˜"Õð	ô ˜V›¤s¨:£Ò6ˆvÐF¸JÐFøô œzÐ*ò Ùðús   ©+CÃC,Ã+C,Úrepair_tool_callÚinvalidate_system_promptÚinterruptible_api_callÚ interruptible_streaming_api_callÚtry_activate_fallbackc                 óR   — t        | dd«      t        t        | dd«      xs g «      k  S )uÑ   Whether a fallback provider remains (mirrors ``try_activate_fallback``'s guard) â€” gates the
        "trying fallback..." status so we never announce one that won't be attempted.

        See #17446.
        Ú_fallback_indexr   Ú_fallback_chainN)rF   r¦   rÁ   s    r   Ú_has_pending_fallbackzAIAgent._has_pending_fallbackß  s/   € ô �tÐ.°Ó2´S¼ÀÐGXÐZ^Ó9_Ò9eÐceÓ5fÑfÐfr�   Úrestore_primary_runtimeÚtry_recover_primary_transportÚbuild_api_kwargsÚdecisionc                 óF   — |j                   r| j                  €|| _        yyy)z?Record the first guardrail decision that should stop this turn.N)Úshould_haltÚ_tool_guardrail_halt_decision©r¶   r"  s     r   Ú_set_tool_guardrail_haltz AIAgent._set_tool_guardrail_haltë  s'   € à×Ò D×$FÑ$FÐ$NØ19ˆDÕ.ð %OÐr�   c                 óD   — d|j                   xs d› d|j                  › d�S )Nz*I stopped retrying because I kept running zthe same toolú z¥ times without making progress. The last result above shows what blocked it. Tell me how you'd like to proceed, or send `continue` and I'll try a different approach.)Ú	tool_nameÚcountr&  s     r   Ú#_toolguard_controlled_halt_responsez+AIAgent._toolguard_controlled_halt_responseð  s3   € ð 9¸×9KÑ9KÒ9^ÈÐ8_Ð_`Ø�~‰~Ðð "ð"ð	
r�   )rÔ  r*  Úfunction_argsÚfunction_resultÚfailedc                ó”  — | j                   j                  ||||¬«      }d x}}| j                  «       rK	 | j                   j                  ||t	        |t
        «      r|nd ||¬«      }	|	j                  |	j                  }}|rt	        |t
        «      r|}|j                  dv rt        ||«      }|j                  r| j                  |«       nC| j                   j                  }|�+|j                   dv rt        ||«      }| j                  |«       |r|xs ddz   |z   }|S # t        $ r }
t        j                  d|
«       Y d }
~
ŒÃd }
~
ww xY w)N)r/  )rÔ  r/  z1stall-guard identical-call observation failed: %s>   Úhaltr  )Úidentical_call_streak_haltÚidentical_cycle_haltr   z

)Ú_tool_guardrailsÚ
after_callÚ_stall_guards_enabledÚobserve_callr‹   r(   ÚnoticeÚstubr'   r…   r†   Úactionru   r$  r'  Úhalt_decisionr¬   )r¶   r*  r-  r.  r/  rÔ  r"  Ústall_noticeÚresult_stubÚobservationr‡   Ústreak_halts               r   Ú_append_guardrail_observationz%AIAgent._append_guardrail_observationù  sT  € à×(Ñ(×3Ñ3°I¸}ÈoÐflÐ3Ómˆð &*Ð)ˆ�{Ø×%Ñ%Ô'ðWØ"×3Ñ3×@Ñ@Ø˜}ÄÈOÔ]`ÔAa©oÐgkØ!-°fð Aó �ð -8×,>Ñ,>À×@PÑ@P˜k�ñ
 œ: o´sÔ;Ø)ˆOØ�?‰?Ð.Ñ.Ü7¸ÈÓRˆOØ×ÒØ×)Ñ)¨(Õ3ð ×/Ñ/×=Ñ=ˆKØÐ&¨;×+;Ñ+;Ð?uÑ+uÜ";¸OÈ[Ó"Y�Ø×-Ñ-¨kÔ:ÙØ.Ò4°"¸Ñ>ÀÑMˆOØÐøô% ò WÜ—‘ÐPÐRU×VÑVûðWús   µA
D Ä	EÄ'EÅEc                 ó.   — t        t        | dd«      «      S )zCConfig gate for the runtime anti-stall guards (agent.stall_guards).Ú_stall_guardsTrs  rÁ   s    r   r6  zAIAgent._stall_guards_enabled  s   € ä”G˜D /°4Ó8Ó9Ð9r�   c                 ó:   — | j                  |«       t        |«      S r¿   )r'  rv   r&  s     r   Ú_guardrail_block_resultzAIAgent._guardrail_block_result  s   € Ø×%Ñ% hÔ/Ü)¨(Ó3Ð3r�   Úeffective_task_idr`  c                 óF  — |j                   }||||f}d| _        	 t        t        | «      «      5  t	        |«      dk  r | j
                  |Ž  n‰ddlm} t        |«      }|�!|j                  rt        |j                  «      nd}	 |||	¬«      }
t	        |
«      dk(  r)|
d   d   dk(  r| j                  n| j
                  } ||Ž  nddlm}  || g|¢­d	|
iŽ ddd«       d
| _        t        | dd
«      rd
| _        ddlm}  |d¬«       yy# 1 sw Y   Œ5xY w# d
| _        w xY w)a  Execute the assistant's tool calls and append results to ``messages``.

        The segment planner splits the batch into runs of parallel-safe calls (read-only, non-overlapping file
        targets, opted-in MCP) separated by sequential barriers, run in emission order.
        Tr¤   r   )Ú_plan_tool_batch_segmentsN)Úexecution_cwdÚparallel)Úexecute_tool_calls_segmentedÚsegmentsFÚ_trim_after_tool_batchr²  zlarge tool resultrŠ  )r#  Ú_executing_toolsrY   rX   r¦   Ú_execute_tool_calls_sequentialÚagent.tool_dispatch_helpersrG  rU   r  r	   Ú_execute_tool_calls_concurrentÚagent.tool_executorrJ  rF   rL  rµ  r³  )r¶   r$  r›   rE  r`  r#  r~   rG  Ú
active_envÚexec_cwdrK  ÚrunrJ  r³  s                 r   Ú_execute_tool_callszAIAgent._execute_tool_calls"  s:  € ð '×1Ñ1ˆ
Ø! 8Ð->ÀÐOˆØ $ˆÔð	*Ü*Ô+CÀDÓ+IÓJñ UÜ�z“? aÒ'Ø7�D×7Ñ7¸Ò>åUÜ!/Ð0AÓ!B�JØ7AÐ7MÐR\×R`ÒR`œt J§N¡NÔ3Ðfj�HÙ8¸ÐS[Ô\�HÜ˜8“}¨Ò)ØEMÈaÁ[ÐQRÁ^ÐWaÒEa˜d×AÒAÐgk÷  hKñ  hK˜Ù˜Tš
åTÙ4°TÐT¸DÒTÈ8ÒT÷Uð %*ˆDÔ!ä�4Ð1°5Ô9ð
 +0ˆDÔ'Ý7ÙÐ2Ö3ð :÷#Uð Uûð %*ˆDÕ!ús#   ›D ¯B(DÃD ÄDÄD Ä	D c                 óp  — ddl m}m}  ||j                  d«      |j                  d«       ||j                  d«      «      |j                  d«      |j                  d«      t	        | dd«      dkD   |j                  d	«      |j                  d
«      |j                  d«      |j                  d«      | ¬«      S )zaSingle call site for delegate_task dispatch; new DELEGATE_TASK_SCHEMA fields are added only here.r   )Ú_strip_model_hidden_task_fieldsr  ÚgoalÚcontextÚtasksrÒ   r€  r3  Úimagesr:  Úsubagent_idr¯   )rX  rY  rZ  rÒ   r€  Ú
backgroundr[  r:  r\  r¯   Úparent_agent)r  rW  r  r   rF   )r¶   r-  rW  Ú_delegate_tasks       r   Ú_dispatch_delegate_taskzAIAgent._dispatch_delegate_taskF  s¯   € çhñ Ø×"Ñ" 6Ó*°M×4EÑ4EÀiÓ4PÙ1°-×2CÑ2CÀGÓ2LÓMØ(×,Ñ,Ð-=Ó>À]×EVÑEVÐW]ÓE^Ü# DÐ*;¸QÓ?À!ÑCÐDÈ]×M^ÑM^Ð_gÓMhØ ×$Ñ$ XÓ.Ø%×)Ñ)¨-Ó8À-×BSÑBSÐT]ÓB^Ðmqô
ð 	
r�   Úinvoke_toolÚlabelrù  Úindentc           	      ól  — ddl }ddl}t        d|j                  d«      j                  t        |«      z
  «      }g }|j                  d«      D ]K  }t        |«      |k  r|j                  |«       Œ#|j                  |j                  ||dd¬«      xs |g«       ŒM |› | › �d|z   j                  |«      z   S )	zyWord-wrap verbose tool output to the terminal width (each existing line separately), continuation
        lines indented.r   Né(   )éx   é   r|  TF)ÚwidthÚbreak_long_wordsÚbreak_on_hyphens)ÚshutilÚtextwraprÌ  Úget_terminal_sizeÚcolumnsr¦   Úsplitr  ÚextendÚwrapÚjoin)rb  rù  rc  rk  rl  Ú
wrap_widthÚ	out_linesÚraw_lines           r   Ú_wrap_verbosezAIAgent._wrap_verboseW  sÃ   € ÷ 	 Ü˜˜V×5Ñ5°iÓ@×HÑHÌ3ÈvË;ÑVÓWˆ
Ø!ˆ	ØŸ
™
 4Ó(ò 	IˆHÜ�8‹} 
Ò*Ø× Ñ  Õ*à× Ñ  §¡¨x¸zÐ\`Ðsx Ó!yò  "Hð  Gð  ~Hõ  Ið		Ið
 �˜%˜Ð! T¨F¡]×$8Ñ$8¸Ó$CÑCÐCr�   zagent.tool_executorÚexecute_tool_calls_concurrentÚexecute_tool_calls_sequentialÚhandle_max_iterationsc                 ó  — t        | dd«      }|rt        |«      S t        | dd«      }|syt        | dd«      xs |}t        | dd«      }|€|S 	 |j                  |«      xs |S # t        $ r t        j                  dd¬«       |cY S w xY w)	zÁSession-lineage ROOT id for Portal usage attribution, so one conversation keeps a single
        ``conversation=`` tag across compression rotation; subagents resolve via ``_parent_session_id``.Ú_cached_conversation_rootNr˜   r8  r$  z%Conversation root lineage walk failedTr"  )rF   r(   Úget_conversation_rootr'   r…   r†   )r¶   ÚcachedÚsidrP  Údbs        r   Ú_conversation_root_idzAIAgent._conversation_root_idi  s¢   € ô ˜Ð:¸DÓAˆÙÜ�v“;ÐÜ�d˜L¨$Ó/ˆÙØô ˜Ð2°DÓ9Ò@¸SˆÜ�T˜=¨$Ó/ˆØˆ:ØˆLð	Ø×+Ñ+¨EÓ2Ò;°eÐ;øÜò 	Ü�L‰LÐ@È4ˆLÔPØŠLð	ús   ÁA# Á#"BÂBrL  )NNFr¿   )FFNF)FFNNr   F)r   )z     )“r¸   r¹   rº   r»   Ú&_TOOL_CALL_ARGUMENTS_CORRUPTION_MARKERÚpropertyr(   rÂ   ÚsetterÚsysÚmaxsizerƒ  rŒ   r¿  r   r�   r   Úcallabler   r-  r   r   r´   r'  r/  r<  rM  rh  Ústaticmethodrp  rt  r}  Ú_forwardr~  r‰  Ú_forward_staticÚ_stream_diag_initÚ_stream_diag_capture_responseÚ_flatten_exception_chainÚBaseExceptionr—  Ú_log_stream_retryÚ_emit_stream_dropr¢  r§  Ú$_check_compression_model_feasibilityÚ_replay_compression_warningr¬  r®  r±  r¶  rº  ÚtuplerÃ  rÖ  rÍ  rß  râ  ræ  rë  rí  Ú_anthropic_prompt_cache_policyrï  rõ  r   r  r  r  r  r  r  r&  Ú"_looks_like_codex_intermediate_ackÚ_extract_reasoningÚ_cleanup_task_resourcesr9  r*  r+  r,  Ú$_summarize_background_review_actionsr>  r<  rV  rG  Ú_build_memory_write_metadataÚ$_apply_pending_steer_to_tool_resultsrn  rt  rw  r„  r“  r   r�  r�  r‘  r’  r�  rž  rÈ  r¾  ÚclassmethodrÎ  rØ  rä  Ú_build_system_promptÚ_sanitize_coalesce_tool_call_idrß  rà  Ú	frozensetÚ_VALID_API_ROLESÚ_sanitize_api_messagesr÷  ró  Ú#_drop_thinking_only_and_merge_usersr
  r  Ú _sanitize_uniquify_tool_call_idsÚ_uniquify_tool_call_idsÚ_repair_tool_callÚ_invalidate_system_promptÚ_codex_deterministic_call_idÚ_deterministic_call_idÚ_codex_split_responses_tool_idrr   Ú(_codex_derive_responses_function_call_idrq   Ú_interruptible_api_callÚ!_interruptible_streaming_api_callÚ_try_activate_fallbackr  Ú_restore_primary_runtimeÚ_try_recover_primary_transportÚ_build_api_kwargsrt   r'  r,  r@  r6  rD  rU  r`  Ú_invoke_toolrv  rP  rN  Ú_handle_max_iterationsr€  r8  r�   r   r/   r/   æ   s:  „ ñ
 3ð	Oð +ð
 ð˜#ò ó ðð ‡_�_ð;˜cð ; dò ;ó ð;ð ¨TÀ4ÐY]Ø¸dÐSWÐrvØØ!Ÿk™kØ Ø&*È4Ø"'ÀÐ[`Ø"'ÈØ #°rØ'+ÈDÐosØ!ÀuÐnrØ7;ØØ+/ÐQUØ+/ÈtØ'+È$Ø+/ÐSWØ+/ÐX\Ø(,ÈÐhlØ*.ÐW[Ø&*ÈØ$(ÈDØ@DØ=AØÀ4Ð]aØ,0Ð[_Ø¨TÀdÐ]aØ¨dÀTÐ\`Ø#'Ø#(ÀUØ!À%Ø°$Ø.2ÐZ^Ø)-¸tØ$)È2Ø,/ÐTVØ %ÀØ/3ÀtØ ñQ0(àð0(à'*ð0(à=@ð0(àSVð0(ð ð0(ð ,0°©9°tÑ+;ð0(ð NQð0(ð `dÐdgÑ_hÐkoÑ_oð0(ð ð	0(ð
 ð0(ð ð0(ð ˜s™)ð0(ð @DÀC¹yð0(ð  ð0(ð ;?ð0(ð UYð0(ð  ð0(ð CFð0(ð ð0(ð 25ð0(ð   ™9ð0(ð AEÀSÁ	ð0(ð dhÐhkÑclð0(ð ð0(ð AEð0(ð ilð0(ð &.¨e¡_ð0(ð ð0(ð !)ð0(ð GOð0(ð  !)ð!0(ð  EMð!0(ð" %ð#0(ð" @Hð#0(ð$ !)ð%0(ð$ IQð%0(ð& !)ð'0(ð& NVð'0(ð( &ð)0(ð( >Fð)0(ð( ^fð)0(ð*  (ð+0(ð* MUð+0(ð, $ð-0(ð, >Fð-0(ð. "ð/0(ð. BJð/0(ð0 ! ¨3°¨+°tÐ*;Ñ!<Ñ=ð10(ð2 $ H¨c¨U°D¨[Ñ$9Ñ:ð30(ð4 ð50(ð4 37°s¸C°x±.ð50(ð4 X[ð50(ð6    S ™>ð70(ð6 EIÈÈcÐSVÈhÉÑDXð70(ð8 ð90(ð8 (+ð90(ð8 ADð90(ð8 X[ð90(ð: ð;0(ð: ),ð;0(ð: @Cð;0(ð: WZð;0(ð< !ð=0(ð> !ð?0(ð> ?Cð?0(ð@ ðA0(ð@ <@ðA0(ðB -0ðC0(ðD ,ðE0(ðD IQÐQVÉðE0(ðF ˜S #˜X™ðG0(ðH "ðI0(ðH FIðI0(ðJ '*ðK0(ðJ ORðK0(ðL ðM0(ðL <?ðM0(ðN ˜3 ˜9‘o¨Ñ,ðO0(ðN ;>À¹*ðO0(ðP óQ0(òdð&¨3ó ô !WðH 26ÐW[Ø,0ÈUÐimòkØ!)¨#¡ðkØGOÐPSÁ}ðkà# D™>ðkàFJðkàbfðkð 
ó	kð: mqØ7<ò/X°X¸d±^ð /XÐ\dÐehÑ\ið /XØ04ó/Xðb ð
<À(È3Á-ð 
<Ðilð 
<ÐqyÐz}Ñq~ò 
<ó ð
<ð ð
°3ð 
¸4ò 
ó ð
ò
ÀXÈcÁ]ð 
Ð^aó 
ñ Ð9¸>ÓJ€LòH¸ÀÀdÈ3ÐPSÈ8ÁnÑAUÑ8Vð HÐbfÐgjÐloÐgoÑbpó Hñ (Ð(;Ð=OÓPÐÙ$,Ð-@ÐB`Ó$aÐ!Ù.Ð/BÐD]Ó^Ððk°]ð kÀtó kñ !Ð!4Ð6HÓIÐÙ Ð!4Ð6HÓIÐð	E¨Cð 	E°mð 	EÈó 	Eð
 t¨C°¨H¡~ó 
ñ ,4Ð4TÐV{Ó+|Ð(Ù"*Ð+KÐMiÓ"jÐðr h¨s¡mð r¸ó rò@¨cð @¸Tó @ò>¨Sð >¸Dó >ò
s¨sð s¸dó sð
S¨Eó Sð°u¸UÀD¸[Ñ7Ió ð*¸Sð ÀUó ð2K¨Dó Kò
¨X°c©]ð 
ÀhÈsÁmó 
ð0L Dó Lðz ó zðz dó zð
Z 4ó Zñ &.Ð.KÐMlÓ%mÐ"Ù5=Ð>[ð  ^Nó  6OÐ2àðD¨Sð D°Tò Dó ðDð
 ØX\ò <°cð <ÈÐQTÉð <Ðaeò <ó ð<ð.% sð %¨tó %ð ð¸#ð À(È3Á-ò ó ððQ°cð Q¸dó Qñ #Ð#@ÐBVÓWÐàðt¨cð t°dò tó ðtð*¨ó *ò2C¸Sð CÐ_gÐhlÑ_mð CÐy}ó Cñ  *2Ð2OÐQtÓ)uÐ&Ù!Ð"?ÐATÓUÐÙ&Ð'FÐH`ÓaÐ÷ mÑlÙ+:Ð;TÐV{Ó+|Ð(à\aØlqò4¸$¸t¹*ð 4ÐUYð 4Ø04ð4ØEMÈcÁ]ð4Øeið4Øvzó4ð@ afØY]ØijØ6;ò&¸dÀ4¹jð &ÐY]ð &Ø48ð&ØIQÐRUÉð&à/7¸¸SÀ#¸X¹Ñ/Gð&àcfð&ð 04ð&ð AEó&ðP $%Ð ôKñ* $,Ð,EÐGdÓ#eÐ Ù+3Ð4QÐSxÓ+yÐ(ð
 dó 
ò ;°ð ;Àó ;ò;¨dð ;¸dó ;ð @DòÀsð Ð\_ð Ðnrð Ø15¸±ðØHLóôB,ô3ð.,¨dð ,°tó ,ð"
¨H°c°U¸D°[Ñ,Að 
Àdó 
ðM¨Sð M°Tó Mô
"ð ó6ó ð6ô
)ð ¨4°°S¸#°X±Ñ+?ð ÀDó ð&¨T°$°s¸C°x±.Ñ-Að ÀhÈuÁoó ð. ð°t¸DÀÀcÀ¹NÑ7Kð ÐY\ð Ðaeò ó ðð ð
¸$¸sÀC¸x¹.ð 
ÐX[ð 
Ð`dò 
ó ð
ð ð) ò )ó ð)ñ $Ð$9Ð;PÓQÐñ  ,Ð,KÓLÐàðH¨#ò Hó ðHñ !Ò!aÓbÐÙ,Ð-JÐLcÓdÐàØ_cò !¨¨c°3¨h©ð !ÐX\ð !Ðhlò !ó ð!ðF ð5¨3ð 5°4ò 5ó ð5ñ( +:Ð:WÐY}Ó*~Ð'àð¨Tð °dò ó ðð& ðG¨Dð G°Tò Gó ðGñ( +Ð+KÓLÐá Ð!>Ð@RÓSÐÙ (Ð)>Ð@ZÓ [Ðñ *Ð*FÓGÐÙ+Ð,JÓKÐÙ)5Ð6^Ó)_Ð&á&Ð'FÐH`ÓaÐÙ(0Ð1PÐRtÓ(uÐ%Ù%Ð&EÐG^Ó_Ððg tó gñ  (Ð(EÐG`ÓaÐÙ%-Ð.KÐMlÓ%mÐ"Ù Ð!@ÐBTÓUÐð:Ð1Fð :È4ó :ð

Ð<Qð 
ÐVYó 
ð IKò°sð È4ð Ðbeð Ø.2ðØBEðØORóðB: tó :ð4Ð0Eð 4È#ó 4ò"4¸tð "4ÐX[ð "4Ðmpð "4Ðy}ó "4ðH
°Tð 
¸có 
ñ Ð9¸=ÓI€LàòD˜Sð D¨ð D°Sð DÀsò Dó ðDñ &.Ð.CÑEdÓ%eÐ"Ù%-Ð.CÑEdÓ%eÐ"Ù%Ð&EÑG^Ó_Ðð x°¡}õ r�   >   ÚwebÚvisionÚcreativeÚterminalrï  >   ÚanalysisÚresearchÚ
full_stackÚdevelopmentÚcontent_creationuh  
ðŸ’¡ Usage Examples:
  # Use predefined toolsets
  python run_agent.py --enabled_toolsets=research --query='search for Python news'
  python run_agent.py --enabled_toolsets=development --query='debug this code'
  python run_agent.py --enabled_toolsets=safe --query='analyze without terminal'

  # Combine multiple toolsets
  python run_agent.py --enabled_toolsets=web,vision --query='analyze website'

  # Disable toolsets
  python run_agent.py --disabled_toolsets=terminal --query='no command execution'

  # Run with trajectory saving enabled
  python run_agent.py --save_trajectories --query='your question here'c            
      ón  — ddl m} m} ddlm}m} t        d«       t        d«       t        d«       t        d«       g g g }}} |«       D ]6  } ||«      }|sŒ|t        v r|n|t        v r|n|}	|	j                  ||f«       Œ8 t        d«       |D ]A  \  }}t        d	|d
›d|d   › �«       t        d|d   rdj                  |d   «      nd› �«       ŒC t        d«       |D ]R  \  }}t        d	|d
›d|d   › �«       t        d|d   rdj                  |d   «      nd› �«       t        d|d   › �«       ŒT t        d«       |D ]+  \  }}t        d	|d›d|d   › �«       t        d|d   › �«       Œ- t        d«        |«       j                  «       D ]I  \  }}t        d|d   rdnd› d|› d|d   › �«       |d   rŒ*t        ddj                  |d    «      › �«       ŒK  | «       }
t        d!t        |
«      › d"�«       t        |
«      D ]  }t        d#|› d$t        |«      › d%�«       Œ t        t        «       y&)'zi``--list_tools``: print toolsets (basic / composite / scenario / legacy), every tool, and usage examples.r   )Úget_all_tool_namesÚget_available_toolsets)Úget_all_toolsetsÚget_toolset_infou    ðŸ“‹ Available Tools & Toolsets:z2--------------------------------------------------u'   
ðŸŽ¯ Predefined Toolsets (New System):z(----------------------------------------u   
ðŸ“Œ Basic Toolsets:u     â€¢ Ú15z - Údescriptionz    Tools: Úresolved_toolsz, rY  u5   
ðŸ“‚ Composite Toolsets (built from other toolsets):z    Includes: Úincludesz    Total tools: Ú
tool_countu!   
ðŸŽ­ Scenario-Specific Toolsets:Ú20u3   
ðŸ“¦ Legacy Toolsets (for backward compatibility):z  Ú	availableu   âœ…u   â�Œr)  ú: z    Requirements: Úrequirementsu   
ðŸ”§ Individual Tools (z available):u     ðŸ“Œ z (from ú)N)Úmodel_toolsr»  r¼  Útoolsetsr½  r¾  ÚprintÚ_BASIC_TOOLSETSÚ_COMPOSITE_TOOLSETSr  rr  r  r¦   ÚsortedrS   Ú_LIST_TOOLS_USAGE)r»  r¼  r½  r¾  Úbasic_toolsetsÚcomposite_toolsetsÚscenario_toolsetsrK  rW  ÚbucketÚ	all_toolsr*  s               r   Ú_print_tool_listingrÕ  ’  s’  € çFß;ä	Ð
,Ô-Ü	ˆ(„OÜ	Ð
4Ô5Ü	ˆ(„OØ<>ÀÀBÐ(9Ð&€NÙ Ó"ò (ˆÙ Ó%ˆÚØ'+¬Ñ'>‘^ÐZ^ÔbuÑZuÑDVð  |MˆFØ�M‰M˜4 ˜,Õ'ð	(ô
 
Ð
"Ô#Ø$ò g‰
ˆˆdÜ��t˜B�i˜s 4¨Ñ#6Ð"7Ð8Ô9Ü�ÀÐFVÒAW˜DŸI™I dÐ+;Ñ&<Ô=Ð]cÐdÐeÕfðgô 
Ð
BÔCØ(ò 8‰
ˆˆdÜ��t˜B�i˜s 4¨Ñ#6Ð"7Ð8Ô9Ü�¸dÀ:Ò>N˜tŸy™y¨¨jÑ)9Ô:ÐTZÐ[Ð\Ô]ÜÐ! $ |Ñ"4Ð!5Ð6Õ7ð8ô 
Ð
.Ô/Ø'ò 8‰
ˆˆdÜ��t˜B�i˜s 4¨Ñ#6Ð"7Ð8Ô9ÜÐ! $ |Ñ"4Ð!5Ð6Õ7ð8ô 
Ð
@ÔAÙ,Ó.×4Ñ4Ó6ò J‰
ˆˆdÜ�˜D Ò-‘5°5Ð9¸¸4¸&ÀÀ4ÈÑCVÐBWÐXÔYØ�KÓ ÜÐ& t§y¡y°°nÑ1EÓ'FÐ&GÐHÕIðJñ #Ó$€IÜ	Ð%¤c¨)£nÐ%5°\Ð
BÔCÜ˜IÓ&ò Nˆ	Ü�˜	�{ 'Ô*>¸yÓ*IÐ)JÈ!ÐLÕMðNä	Ô
Õr�   Úrawrb  c                 óŽ   — | sy| j                  d«      D �cg c]  }|j                  «       ‘Œ }}t        |› d|› �«       |S c c}w )uG   Comma-separated toolset CLI arg â†’ list (echoed), or None when absent.Nr  rÆ  )ro  r   rË  )rÖ  rb  ÚtÚnamess       r   Ú_parse_toolset_argrÚ  º  sF   € áØØ #§	¡	¨#£Ö/˜1ˆQ�W‰W�YÐ/€EÐ/Ü	ˆUˆG�2�e�WÐ
ÔØ€Lùò 0s   —AÚresultÚ
user_queryrÑ   c                 óÊ  — dt        t        j                  «       «      dd › d�}| j                  |d   ||d   «      t	        j
                  «       j                  «       ||d   |dœ}	 t        |dd	¬
«      5 }|j                  t        j                  |dd¬«      «       ddd«       t        d|› �«       y# 1 sw Y   ŒxY w# t        $ r}t        d|› �«       Y d}~yd}~ww xY w)z```--save_sample``: write one trajectory (same format as batch_runner) to a UUID-named JSON file.Úsample_Nr{   z.jsonr›   Ú	completed)ÚconversationsÚ	timestamprÑ   rß  ÚqueryÚwzutf-8)ÚencodingFr  )Úensure_asciirc  u"   
ðŸ’¾ Sample trajectory saved to: u   
âš ï¸� Failed to save sample: )r(   ÚuuidÚuuid4Ú_convert_to_trajectory_formatr   ÚnowÚ	isoformatÚopenÚwriterH   rI   rË  r'   )r.   rÛ  rÜ  rÑ   Úsample_filenameÚentryÚfr;  s           r   Ú_save_sample_trajectoryrð  Ã  sâ   € à¤¤D§J¡J£LÓ 1°"°1Ð 5Ð6°eÐ<€Oà×<Ñ<¸VÀJÑ=OÐQ[Ð]cÐdoÑ]pÓqÜ—\‘\“^×-Ñ-Ó/¸%ÈfÐU`ÑNaÐlvñ€Eð6Ü�/ 3°Ô9ð 	E¸QØ�G‰G”D—J‘J˜u°5ÀÔCÔD÷	EäÐ3°OÐ3DÐEÕF÷	Eð 	Eûô ò 6ÜÐ0°°Ð4×5Ñ5ûð6ús0   Á(C Á6(B5ÂC Â5B>Â:C Ã	C"Ã
CÃC"râ  rË   rÂ   Ú	max_turnsrÔ   rÕ   Ú
list_toolsrÖ   Úsave_sampleÚverboserÛ   c                 óT  — t        d«       t        d«       |r
t        «       S t        |d«      }t        |d«      }|r!t        d«       t        d«       t        d«       	 t        ||||||||
|¬«	      }| �| nd}t        d|› �«       t        d«       |j                  |«      }t        d«       t        d|d   › d|d   › dt        |d   «      › �«       |d   rt        d|d   z   «       |	rt        ||||«       t        d«       y
# t        $ r}t        d	|› �«       Y d
}~y
d
}~ww xY w)a  
    Main function for running the agent directly.

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

    Toolset Examples:
        - "research": Web search, extract, crawl + vision tools
    u   ðŸ¤– AI Agent with Tool Callingz2==================================================u   ðŸŽ¯ Enabled toolsetsu   ðŸš« Disabled toolsetsu   ðŸ’¾ Trajectory saving: ENABLEDu:      - Successful conversations â†’ trajectory_samples.jsonlu7      - Failed conversations â†’ failed_trajectories.jsonl)	rÂ   rÑ   rË   rÒ   rÔ   rÕ   rÖ   r×   rÛ   u    â�Œ Failed to initialize agent: NzžTell me about the latest developments in Python 3.13 and what new features developers should know about. Please search for current information and try it out.u   
ðŸ“� User Query: z3
==================================================u€   
==================================================
ðŸ“‹ CONVERSATION SUMMARY
==================================================u   âœ… Completed: rß  u   
ðŸ“ž API Calls: Ú	api_callsu   
ðŸ’¬ Messages: r›   ry  u5   
ðŸŽ¯ FINAL RESPONSE:
------------------------------
u    
ðŸ‘‹ Agent execution completed!)rË  rÕ  rÚ  r/   ÚRuntimeErrorÚrun_conversationr¦   rð  )râ  rÑ   rË   rÂ   rñ  rÔ   rÕ   rò  rÖ   ró  rô  rÛ   Úenabled_toolsets_listÚdisabled_toolsets_listr.   r;  rÜ  rÛ  s                     r   Úmainrû  Ò  sf  € ô> 
Ð
+Ô,Ü	ˆ(„OÙÜ"Ó$Ð$ä.Ð/?ÐAXÓYÐÜ/Ð0AÐC[Ó\ÐÙÜÐ/Ô0ÜÐJÔKÜÐGÔHðÜØ U°GÈIØ2ÐF\Ø/ÀÐ[kô
ˆð  Ð+‘ð 3H€Jä	Ð 
˜|Ð
,Ô-Ü	ˆ/Ôà×#Ñ# JÓ/€Fä	Ð
FÔGÜ	ˆO˜F ;Ñ/Ð0Ð0BÀ6È+ÑCVÐBWÐWhÔilÐmsÐt~Ñmó  jAð  iBð  Cô  DØÐÒÜÐ:¸VÐDTÑ=UÑUÔVÙÜ  v¨z¸5ÔAÜ	Ð
-Õ.øô# ò ÜÐ0°°Ð4Ô5Üûðús   ÁD Ä	D'ÄD"Ä"D'Ú__main__)ÚSimpleNamespaceÚCOMPRESSED_SUMMARY_METADATA_KEY)úagent.context_compressorrþ  ÚContextCompressor)rÿ  r   ÚDEFAULT_AGENT_IDENTITY)úagent.prompt_builderr  ÚFailoverReason)zagent.error_classifierr  ÚOpenAI)zagent.process_bootstrapr  Úatomic_json_write)Úutilsr  Úbuild_context_files_prompt)r  r  Úbuild_environment_hints)r  r  Úbuild_skills_system_prompt)r  r	  Úcheck_toolset_requirements)rÉ  r
  Úconvert_scratchpad_to_think)zagent.trajectoryr  Úestimate_request_tokens_rough)zagent.model_metadatar  Úfile_mutation_result_landed)z agent.tool_result_classificationr  Úflatten_message_text)zagent.message_contentr  Úget_tool_definitions)rÉ  r  Úhandle_function_call)rÉ  r  Úis_truthy_value)r  r  )zagent.retry_utilsÚjittered_backoff)r  Úload_soul_md)zagent.usage_pricingÚnormalize_usage)zagent.redactÚredact_sensitive_text)zagent.interrupt_compatÚrequest_hard_interrupt)zagent.memory_managerÚsanitize_context)rÿ  Úuser_originated_turn_view)r  r  r  r  r  r  r  c                 óÌ   — t         j                  | «      }|€t        dt        ›d| ›�«      ‚dd l}ddlm}  |t        | g|¢­Ž  t        |j                  |d   «      |d   «      S )Nzmodule z has no attribute r   )Ú	warn_oncer¤   )	Ú_PLUGIN_COMPAT_LAZYr   ÚAttributeErrorr¸   Ú	importlibÚhermes_cli.plugin_compatr  rF   Úimport_module)rK  rH  r  r  s       r   Ú__getattr__r   D  se   € Ü ×$Ñ$ TÓ*€FØ€~Ü˜w¤x lÐ2DÀTÀHÐMÓNÐNÛÝ2ÙŒh˜Ð&˜vÓ&Ü�9×*Ñ*¨6°!©9Ó5°v¸a±yÓAÐAr�   rL  )Nr   Nr   rÊ   NNFFFFrÉ   )�r»   Úhermes_bootstrapÚModuleNotFoundErrorrH   ÚloggingÚ	getLoggerr¸   r…   r   rÜ  r„  rÎ  rN  ræ  r  Útypingr   r   r   r   r   r   Úpathlibr	   Úhermes_constantsr
   r(   r   r�  r)   r*   r   r-   rL   Úagent.iteration_budgetrM   Úhermes_cli.env_loaderrN   Úhermes_cli.timeoutsrO   rP   Ú_hermes_homeÚ__file__ÚparentÚ_loaded_env_pathsÚ	_env_pathrW  rÉ  rS   Útools.terminal_tool_lifecyclerT   rU   Útools.interruptrV   rÃ  Útools.browser_tool_lifecyclerW   Útools.connectors.turnrX   rY   Úagent.memory_providerrZ   Úagent.client_lifecycler[   Úagent.stream_deliveryr\   Úagent.status_outputr]   Úagent.api_request_hooksr^   Úagent.api_error_summaryr_   r`   Úagent.interrupt_controlra   Úagent.turn_explainersrb   Úagent.activity_trackingrc   Úagent.rate_limit_creditsrd   Úagent.session_persistencere   Úagent.compression_facaderf   Úagent.turn_facaderg   Úagent.vision_message_preprh   Úagent.reasoning_paramsri   Úagent.lazy_forwardrj   rˆ  rk   r‰  rg  rl   Úagent.model_metadatarm   Úagent.message_sanitizationrn   rœ  ro   r¥  rp   r¡  rÚ  rq   r¨  rr   r§  rs   Úagent.tool_guardrailsrt   ru   rv   r  rw   rx   ry   rz   Ú_MAX_TOOL_WORKERSÚEventÚ_openrouter_prewarm_doner€   rˆ   rŒ   rŽ   r�   r–   rš   rƒ  r¢   r©   r'   r«   r/   rÌ  rÍ  rÏ  rÕ  rÚ  r-  rð  rû  ÚfireÚFireÚtypesrý  ÚasyncioÚbase64ÚcopyÚhashlibÚtempfiler  r   r8  r�   r   ú<module>rR     så  ðñð	Ûó Û Ø	ˆ×	Ñ	˜8Ó	$€Û 	Û 	Û 
Û Û Û Û ß 6Õ 6Ý Ý å ,ð Cð ¨H°S©Mó ñ& " 5¨)Ð"4Ó5Ð ð €Ù  ~Ð6Ó7Ð ð'¨°©ð '¸#ó 'ð 	ð ¨h°s©mó õD 3Ý 4ß XáÓ €Ù&°<ÉTÐRZË^×MbÑMbÐekÑMkÔlÐ Ø"ò C€IØ
‡K�KÐ6¸	ÕBðCáØ
‡K�KÐIÔJõ -ß DÝ ;Ý 8ß Uå 3Ý 7Ý 5Ý 1Ý 8ß WÝ 9Ý 5Ý 9Ý :Ý =Ý ;Ý -Ý <Ý 7ß UÝ 5Ý 2÷ñ ÷
ñ ÷
 oÑ nß iÓ ið Ð ð +˜9Ÿ?™?Ó,Ð ð�ð ¨tó ðK˜cð K¨ð KÀ$ó Kðc˜ð c ¨#¡ó cð
\ ð \¨x¸¸SÀ#¸X¹Ñ/Gð \ÈDó \ð@˜Sð @ Só @ðX¨cð X¸XÀd¹^ð XÐPTó XðQ¨tó Qôs˜	ô sôVØÐ-Ð/@ÐBVÐXlØÐ.Ð0EÐG\ØÐ3°_ÐF\Ð^rôVòr$ I€Ú_Ð ðJÐ ó"%ðP˜H S™Mð °#ð ¸(À4ÈÁ9Ñ:Mó ð6 9ð 6°dð 6Èð 6ÐTWð 6Ð\`ó 6ð  ceØTYØoqñB/ØðB/Ø!ðB/Ø14ðB/ØGJðB/Ø\_ðB/àðB/à58ðB/àMQðB/ð ðB/ð 37ðB/ð JNðB/ð jmóB/ðJ ˆzÒÛØ€D‡I‚Iˆd„Oõ "Û Û Û Û Û ðØ%Ð'fðàÐJðð ÐPðð ÐBð	ð
 Ð3ðð Ð7ðð !Ð"Xðð ÐRðð !Ð"Xðð !Ð"Oðð "Ð#Vðð $Ð%^ðð "Ð#fðð ÐMðð ÐCðð  ÐCð!ð" Ð3ð#ð$ BØ<ØAØFØRØDØ!Zò1Ð ó8Bøðq1 ò 	Úð	ús   „K= Ë=LÌL