+
    …WÝj Z ã                   ó^  € R t  ^ RIt^ RItR]P                  9  d/   ^ RIHt ]P                  ! 4       '       d   ]P                  ! 4        ^ RIt^ RIt]P                  ! ]4      t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHtHtHtHt ^ RIHt ^ RIHt ^ RIH t H!t! ^ R	I"H#t# R
 R lt$R R lt%^ RI&H't' ^ RI(H)t) ^ RI*H+t+H,t, ]#! 4       t-])! ]-]! ].4      P^                  R,          R7      t0]0 F  t1]Pe                  R]14       K  	  ]0'       g   ]Pe                  R4       ^ RI3H4t4 ^ RI5H6t6H7t7 ^ RI8H9t: ^ RI;H<t< ^ RI=H>t>H?t? ^ RI@HAtA ^ RIBHCtC ^ RIDHEtE ^ RIFHGtG ^ RIHHItI ^ RIJHKtKHLtL ^ R IMHNtN ^ R!IOHPtP ^ R"IQHRtR ^ R#ISHTtT ^ R$IUHVtV ^ R%IWHXtX ^ R&IYHZtZ ^ R'I[H\t\ ^ R(I]H^t^ ^ R)I_H`taHbtc ^ R*IdHete ^ R+IfHgtg ^ R,IhHitjHktlHmtn ^ R-IoHptqHrtsHttt ^ R.IuHvtvHwtwHxtx ^ R/IyHztzH{t{ ^ R0I|H}t}H~t~HtH€t€ ^t�]EP                  ! 4       tƒR1 R2 lt„R3 R4 lt…R5 R6 lt†R7 R8 lt‡R9 R: ltˆR; R< lt‰R= R> ltŠ ! R? R@]‹4      tŒ ! RA RB]C]E]G]I]K]N]P]R]T]V]X]Z]\]^4      t�0 ROmtŽ0 RPmt�RCt�RD RE lt‘RF RG lt’RH RI lt“RQRJ RK llt”]RL8X  d   ^ RMI•H”t– ]—! ]–! ]”RN7      4      hR#   ] d   t]P                  R8w  d   h  RtAELŸRtAii ; i)Ra!  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Úhermes_bootstrapzhermes_cli.main)Ú_early_recovery)ÚListÚDictÚAnyÚOptionalÚCallable)Údatetime)ÚPath)ÚCLI_FAMILY_SOURCESÚsession_source_for)Úget_hermes_homec                óF   € V ^8„  d   QhR\         R\        \         ,          /# )é   ÚsourceÚreturn)Ústrr   )Úformats   "Ú=C:\Users\johnn\AppData\Local\hermes\hermes-agent\run_agent.pyÚ__annotate__r   +   s   € ÷ ñ ¤Cð ¬H´S­Mñ ó    c                ó   € V \         9  gK   \        P                  P                  R4      ;'       g    RP	                  4       P                  4       R9  d   R#  \        P                  ! 4       #   \         d     R# i ; i)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ÚlocalN)Ú r   )r   ÚosÚenvironÚgetÚstripÚlowerÚgetcwdÚOSError)r   s   &r   Ú_launch_cwd_for_sessionr"   +   sb   € ð Ô'Ô'¬B¯J©J¯N©N¸>Ó,J×,UÐ,UÈg×+\Ñ+\Ó+^×+dÑ+dÓ+fÐn{Ô+{ÙðÜ�yŠy‹{ÐøÜô Úðús   ÁA. Á.A=Á<A=c                ó>   € V ^8„  d   QhRRR\         \        ,          /# )r   ÚagentÚAIAgentr   ©r   r   )r   s   "r   r   r   9   s   € ÷ ñ  	ð ¬h´s­mñ r   c                óf  € \        V RR4      p\        V RR4      p\        V RR4      pV'       g   V'       g   V'       g   R# R\        V RR4      ;'       g    RRTR\        V R	R4      R
\        V RR4      ;'       g    RRVR\        V RR4      R\        V RR4      /p\        V RR4      '       d   V P                  VR&   \        V RR4      pV'       g    ^ RIHp V! 4       pVR8X  d   RpV'       d   WTR&    \
        P                  ! V4      #   \         d    Rp L;i ; i  \         d     R# i ; i)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_idÚplatformr   Úchat_idÚ	chat_nameÚ
_chat_nameÚ	chat_typeÚ
_chat_typeÚdmÚuser_idÚ	user_nameÚ
_user_nameÚ	thread_idÚ
_thread_idÚ_user_id_altÚuser_id_altÚ_profile_name©Úget_active_profile_nameÚdefaultÚprofile)Úgetattrr7   Úhermes_cli.profilesr;   Ú	ExceptionÚjsonÚdumps)r$   r,   Úsession_keyr2   Úoriginr=   r;   s   &      r   Ú_gateway_origin_jsonrE   9   s<  € ô
 �e˜Z¨Ó.€GÜ˜%Ð!7¸Ó>€KÜ�e˜Z¨Ó.€Gß—{§gÙà”G˜E :¨tÓ4×:Ð:¸¸IÀwØ”W˜U L°$Ó7¸ÄgÈeÐUaÐcgÓFh×FpÐFpÐlpØ�7˜K¬°¸À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$   ÃD Ã8D! ÄDÄDÄ!D0Ä/D0)Ú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)ÚApiErrorSummaryMixinÚis_provider_stream_parse_error)Ú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)Úrecord_guardrail_decisionÚrecord_guardrail_warnings)Úbase_url_host_matchesÚbase_url_hostnameÚ	env_floatÚ"model_forces_max_completion_tokensc                ó(   € V ^8„  d   QhR\         RR/# )r   Úfnr   N)r   )r   s   "r   r   r   •   s   € ÷ ñ ”ð ¨tñ r   c                ó<   €  V ! V/ VB  R#   \          d     R# i ; i)zKRun one teardown step, swallowing any exception so sibling steps still run.N)r@   )rw   ÚargsÚkwargss   &*,r   Ú_quietlyr{   •   s&   € ðÙ
ˆDÐ�FÔøÜô Úðús   ‚ Œšc                ó4   € V ^8„  d   QhR\         R\        RR/# )r   ÚengineÚhookr   N©r   r   )r   s   "r   r   r   �   s&   € ÷ Kñ Kœcð K¬ð KÀ$ñ Kr   c                ó®   € \        W4      '       g   R#  \        W4      ! V/ VB  R#   \         d"   p\        P	                  RY4        Rp?R# Rp?ii ; i)zTInvoke an optional context-engine lifecycle hook; failures are logged, never raised.Nz'context engine %s during transition: %s)Úhasattrr>   r@   ÚloggerÚdebug)r}   r~   ry   rz   Úexcs   &&*, r   Ú_call_engine_hookr…   �   sL   € ä�6× Ò ÙðKÜ�Ô˜tÐ. vÔ.øÜô KÜ�‰Ð>À×JÒJûðKús   •( ¨A³AÁAc                óF   € V ^8„  d   QhR\         R\        \        ,          /# ©r   Úvaluer   ©r   r   Úint)r   s   "r   r   r   §   s"   € ÷ cñ cœð c¤¬#¥ñ cr   c                óp   € \        V \        4      '       d    \        V \        4      '       g
   V ^ 8”  d   V # R# )zE``value`` when it is a real positive int (bools excluded), else None.N)Ú
isinstancerŠ   Úbool)rˆ   s   &r   Ú_positive_intrŽ   §   s-   € ä˜u¤c×*Ò*´:¸eÄT×3JÒ3JÈuÐWXÌyˆ5ÐbÐ^bÐbr   c                ót   € V ^8„  d   QhR\         R\        \        \        \         3,          ,          R\        /# )r   r$   Útask_cfgr   )r   r   Údictr   r�   )r   s   "r   r   r   ¬   s3   € ÷ \ñ \¤ð \¬x¼¼SÄ#¸X½Õ/Gð \ÌDñ \r   c                óH   € ^ RI HpHp V! V4      R8H  ;'       d	    V! W4      # )zaTrue when an automatic background review targets the managed local runtime under ``defer: auto``.)Ú
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Ó.[Ð[r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   r$   r   r   )r   s   "r   r   r   ²   s   € ÷ @ñ @œSð @¤Sñ @r   c                 óT   € \        \        V R R4      ;'       g    \        V 4      4      # )Ú
session_idN)r   r>   Úid)r$   s   &r   Ú_review_queue_keyrœ   ²   s"   € ÜŒw�u˜l¨DÓ1×>Ð>´R¸³YÓ?Ð?r   c                óJ   € V ^8„  d   QhR\         R\        \        ,          RR/# )r   r$   Úmessagesr   N)r   r   Úlist)r   s   "r   r   r   ¶   s+   € ÷ Xñ X¬cð X¼XÄd½^ð XÐPTñ Xr   c                ó\   a aa€ \        S RR4      oS'       d   \        V VV3R l4       R# R# )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                  ód   <€ SP                  S P                  ;'       g    R S;'       g    . 4      # )r   )Úon_session_endrš   )r$   r}   rž   s   €€€r   Ú<lambda>Ú4_notify_context_engine_session_end.<locals>.<lambda>»   s'   ø€ ˜×.Ñ.¨u×/?Ñ/?×/EÐ/EÀ2ÀxÇ~À~ÐSUÔVr   )r>   r{   )r$   rž   r}   s   ff@r   Ú"_notify_context_engine_session_endr¦   ¶   s%   ú€ ô �UÐ0°$Ó7€FßÜÖVÖWñ r   c                ó$   € V ^8„  d   QhR\         /# ©r   r   ©r�   )r   s   "r   r   r   ¾   s   € ÷ Qñ Q¬tñ Qr   c                ó‚   € V RJ;'       d5    V P                  4       ;'       d    \        V P                  4       4      ^8„  # )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¯   ¾   s8   € ð �tÐ×PÐP × 2Ñ 2Ó 4×PÐP¼¸T¿\¹\»^Ó9LÈqÑ9PÐPr   c                   óR   a a€ ] tR t^Èt oRtRRRRRR/V3R lV 3R llltRtVtV ;t# )	Ú_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.
ÚcodeNÚparamÚstatus_codec          
      óf   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[S[ ,          RS[S[,          RR/# )r   Úmessager²   r³   r´   r   N)r   r   rŠ   )r   Ú__classdict__s   "€r   r   Ú_StreamErrorEvent.__annotate__Î   sF   ø€ ÷ sñ s¡ð s©h±s­mð sÉ8ÑTWÍ=ð sÙ&¡s�mðsØ7;ñsr   c          	     ó‚   <€ \         SV `  V4       WW43w  V n        V n        V n        V n        R RVRVRVRR //V n        R# )Úerrorr¶   r²   r³   ÚtypeN)ÚsuperÚ__init__r¶   r²   r³   r´   Úbody)Úselfr¶   r²   r³   r´   Ú	__class__s   &&$$$€r   r½   Ú_StreamErrorEvent.__init__Î   sM   ø€ ä‰Ñ˜Ô!Ø@GÈuÐ@aÑ=ˆŒ�d”i ¤¨TÔ-=à%,¨y¸'À6È4ÐQXÐZ_ÐagÐipÐ.qÐ$rˆŽ	r   )r¾   r²   r¶   r³   r´   )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r½   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)rÀ   r·   s   @@r   r±   r±   È   s6   ù‡ € ñð
s¸dð sÐ[_ð sØ.2÷s÷ sõ sr   r±   c            V       óÚ	  a € ] tR t^Öt o RtRt]V 3R lR l4       t]P                  V 3R lR l4       tRRRRRRRRR]	P                  RRRR	R	R	R
R^dR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	RRRR	RR3VV 3R lR lltR tV 3R lR ltV 3R lR ltRRRRRRRR	RR/V 3R lR lltRÉV 3R lR llt]V 3R lR l4       t]V 3R lR  l4       tRÊV 3R! lR" llt]! R#R$4      tRÊR%R	/V 3R& lR' lllt]! R(R)4      t]! R(R*4      t]! R(R+4      tV 3R, lR- lt]! R(R.4      t]! R(R/4      tV 3R0 lR1 ltV 3R2 lR3 lt ]! R4R54      t!]! R4R64      t"V 3R7 lR8 lt#RÊV 3R9 lR: llt$RÊV 3R; lR< llt%RÊV 3R= lR> llt&V 3R? lR@ lt'V 3RA lRB lt(V 3RC lRD lt)V 3RE lRF lt*RÊV 3RG lRH llt+V 3RI lRJ lt,V 3RK lRL lt-V 3RM lRN lt.V 3RO lRP lt/]! R#RQ4      t0]! R#RR4      t1]V 3RS lRT l4       t2]RUR/V 3RV lRW ll4       t3V 3RX lRY lt4]V 3RZ lR[ l4       t5V 3R\ lR] lt6]! R#R^4      t7]V 3R_ lR` l4       t8V 3Ra lRb lt9RÊV 3Rc lRd llt:]! R#Re4      t;]! R#Rf4      t<]! RgRh4      t=^ RiI>H?t?H@t@HAtA ]! RjRk4      tBRËV 3Rl lRm lltCRÌV 3Rn lRo lltD^tEV 3Rp lRq ltF]! RjRr4      tG]! R#Rs4      tHV 3Rt lRu ltIRÊV 3Rv lRw lltJRÊV 3Rx lRy lltKRzR/V 3R{ lR| lltLV 3R} lR~ ltMV 3R lR€ ltNV 3R� lR‚ ltOV 3Rƒ lR„ ltPV 3R… lR† ltQV 3R‡ lRˆ ltR]V 3R‰ lRŠ l4       tSV 3R‹ lRŒ ltTV 3R� lRŽ ltUV 3R� lR� ltV]WV 3R‘ lR’ l4       tX]WV 3R“ lR” l4       tY]V 3R• lR– l4       tZ]! R—R˜4      t[]! ]\4      t]]V 3R™ lRš l4       t^]_! 0 RÍm4      t`]! R#R›4      ta]RœR/V 3R� lRž ll4       tb]V 3RŸ lR  l4       tc]! R#R¡4      td]V 3R¢ lR£ l4       te]V 3R¤ lR¥ l4       tf]! ]g4      th]! R#R¦4      ti]! R—R§4      tj]! ]k4      tl]! ]m4      tn]! ]o4      tp]! RgR¨4      tq]! RgR©4      tr]! RgRª4      tsV 3R« lR¬ ltt]! R#R­4      tu]! R#R®4      tv]! RgR¯4      twV 3R° lR± ltxV 3R² lR³ ltyR´R/V 3Rµ lR¶ lltzV 3R· lR¸ lt{V 3R¹ lRº lt|RÎV 3R» lR¼ llt}V 3R½ lR¾ lt~]! R#R¿4      t]RÏV 3RÀ lRÁ ll4       t€]! RÂRÃ4      t�]! RÂRÄ4      t‚]! RgRÅ4      tƒV 3RÆ lRÇ lt„RÈt…V t†R# )Ð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.]c                ó    <€ V ^8„  d   QhRS[ /# r¨   ©r   )r   r·   s   "€r   r   ÚAIAgent.__annotate__ã   s   ø€ ÷ ñ ™#ñ r   c                ó   € V P                   # ©N)Ú	_base_url©r¿   s   &r   Úbase_urlÚAIAgent.base_urlâ   s   € à�~‰~Ðr   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rˆ   r   NrÌ   )r   r·   s   "€r   r   rÍ   ç   s   ø€ ÷ ;ñ ;™cð ; dñ ;r   c                óp   € Wn         V'       d   VP                  4       MR V n        \        V4      V n        R# )r   N)rÐ   r   Ú_base_url_lowerrs   Ú_base_url_hostname©r¿   rˆ   s   &&r   rÒ   rÓ   æ   s&   € àŒß05˜uŸ{™{œ}¸2ˆÔÜ"3°EÓ":ˆÖr   Nr   FÚalliô  c          ©      ó^  <€ V ^8„  d   QhRS[ R,          RS[ R,          RS[ R,          RS[ R,          RS[ R,          RS[S[ ,          R,          RS[ R,          R	S[S[ ,          R,          R
S[ RS[RS[R,          RS[S[ ,          R,          RS[S[ ,          R,          RS[RS[RS[RS[ RS[ R,          RS[RS[ RS[S[ ,          R,          RS[S[ ,          R,          RS[S[ ,          R,          RS[ R,          RS[RS[ R,          RS[S[,          RS[ R,          RS[RS[3,          R,          R S[RS[3,          R,          R!S[RS[3,          R,          R"S[RS[3,          R,          R#S[RS[3,          R,          R$S[RS[3,          R,          R%S[RS[3,          R,          R&S[RS[3,          R,          R'S[RS[3,          R,          R(S[RS[3,          R,          R)S[RS[3,          R,          R*S[RS[3,          R,          R+S[RS[3,          R,          R,S[RS[3,          R,          R-S[RS[3,          R,          R.S[RS[3,          R,          R/S[RS[3,          R,          R0S[RS[3,          R,          R1S[RS[3,          R,          R2S[RS[3,          R,          R3S[RS[3,          R,          R4S[S[S[ S[.R3,          ,          R5S[S[S[ .R3,          ,          R6S[R,          R7S[S[ S[3,          R,          R8S[ R,          R9S[S[ S[3,          R,          R:S[S[S[ S[3,          ,          R,          R;S[ R,          R<S[ R,          R=S[ R,          R>S[ R,          R?S[ R,          R@S[ R,          RAS[ R,          RBS[ R,          RCS[ R,          RDS[RES[RFS[RGS[RHS[ R,          RIS[	RJS[S[,          RKS[S[ S[3,          R,          RLS[RMS[RNS[ROS[RPS[RQS[ R,          RRS[S[ S[3,          R,          RSS[ R,          RTS[RUS[S[RS[3,          ,          /S# )Vr   rÒ   NÚapi_keyÚproviderÚapi_modeÚacp_commandÚacp_argsÚcommandry   Ú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Útheme_callbackÚsetup_beat_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+   r2   r8   r3   r,   r-   r/   r5   Úgateway_session_keyÚskip_context_filesÚload_soul_identityÚskip_memoryÚskip_background_reviewÚparent_session_idÚiteration_budgetÚ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_agentÚtool_result_metadata_callback)
r   rŸ   rŠ   Úfloatr�   r   r   r   r‘   rF   )r   r·   s   "€r   r   rÍ   ì   s:  ø€ ÷ 4(ñ 4(á˜•*ð4(á.1°D­jð4(áKNÐQUÍ:ð4(áhkÐnrÕhrð4(ñ ˜4•Zð4(ñ 37±sµ)¸dÕ2Bð4(ñ UXÐZ^ÕT^ð4(ñ nrÑruÕmvÐy}Õm}ð4(ñ ð	4(ñ
 ð4(ñ ˜D•Lð4(ñ ™s�) dÕ*ð4(ñ GKÉ3ÅiÐRVÕFVð4(ñ  ð4(ñ ;?ð4(ñ UYð4(ñ  ð4(ñ CFÈÅ*ð4(ñ ð4(ñ 25ð4(ñ  ¡�9 tÕ+ð4(ñ HLÉCÅyÐSWÕGWð4(ñ rvÑvyÕqzð  ~Bõ  rBð4(ñ ˜T•zð4(ñ HLð4(ñ psÐuyÕoyð4(ñ &.©e¥_ð4(ñ ˜$•Jð4(ñ !)¨©c¨Õ 2°TÕ 9ð4(ñ X`Ð`cÑehÐ`hÕWiÐlpÕWpð4(ñ  !)¨©c¨Õ 2°TÕ 9ð!4(ñ  V^Ð^aÑcfÐ^fÕUgÐjnÕUnð!4(ñ" % S©# XÕ.°Õ5ð#4(ñ" QYÐY\Ñ^aÐYaÕPbÐeiÕPið#4(ñ$ !)¨©c¨Õ 2°TÕ 9ð%4(ñ$ ZbÐbeÑgjÐbjÕYkÐnrÕYrð%4(ñ& !)¨©c¨Õ 2°TÕ 9ð'4(ñ& _gÐgjÑloÐgoÕ^pÐswÕ^wð'4(ñ( & c©3 hÕ/°$Õ6ð)4(ñ( OWÐWZÑ\_ÐW_ÕN`ÐcgÕNgð)4(ñ* ! ¡c Õ*¨TÕ1ð+4(ñ, & c©3 hÕ/°$Õ6ð-4(ñ.   ¡S Õ)¨DÕ0ð/4(ñ0  (¨©S¨Õ1°DÕ8ð14(ñ0 ^fÐfiÑknÐfnÕ]oÐrvÕ]vð14(ñ2 $ C© HÕ-°Õ4ð34(ñ2 OWÐWZÑ\_ÐW_ÕN`ÐcgÕNgð34(ñ4 " #¡s (Õ+¨dÕ2ð54(ñ4 S[Ð[^Ñ`cÐ[cÕRdÐgkÕRkð54(ñ6 !¡©3±¨+°tÐ*;Õ!<Õ=ð74(ñ8 $¡H©c¨U°D¨[Õ$9Õ:ð94(ñ: ˜$•Jð;4(ñ: :>¹cÁ3¸h½È$Õ9Nð;4(ñ: fiÐkoÕeoð;4(ñ<  ¡¡S �>¨DÕ0ð=4(ñ< LPÑPTÑUXÑZ]ÐU]ÕP^ÕK_ÐbfÕKfð=4(ñ> ˜•*ð?4(ñ> /2°D­jð?4(ñ> ORÐTXÍjð?4(ñ> mpÐrvÕlvð?4(ñ@ �t•ðA4(ñ@ 03°T­zðA4(ñ@ NQÐSWÍZðA4(ñ@ loÐquÕkuðA4(ñB ! 4�ZðC4(ñD !ðE4(ñD ?CðE4(ñF ðG4(ñF <@ðG4(ñH -0°$­JðI4(ñJ *ðK4(ñJ GOÉuÅoðK4(ñL ™S¡#˜X�¨Õ-ðM4(ñN "ðO4(ñN FIðO4(ñP '*ðQ4(ñP ORðQ4(ñR ðS4(ñR <?À½:ðS4(ñT ™3¡˜9•o¨Õ,ðU4(ñT ;>À½*ðU4(ñV ðW4(ñX (0±¸¹d¸Õ0CÕ'DñY4(r   cW                óÞ   € \        4       P                  4        UWUXu/ uF  w  pWpXVWR9  g   K  XWXXbK  	  pYpWpXVe   \        P                  ! R\        ^R7       ^ RIHpZ VZ! V 3/ XYB  R# u upXpWi )ub   Forwarder â€” see ``agent.agent_init.init_agent`` (same keyword parameters, minus ``tool_delay``).Nz_tool_delay is deprecated and ignored; sequential tool calls no longer sleep between executions.)Ú
stacklevel)Ú
init_agent)r¿   rã   )ÚlocalsÚitemsÚwarningsÚwarnÚDeprecationWarningÚagent.agent_initr&  )[r¿   rÒ   rÛ   rÜ   rÝ   rÞ   rß   rà   ry   rá   râ   rã   rä   rå   ræ   rç   rè   ré   rê   rë   rì   rí   rî   rï   rð   rñ   rò   ró   rš   rô   rõ   rö   r÷   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r+   r2   r8   r3   r,   r-   r/   r5   r  r  r  r  r  Ú
session_dbr  r  r  r  Úcredential_poolr  r  r  r  r  r  r  r   r!  Úmemory_managerr"  ÚkÚvÚinit_kwargsr&  s[   &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&    r   r½   ÚAIAgent.__init__ì   sk   € ô^ )/«¯©Ô(8Ô\Ñ(8¡  1¸AÐE[Ñ<[”t�q˜!’tÑ(8ˆÑ\ØÒ!Ü�MŠMð @ÜASÐ`aõcå/Ù�4Ñ'˜;Ô'ùó ]s
   œA)­A)c                óþ   € \        V RR4      '       d   R# V P                  e   V P                  #  ^ RIHp V! 4       V n        RV n        V P                  #   \
         d    \        P                  RRR7        R# i ; i)zŒSessionDB for recall, opening the default state DB when no ``session_db`` was passed so the
advertised ``session_search`` tool stays usable.Ú_persist_disabledFN)ÚacquireTz SessionDB unavailable for recall©Úexc_info)r>   Ú_session_dbÚhermes_state_registryr6  Ú_owns_session_dbr@   r‚   rƒ   )r¿   r6  s   & r   Ú_get_session_db_for_recallÚ"AIAgent._get_session_db_for_recall"  sx   € ô
 �4Ð,¨e×4Ò4ÙØ×ÑÒ'Ø×#Ñ#Ð#ð	Ý5á&›yˆDÔØ$(ˆDÔ!Ø×#Ñ#Ð#øÜô 	Ü�L‰LÐ;ÀdˆLÔKÚð	ús   ±$A Á"A<Á;A<c                ó    <€ V ^8„  d   QhRS[ /# r¨   )r   )r   r·   s   "€r   r   rÍ   5  s   ø€ ÷ Sñ S©3ñ Sr   c                óH   € ^ RI Hp V! V P                  V P                  4      # )z—``model_config`` for the lazily created session row: the init config plus a live /yolo toggled
before the first turn (``hermes --resume`` restores it).)Úwith_session_yolo)Útools.approval_yolor@  Ú_session_init_model_configrš   )r¿   r@  s   & r   Ú_session_row_model_configÚ!AIAgent._session_row_model_config5  s   € õ 	:Ù  ×!@Ñ!@À$Ç/Á/ÓRÐRr   c                ó   <€ V ^8„  d   QhRR/# ©r   r   N© )r   r·   s   "€r   r   rÍ   ;  s   ø€ ÷ !Wñ !W Dñ !Wr   c                óâ  € \        V RR4      '       g%   V P                  '       g   V P                  '       g   R# \        V P                  4      p  ^ RIHp V! 4       pV P                  P                  V P                  YP                  V P                  4       V P                  \        V RR4      \        V RR4      \        V RR4      \        V RR4      \        V R	R4      \        V R
R4      ;'       g    \        V RR4      \        V 4      V P                  \        V4      VR7       RV n        R#   \         d    Rp Lài ; i  \         d"   p\         P#                  RT4        Rp?R# Rp?ii ; i)zYCreate the session DB row on first use; a transient failure leaves it to retry next turn.r5  FNr:   r*   r)   r(   r0   r6   r.   r4   )rš   r   rá   Úmodel_configÚsystem_promptr2   rC   r,   r/   r5   Údisplay_nameÚorigin_jsonr  r   Úprofile_nameTz5Session DB creation failed (will retry next turn): %s)r>   Ú_session_db_createdr9  r   r+   r?   r;   r@   Úcreate_sessionrš   rá   rC  Ú_cached_system_promptrE   Ú_parent_session_idr"   r‚   Úwarning)r¿   r   r;   Úprofile_for_sessionÚes   &    r   Ú_ensure_db_sessionÚAIAgent._ensure_db_session;  sN  € ä�4Ð,¨e×4Ò4¸×8P×8PÐ8PÐX\×Xh×XhÐXhÙÜ# D§M¡MÓ2ˆð	Wð	+ÝGÙ&=Ó&?Ð#ð ×Ñ×+Ñ+ØŸ?™?°6ÇÁØ!×;Ñ;Ó=ÈT×MgÑMgÜ  j°$Ó7ÄWÈTÐSiÐkoÓEpÜ  j°$Ó7Ä7È4ÐQ]Ð_cÓCdÜ! $¨°dÓ;Ü$ T¨<¸Ó>×cÐcÄ'È$ÐP\Ð^bÓBcÜ0°Ó6È$×JaÑJaÜ+¨FÓ3ÐBUð ,ô 	ð (,ˆDÖ$øô' ô +ð '+Ò#ð+ûô( ô 	Wä�N‰NÐRÐTU×VÒVûð	Wús7   ÁD/ ÁCE Ä/D?Ä<E Ä>D?Ä?E ÅE.ÅE)Å)E.Úold_session_idÚnew_session_idÚprevious_messagesÚcarry_over_contextÚreset_engineTc                ól   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RS[ S[,          RS[RS[RR/# )r   rW  rX  rY  rZ  r[  r   N)r   r   rŸ   r�   )r   r·   s   "€r   r   rÍ   ^  sT   ø€ ÷ kñ kÙ!)©#¥ðkÙGOÑPSÅ}ðká#¡D�>ðkáFJðkábfðkð 
ñ	kr   c               óÊ  € \        V RR4      pV'       g   R# V'       d   Ve   \        VRW4       V'       d   \        VR4       \        T;'       g    VRJ;'       g    T;'       g    T4      pT;'       g    \        V RR4      ;'       g    Rp	V'       dš   V	'       d’   \        VR4      '       d€   RVR	VR
\	        \        V R
R4      4      R\        V RR4      R\        VRR4      R\        V RR4      /VCp
V
P                  4        UUu/ uF  w  r¼VR9  g   K  W¼bK  	  p
pp\        VRV	3/ V
B  V'       d$   V'       d   V	'       d   \        VRW4       R# R# R# R# u uppi )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_startrW  rZ  r+   rá   Úcontext_lengthÚconversation_idr)   Úcarry_over_new_session_context)Nr   )r>   r…   r�   r�   r   r(  )r¿   rW  rX  rY  rZ  r[  Úextra_contextr}   Úshould_startÚtarget_session_idÚstart_contextr0  r1  s   &$$$$$,      r   Ú"_transition_context_engine_sessionÚ*AIAgent._transition_context_engine_session^  sa  € ô ˜Ð3°TÓ:ˆßÙßÐ/Ò;Ü˜fÐ&6¸ÔZßÜ˜fÐ&8Ô9ä˜N×rÐrÐ.?ÀtÐ.K×rÐrÐOa×rÐrÐerÓsˆØ*×SÐS¬g°d¸LÈ"Ó.M×SÐSÐQSÐß×-´'¸&ÐBT×2UÒ2Uà  .Ð2FÐHZØÔ.¬w°t¸ZÈÓ/NÓOØœ  w°Ó3Ð5EÄwÈvÐWgÐimÓGnØ!¤7¨4Ð1GÈÓ#Nð	ð S`ð	ˆMð /<×.AÑ.AÔ.CÔ[Ñ.C¡d aÀqÐPZÑGZœT˜QšTÑ.CˆMÑ[Ü˜fÐ&8Ð:KÑ]È}Ò]ß§.×5FÜ˜fÐ&FÈÖjñ 6G¡.Ñùó \s   ÄEÄEc                óL   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          RS[/# )r   rY  rW  rZ  )r   rŸ   r   r�   )r   r·   s   "€r   r   rÍ   {  s3   ø€ ÷ /Xñ /X±X¹dµ^ð /XÑ\dÑehÕ\ið /XÙ04ñ/Xr   c                óN  € R F  p\        W^ 4       K  	  RV n        RV n        RV n        RV n        RV n        RV n        ^ V n        RV n        RV n	        RV n
        V P                  V\        V RR4      WRR7       \        V R	R4      p\        V RR
4      ;'       g    R
pVeS   \        VR4      '       d?   V'       d5   V\        VRR
4      8w  d!    VP                  \        V RR4      V4       R# R# R# R# R#   \         d"   p\         P#                  RT4        Rp?R# Rp?ii ; i)zì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.
g        ÚunknownÚnoneNFrš   T)rW  rX  rY  rZ  r[  r¡   r   Úbind_session_stateÚ_session_idr9  z2context engine bind_session_state during reset: %s)	Ú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_calls)Ú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_turnrg  r>   r�   rm  r@   r‚   rƒ   )r¿   rY  rW  rZ  Úcounterr}   re  r„   s   &&&&    r   Úreset_session_stateÚAIAgent.reset_session_state{  sC  € ó
ˆGô
 �D 1Ö%ñ
ð +.ˆÔ'Ø#,ˆÔ Ø#)ˆÔ ð "ˆÔØ'+ˆÔ$ð +/ˆÔ'ð !"ˆÔà/4ˆÔ,à ˆÔà',ˆÔ$à×/Ñ/Ø)¼'À$ÈÐVZÓ:[Ø/Ðeið 	0ô 	
ô ˜Ð3°TÓ:ˆÜ# D¨,¸Ó;×AÐA¸rÐØÒ¤7¨6Ð3G×#HÒ#H×M^Ø%¬°¸ÈÓ)KÔKðXØ×)Ñ)¬'°$¸ÀtÓ*LÐN_Ö`ñ Lñ N_Ñ#HÑøô ô XÜ—‘ÐQÐSV×WÒWûðXús   ÃC8 Ã8D$ÄDÄD$c                óL   <€ V ^8„  d   QhRS[ S[,          RS[RS[ S[,          /# )r   Úconfig_context_lengthÚruntime_context_lengthr   ©r   rŠ   r   )r   r·   s   "€r   r   rÍ   ­  s.   ø€ ÷ 
<ñ 
<Á(É3Å-ð 
<Ñilð 
<ÑqyÑz}Õq~ñ 
<r   c                óö   € \        V 4      p\        \        VRV4      4      p\        \        VRR4      4      '       g!   \        \        VRR4      4      '       d   Vf   R# Ve   Ve   \        W24      # Ve   V# T# )zGReturn a safe context budget from explicit intent and verified runtime.r`  ÚrejectedFÚload_attemptedN)rŽ   r>   r�   Úmin)r‡  rˆ  ÚexplicitÚruntimes   &&  r   Ú"_effective_lmstudio_context_lengthÚ*AIAgent._effective_lmstudio_context_length¬  s}   € ô !Ð!6Ó7ˆÜ¤Ð(>Ð@PÐRhÓ iÓjˆÜ”Ð.°
¸EÓB×CÒCÜ”Ð/Ð1AÀ5ÓI×JÒJÈwÊáØÒ 8Ò#7Ü�wÓ)Ð)Ø!Ò-ˆwÐ;°8Ð;r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úload_resultr   ©r   r�   )r   r·   s   "€r   r   rÍ   º  s   ø€ ÷ 
ñ 
±3ð 
¹4ñ 
r   c                ó˜   € \        \        V RR4      4      ;'       g.    \        \        V RR4      4      ;'       d    \        V RR4      RJ # )z@Return true when a management load was rejected or unverifiable.r‹  FrŒ  r`  N©r�   r>   )r“  s   &r   Ú_lmstudio_load_was_unverifiedÚ%AIAgent._lmstudio_load_was_unverified¹  sO   € ô ”G˜K¨°UÓ;Ó<÷ 
ð 
Ü”˜Ð&6¸Ó>Ó?×xÐxÄGÈKÐYiÐkoÓDpÐtxÐDxð	
r   c                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# )r   r‡  r   r‰  )r   r·   s   "€r   r   rÍ   À  s    ø€ ÷ 
ñ 
ÁXÉcÅ]ð 
Ñ^añ 
r   c           	     ó˜  € V P                   ;'       g    RP                  4       P                  4       R8w  d   R# \        V RR4      ;'       g    RP                  4       P                  4       R8X  d   \        P                  R4       R# ^ RIHp Vf   \        V R	R4      pV! V P                  V P                  \        V R
R4      VRR7      # )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=jit)Úensure_lmstudio_model_loadedÚ_config_context_lengthrÛ   T)Úreturn_load_result)
rÜ   r   r   r>   r‚   rƒ   Úhermes_cli.models_localrž  rá   rÒ   )r¿   r‡  rž  s   && r   Ú_ensure_lmstudio_runtime_loadedÚ'AIAgent._ensure_lmstudio_runtime_loadedÀ  s¬   € à�M‰M×Ð˜R×&Ñ&Ó(×.Ñ.Ó0°JÔ>ÙÜ�DÐ.°
Ó;×IÐ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_modelÚkeep_replayc                óx   <€ V ^8„  d   QhRS[ S[S[S[S[3,          ,          ,          RS[RS[S[S[3,          /# )r   rž   r¥  r   )r   rŸ   r‘   r   r   r�   rŠ   )r   r·   s   "€r   r   rÍ   Ñ  sD   ø€ ÷ Hñ HÙ ¡¡d©3±¨8¥nÕ!5Õ6ðHÙOSðHá	‰c‘3ˆh�ñHr   c               ón  € ^ ;r4\        V\        4      '       d   TM.  F€  p\        V\        4      '       d   VP                  R4      R8w  d   K1  VP	                  RR4      p\        V\        4      '       g   K[  V'       g   Ke  V^,          pV\        V4      ,          pK‚  	  V'       g   RV n        RVRV/# )zÐOn HTTP 400 ``invalid_encrypted_content``: pop ``codex_reasoning_items`` from every assistant
message and, unless ``keep_replay``, disable Responses reasoning replay. Returns
``{"messages", "items"}`` counts.ÚroleÚ	assistantÚcodex_reasoning_itemsNFrž   r(  )rŒ   rŸ   r‘   r   Úpopr¬   Ú_codex_reasoning_replay_enabled)r¿   rž   r¥  Ústripped_messagesÚstripped_itemsÚmsgr(  s   &&$    r   Ú_disable_codex_reasoning_replayÚ'AIAgent._disable_codex_reasoning_replayÑ  s    € ð ./Ð.ÐÜ *¨8´T× :Ò :‘HÀÒBˆCÜ˜c¤4×(Ò(¨C¯G©G°F«O¸{Ô,JÙØ—G‘GÐ3°TÓ:ˆEÜ˜%¤×&Ô&¯5©5Ø! QÕ&Ð!Ø¤# e£*Õ,’ñ C÷ Ø38ˆDÔ0ØÐ-¨w¸ÐGÐGr   zagent.stream_diagÚstream_diag_initÚstream_diag_capture_responseÚflatten_exception_chainc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   rº   r   )ÚBaseExceptionr�   )r   r·   s   "€r   r   rÍ   ç  s   ø€ ÷ qñ q±]ð qÁtñ qr   c                óH   € \        V RR4      R8H  ;'       d    \        V4      # )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_messages)r>   rY   )r¿   rº   s   &&r   Ú_is_provider_stream_parse_errorÚ'AIAgent._is_provider_stream_parse_errorç  s(   € ô �t˜Z¨Ó.Ð2FÑF×pÐpÔKiÐjoÓKpÐpr   Úlog_stream_retryÚemit_stream_dropc                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   Útaskr„   r   N)r   r¶  )r   r·   s   "€r   r   rÍ   ï  s'   ø€ ÷ 	Eñ 	E©Cð 	E±mð 	EÈñ 	Er   c                óH  €  V P                  V4      pT;'       g    VP                  P                  P                  4       p\        V4      ^Ü8”  d   VR,          P                  4       R,           pV P                  RV RV 24       R#   \         d    \        T4      p L�i ; i)z4Surface a compact warning for failed auxiliary work.:NéÙ   Nz...u   âš  Auxiliary z	 failed: N)	Ú_summarize_api_errorr@   r   rÀ   rÂ   r   r¬   ÚrstripÚ_emit_warning)r¿   r¾  r„   Údetails   &&& r   Ú_emit_auxiliary_failureÚAIAgent._emit_auxiliary_failureï  s‘   € ð	Ø×.Ñ.¨sÓ3ˆFð ×2Ð2˜CŸM™M×2Ñ2×9Ñ9Ó;ˆÜˆv‹;˜ÔØ˜D•\×(Ñ(Ó*¨UÕ2ˆFØ×Ñ˜^¨D¨6°¸6¸(ÐCÖDøô ô 	Ü˜“XŠFð	ús   ‚B ÂB!Â B!c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r¨   ©r‘   r   )r   r·   s   "€r   r   rÍ   ú  s   ø€ ÷ 
ñ 
¡t©C±¨H¥~ñ 
r   c           	     óZ   € R Uu/ uF  pT\        WR4      ;'       g    RbK  	  up# u upi )zBReturn the live main runtime for session-scoped auxiliary routing.r   )rá   rÜ   rÒ   rÛ   rÝ   Ú	auth_moderš   ©r>   )r¿   Úkeys   & r   Ú_current_main_runtimeÚAIAgent._current_main_runtimeú  s>   € ñ kó
áj�ð ”˜ BÓ'×-Ð-¨2Ò-Ùjñ
ð 	
ùò 
s   …(ž(zagent.conversation_compressionÚ#check_compression_model_feasibilityÚreplay_compression_warningc                ó6   <€ V ^8„  d   QhRS[ S[,          RS[/# )r   rÒ   r   r&   )r   r·   s   "€r   r   rÍ     s#   ø€ ÷ rñ r¡h©s¥mð r¹ñ rr   c                óv   € Ve   \        V4      # \        V RR4      ;'       g    \        \        V RR4      4      # )zCHostname of ``base_url``, or of the agent's own base URL when None.r×   r   rÖ   )rs   r>   ©r¿   rÒ   s   &&r   Ú_hostname_forÚAIAgent._hostname_for  s=   € àÒÜ$ XÓ.Ð.Ü�tÐ1°2Ó6×qÐqÔ:KÌGÐTXÐZkÐmoÓLpÓ:qÐqr   c                ó4   <€ V ^8„  d   QhRS[ R,          RS[/# ©r   rÒ   Nr   ©r   r�   )r   r·   s   "€r   r   rÍ   
  s#   ø€ ÷ @ñ @©c°D­jð @ÁDñ @r   c                ó*   € V P                  V4      R8H  # )z8Return True when a base URL targets OpenAI's native API.zapi.openai.com)rÔ  rÓ  s   &&r   Ú_is_direct_openai_urlÚAIAgent._is_direct_openai_url
  s   € à×!Ñ! (Ó+Ð/?Ñ?Ð?r   c                ó4   <€ V ^8„  d   QhRS[ R,          RS[/# r×  rØ  )r   r·   s   "€r   r   rÍ     s   ø€ ÷ >ñ >©S°4­Zð >Á4ñ >r   c                ó‚   € Ve   \        V4      P                  4       M\        V RR4      ;'       g    Rp\        VR4      # )zZTrue when a base URL targets Azure OpenAI (standard client, but NO Responses API support).rÖ   r   zopenai.azure.com)r   r   r>   rr   )r¿   rÒ   Úurls   && r   Ú_is_azure_openai_urlÚAIAgent._is_azure_openai_url  s=   € à'/Ò';Œc�(‹m×!Ñ!Ô#Ä'È$ÐPaÐceÓBf×BlÐBlÐjlˆÜ$ SÐ*<Ó=Ð=r   c                ó4   <€ V ^8„  d   QhRS[ R,          RS[/# r×  rØ  )r   r·   s   "€r   r   rÍ     s#   ø€ ÷ sñ s©s°T­zð sÁTñ sr   c                ó†   € V P                  V4      p\        V4      ;'       d    VR8H  ;'       g    VP                  R4      # )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_urlÚAIAgent._is_github_copilot_url  s>   € à×%Ñ% hÓ/ˆÜ�H‹~×rÐr 8Ð/FÑ#F×#qÐ#qÈ(×J[ÑJ[Ð\pÓJqÐrr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   )r#  )r   r·   s   "€r   r   rÍ     s   ø€ ÷ Sñ S©Eñ Sr   c                óf   € \        V P                  V P                  4      pVe   V# \        RR4      # )z€Per-call request timeout: per-model ``timeout_seconds`` > provider ``request_timeout_seconds`` >
``HERMES_API_TIMEOUT`` > 1800s.ÚHERMES_API_TIMEOUTg      œ@)rH   rÜ   rá   rt   )r¿   Úcfgs   & r   Ú_resolved_api_call_timeoutÚ"AIAgent._resolved_api_call_timeout  s/   € ô +¨4¯=©=¸$¿*¹*ÓEˆØ’oˆsÐR¬9Ð5IÈ6Ó+RÐRr   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# r¨   )Útupler#  r�   )r   r·   s   "€r   r   rÍ     s   ø€ ÷ ñ ±u¹UÁD¸[Õ7Iñ r   c                óä   € \        V P                  V P                  4      pVe   VR3# \        P                  ! R4      pVe   \        V4      R3# ^ RIHp V! V P                  4      pVe   VR3# R# )a3  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_TIMEOUT)Ú!get_reasoning_stale_timeout_floor)g     €V@T)rI   rÜ   rá   r   Úgetenvr#  Úagent.reasoning_timeoutsrò  )r¿   rë  Úenv_timeoutrò  Úreasoning_floors   &    r   Ú%_resolved_api_call_stale_timeout_baseÚ-AIAgent._resolved_api_call_stale_timeout_base  sw   € ô )¨¯©¸¿
¹
ÓCˆØŠ?Ø˜�:ÐÜ—i’iÐ ?Ó@ˆØÒ"Ü˜Ó% uÐ,Ð,õ 	OÙ;¸D¿J¹JÓGˆØÒ&Ø" EÐ)Ð)ØÐr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   Úapi_payloadr   )r   r#  )r   r·   s   "€r   r   rÍ   3  s   ø€ ÷ ñ ¹Sð ÁUñ r   c                ó  € V P                  4       w  r#\        V RR4      ;'       g    V P                  ;'       g    RpV'       d%   V'       d   \        V4      '       d   \	        R4      # ^ RIHpHpHp ^ RI	H
p V! V4      p	V	R8”  d   \        VR4      MV	R	8”  d   \        VR
4      MTp
V P                  4       pV P                  R8X  d   V'       g   \        W¥! V 4      4      p
V'       g   W¨! V4      ,          p
V'       g	   V! W
4      p
V
# )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   Úinf)Ú_high_effort_silence_floorÚcap_to_run_budgetÚestimate_request_context_tokens)Úlong_decode_stale_multiplieri † g      n@iPÃ  g     Àb@Úcodex_responses)r÷  r>   rÒ   rf   r#  Úagent.chat_completion_helpersrý  rþ  rÿ  Úagent.gemini_long_decoder   ÚmaxÚ_stale_timeout_is_explicitrÝ   )r¿   rú  Ú
stale_baseÚuses_implicit_defaultrÒ   rý  rþ  rÿ  r   Ú
est_tokensÚtimeoutrŽ  s   &&          r   Ú!_compute_non_stream_stale_timeoutÚ)AIAgent._compute_non_stream_stale_timeout3  sï   € ð -1×,VÑ,VÓ,XÑ)ˆ
Ü˜4 ¨dÓ3×JÐJ°t·}±}×JÐJÈˆß §XÔ2CÀH×2MÒ2MÜ˜“<Ð÷ 	Añ  	AÝIÙ4°[ÓAˆ
Ø,6¸Ô,@”#�j %Ô(Ð`jÐmsÔ`sÄcÈ*ÐV[ÔF\ð  zDˆØ×2Ñ2Ó4ˆð �=‰=Ð-Ô-·hÜ˜'Ð#=¸dÓ#CÓDˆGßØÐ3°KÓ@Õ@ˆG÷ Ù'¨Ó6ˆGØˆr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   L  s   ø€ ÷ Kñ K©Dñ Kr   c                ó†   € \        V P                  V P                  4      RJ;'       g    \        P                  ! R4      RJ# )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ñ  )rI   rÜ   rá   r   ró  rÑ   s   &r   r  Ú"AIAgent._stale_timeout_is_explicitL  s?   € ô +¨4¯=©=¸$¿*¹*ÓEÈTÐQ÷ Jð JÜ—9’9Ð<Ó=ÀTÐIð	Kr   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# ©r   rá   r   r&   )r   r·   s   "€r   r   rÍ   R  s#   ø€ ÷ 
ñ 
©X±c­]ð 
ÁhÉsÅmñ 
r   c                ó  € V P                   R8w  d   R# ^ RIHp V! V 4      P                  '       g   R# Ve   TMV P                  ;'       g    Rp\
        P                  ! RVP                  4       4      '       g   R# RV: R2# )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  N)Ú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_hintÚAIAgent._codex_silent_hang_hintR  sv   € ð �=‰=Ð-Ô-ÙÝJá'¨Ó-×>×>Ð>ÙØ#Ò/‘U°T·Z±Z×FÐFÀBˆ	ä�yŠyÐ;¸Y¿_¹_Ó=N×OÒOÙà=¸i¹]ð K:ð :ð		
r   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   j  s   ø€ ÷ Lñ L¡Dñ Lr   c                ó.   € \        V P                  R4      # )z1Return True when the base URL targets OpenRouter.zopenrouter.ai©rr   rÖ   rÑ   s   &r   Ú_is_openrouter_urlÚAIAgent._is_openrouter_urlj  s   € ä$ T×%9Ñ%9¸?ÓKÐKr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   n  s   ø€ ÷ zñ z¡ñ zr   c                óx   a € \         ;QJ d    V 3R lR 4       F  '       g   K   R# 	  R# ! V 3R lR 4       4      # )zFReturn True when the base URL targets GitHub Copilot or GitHub Models.c              3   óP   <"  € T F  p\        SP                  V4      x € K  	  R # 5irÏ   r  )Ú.0Úhr¿   s   & €r   Ú	<genexpr>Ú*AIAgent._is_copilot_url.<locals>.<genexpr>p  s$   øé € ÐyÑKxÀaÔ(¨×)=Ñ)=¸q×AÐAÓKxùs   ƒ#&TF)rã  zmodels.github.ai)ÚanyrÑ   s   fr   Ú_is_copilot_urlÚAIAgent._is_copilot_urln  s.   ø€ ç‹sÔyÑKxÓy�sŒsÐyŠsÐyˆsÔyÑKxÓyÓyÐyr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   r  s   ø€ ÷ zñ z¡dñ zr   c                óœ   € V P                   ;'       g    RP                  4       P                  4       R9   ;'       g    V P                  4       # )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_providerÚAIAgent._is_copilot_providerr  s@   € ð —‘×#Ð# ×*Ñ*Ó,×2Ñ2Ó4Ð8_Ñ_×yÐyÐcg×cwÑcwÓcyÐyr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   w  s   ø€ ÷ Zñ Z¡4ñ Zr   c                ó–   € \        V RR4      R8H  ;'       d3    \        V RR4      R8H  ;'       d    R\        V RR4      ;'       g    R9   # )	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_backendÚAIAgent._is_codex_backendw  s_   € ä˜˜j¨$Ó/Ð3DÑD÷ Yð YÜ˜DÐ"6¸Ó;¸}ÑL÷Yð Yà(¬W°TÐ;LÈbÓ-Q×-WÐ-WÐUWÑXð	Zr   Úanthropic_prompt_cache_policyÚ._direct_native_anthropic_tool_cache_capabilityc                ó&   <€ V ^8„  d   QhRS[ RS[/# r  rØ  )r   r·   s   "€r   r   rÍ   �  s   ø€ ÷ Dñ D©Sð D±Tñ Dr   c                ón   € V P                  4       P                  R^4      R,          P                  R4      # )zmTrue for GPT-5.x, which OpenAI and OpenRouter reject on /v1/chat/completions
(``unsupported_api_for_model``).Ú/zgpt-5éÿÿÿÿ)r   ÚrsplitÚ
startswith)rá   s   &r   Ú_model_requires_responses_apiÚ%AIAgent._model_requires_responses_api€  s-   € ð �{‰{‹}×#Ñ# C¨Ó+¨BÕ/×:Ñ:¸7ÓCÐCr   rÜ   c                ó<   <€ V ^8„  d   QhRS[ RS[S[ ,          RS[/# )r   rá   rÜ   r   )r   r   r�   )r   r·   s   "€r   r   rÍ   ‡  s(   ø€ ÷ <ñ <±cð <ÉÑQTÍð <Ñaeñ <r   c               ó0  € ^ RI Hp T;'       g    RP                  4       P                  4       pVR9   g   V! V4      '       d   R# ^ RIHp V! V4      '       d   R# VR8X  d    ^ RIHp V! V 4      # \        P                  V 4      #   \         d     L"i ; i)zCReturn True when this provider/model pair should use Responses API.)Úis_actual_router   F)Ú_is_external_process_providerr,  )Ú!_should_use_copilot_responses_api)ÚnousÚcustom)Úhermes_cli.providersr@  r   r   Ú$hermes_cli.runtime_provider_backendsrA  Úhermes_cli.modelsrB  r@   r%   r<  )rá   rÜ   r@  Únormalized_providerrA  rB  s   &$    r   Ú&_provider_model_requires_responses_apiÚ.AIAgent._provider_model_requires_responses_api†  s”   € õ 	9Ø'Ÿ~˜~¨2×4Ñ4Ó6×<Ñ<Ó>Ðð Ð"4Ô4¹È×8QÒ8QÙõ
 	WÙ(Ð)<×=Ò=ÙØ )Ô+ðÝOÙ8¸Ó?Ð?ô ×4Ñ4°UÓ;Ð;øô ô Ùðús   Á$B ÂBÂBc                ó&   <€ V ^8„  d   QhRS[ RS[/# r‡   )rŠ   r‘   )r   r·   s   "€r   r   rÍ   ž  s   ø€ ÷ %ñ %¡sð %©tñ %r   c                óÌ   € V P                  4       '       gH   V P                  4       '       g2   V P                  4       '       g   \        V P                  4      '       d   RV/# RV/# )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æ  ru   rá   rØ   s   &&r   Ú_max_tokens_paramÚAIAgent._max_tokens_paramž  sT   € ð ×&Ñ&×(Ò(¨D×,EÑ,E×,GÒ,GÈ4×KfÑKf×KhÒKhÜ5°d·j±j×AÒAØ+¨UÐ3Ð3Ø˜eÐ$Ð$r   c                ó6   <€ V ^8„  d   QhRS[ RS[S[,          /# )r   Ú
api_kwargsr   r‰   )r   r·   s   "€r   r   rÍ   §  s   ø€ ÷ ñ ¹#ð Á(É3Å-ñ r   c                óÄ   € \        V \        4      '       g   R# R F)  p \        V P                  V4      4      pT^ 8”  g   K'  Tu # 	  R#   \        \
        3 d     KC  i ; i)z@Extract the outgoing response token cap from a prepared request.N)Úmax_output_tokensrM  r  )rŒ   r‘   rŠ   r   Ú	TypeErrorÚ
ValueError)rQ  rÌ  rˆ   s   &  r   Ú%_requested_output_cap_from_api_kwargsÚ-AIAgent._requested_output_cap_from_api_kwargs¦  sc   € ô ˜*¤d×+Ò+ÙÛOˆCðÜ˜JŸN™N¨3Ó/Ó0�ð �qŽyØ’ñ Pñ øô	 œzÐ*ô Úðús   ŸA
Á
AÁAc                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   Úcontentr   rØ  )r   r·   s   "€r   r   rÍ   ´  s   ø€ ÷ Qñ Q±cð Q¹dñ Qr   c                óx   € \        V4      ;'       d)    \        V P                  V4      P                  4       4      # )z[True when text remains after stripping reasoning blocks (reasoning-only output is retried).)r�   Ú_strip_think_blocksr   )r¿   rZ  s   &&r   Ú_has_content_after_think_blockÚ&AIAgent._has_content_after_think_block´  s-   € ä�G‹}×PÐP¤ d×&>Ñ&>¸wÓ&G×&MÑ&MÓ&OÓ!PÐPr   Ústrip_think_blocksc                ó&   <€ V ^8„  d   QhRS[ RS[/# rY  rØ  )r   r·   s   "€r   r   rÍ   »  s   ø€ ÷ tñ t©cð t±dñ tr   c                óÄ   € T ;'       g    RP                  4       pV'       g   R# VR,          pVP                  R4      ;'       g    VR9   ;'       g    \        V4      R8¬  # )zCHeuristic: does visible assistant text look intentionally finished?r   Fz```u%   .!?:)"']}ã€‚ï¼�ï¼Ÿï¼šï¼‰ã€‘ã€�ã€�ã€‹^i ó r9  )rÂ  rä  Úord)rZ  ÚstrippedÚlasts   &  r   Ú_has_natural_response_endingÚ$AIAgent._has_natural_response_endingº  s[   € ð —M�M˜r×)Ñ)Ó+ˆßÙØ˜�|ˆà× Ñ  Ó'×sÐs¨4Ð3[Ñ+[×sÐsÔ_bÐcgÓ_hÐlsÑ_sÐsr   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   Ä  s   ø€ ÷ *ñ *©ñ *r   c                ó  € V P                   ;'       g    RP                  4       pV P                  ;'       g    RP                  4       pRV9  d
   VR8w  d   R# V P                  pRV9   g   RV9   d   R# RV9   g   RV9   d   R	# VR8H  # )
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_backendÚAIAgent._is_ollama_glm_backendÄ  s„   € ð —z‘z×'Ð' R×.Ñ.Ó0ˆØŸ-™-×-Ð-¨2×4Ñ4Ó6ˆØ˜Ô#¨¸%Ô(?ÙØ×#Ñ#ˆà˜4Ô 8¨{Ô#:ÙØ�tÔ˜x¨4Ô/ÙØ Ñ)Ð)r   c                ó<   <€ V ^8„  d   QhRS[ RS[S[,          RS[/# )r   Úfinish_reasonrž   r   )r   r   rŸ   r�   )r   r·   s   "€r   r   rÍ   Ý  s/   ø€ ÷ Cñ C¹Sð CÑ_gÑhlÕ_mð CÑy}ñ Cr   c                óF  € VR8w  g(   V P                   R8w  g   V P                  4       '       g   R# \        ;QJ d&    R T;'       g    .  4       F  '       g   K   RM	  RM! R T;'       g    .  4       4      '       g   R# Ve   \        VRR4      '       d   R# \        VRR4      p\	        V\
        4      '       g   R# V P                  V4      P                  4       p\        V4      ^8  g   \        P                  ! R	V4      '       g   R# V P                  V4      '       * # )
zIDetect conservative stop->length misreports for Ollama-hosted GLM models.ÚstopÚchat_completionsFc              3   óz   "  € T F1  p\        V\        4      ;'       d    VP                  R 4      R8H  x € K3  	  R# 5i)r¨  ÚtoolN©rŒ   r‘   r   )r"  r¯  s   & r   r$  Ú:AIAgent._should_treat_stop_as_truncated.<locals>.<genexpr>á  s1   é € ÐcÑSaÈ3”:˜c¤4Ó(×FÐF¨S¯W©W°V«_ÀÑ-FÔFÓSaùó   ‚;ž;TNÚ
tool_callsrZ  z\s)rÝ   ro  r&  r>   rŒ   r   r\  r   r¬   r  r  re  )r¿   rr  Úassistant_messagerž   rZ  Úvisible_texts   &&&&  r   Ú_should_treat_stop_as_truncatedÚ'AIAgent._should_treat_stop_as_truncatedÝ  së   € à˜FÔ" d§m¡mÐ7IÔ&IÐQU×QlÑQl×QnÒQnÙß‹sÑcÐS[×SaÐSaÐ_aÐSaÓc�s�sŠsÑcÐS[×SaÐSaÐ_aÐSaÓc×cÒcÙØÒ$¬Ð0AÀ<ÐQU×(VÒ(VÙÜÐ+¨Y¸Ó=ˆÜ˜'¤3×'Ò'ÙØ×/Ñ/°Ó8×>Ñ>Ó@ˆÜˆ|Ó˜rÔ!¬¯ª°5¸,×)GÒ)GÙØ×4Ñ4°\ÓBÔBÐBr   Ú!looks_like_codex_intermediate_ackÚextract_reasoningzagent.chat_completion_helpersÚcleanup_task_resources)Ú_MEMORY_REVIEW_PROMPTÚ_SKILL_REVIEW_PROMPTÚ_COMBINED_REVIEW_PROMPTzagent.background_reviewÚ#summarize_background_review_actionsc                ó\   <€ V ^8„  d   QhRS[ S[,          RS[RS[RS[S[,          RS[RR/# )r   Úmessages_snapshotÚreview_memoryÚreview_skillsÚfocusrŽ  r   N)rŸ   r‘   r�   r   r   )r   r·   s   "€r   r   rÍ   õ  sD   ø€ ÷ 4ñ 4¹$¹t½*ð 4ÑUYð 4Ù04ð4ÙEMÉcÅ]ð4Ùeið4Øvzñ4r   c           	     óP  € Vf   \        V R^ 4      ^ 8”  d   R# RpVf   ^ RIHp V! 4       w  r†V'       g   R# ^ RIHp	 \        V	! V4      W#WFVR7      p
Vf>   V'       g6   \        W4      '       d%   ^ RIHp VP                  V \        V 4      V
4       R# V P                  ! R/ V
B  R# )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_depth)Úload_background_review_settings)Ú!_clone_background_review_messages)rˆ  r‰  rŠ  r‹  r�   rŽ  ©ÚQUEUErG  )r>   Úagent.background_reviewrŽ  Úagent.turn_finalizerr�  r‘   r—   r–   r‘  Úenqueuerœ   Ú_spawn_background_review_now)r¿   rˆ  r‰  rŠ  r‹  rŽ  r�   rŽ  Úenabledr�  rz   r‘  s   &&&&&&      r   Ú_spawn_background_reviewÚ AIAgent._spawn_background_reviewõ  sž   € ð Š=œW TÐ+<¸aÓ@À1ÔDÙØˆØŠ=ÝOÙ ?Ó AÑˆGßÙõ 	KÜÑ(IÐJ[Ó(\Ø$1ÐV[Ø'ô)ˆð Š=§Ô.BÀ4×.RÒ.RÝ5Ø�M‰M˜$Ô 1°$Ó 7¸Ô@ÙØ×)Ò)Ñ3¨FÔ3r   c                óŽ   <€ V ^8„  d   QhRS[ S[,          RS[RS[RS[S[,          RS[S[S[S[3,          ,          RS[RS[RR	/# )
r   rˆ  r‰  rŠ  r‹  r�   Ú_requeue_attemptsrŽ  r   N)rŸ   r‘   r�   r   r   r   rŠ   )r   r·   s   "€r   r   rÍ     sh   ø€ ÷ &ñ &¹dÁ4½jð &ÑY]ð &Ù48ð&ÙIQÑRUÍð&á/7¹¹SÁ#¸X½Õ/Gð&ácfð&ñ 04ð&ð AEñ&r   c                ó.  a aaaaaaaaa€ ^ RI HpHp	Hp
 ^ RIHp V	! S 4      oSf   R#  V
! S SSSSSSSR7      w  opR VVVVVVVV VV3
R llp\        P                  ! V! V4      RRR	7      P                  4        R#   \         d    T! S S4       h i ; i)
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.
)Úfinish_background_review_runÚprepare_background_review_runÚspawn_background_review_thread)Úpropagate_context_to_threadN)r‰  rŠ  r‹  r�   Ú
review_runrŽ  c                ó   € V ^8„  d   QhRR/# rF  rG  )r   s   "r   r   Ú:AIAgent._spawn_background_review_now.<locals>.__annotate__/  s   € ÷ (ñ (¨$ñ (r   c                  óh   <
€ S! 4        SP                  S\        SSSSS	S ^,           SR7      4       R# )é   )rˆ  r‰  rŠ  r‹  r�   rš  rŽ  N)Ú_maybe_requeue_preempted_reviewr‘   )
rš  rŽ  r‹  rˆ  r‰  r   rŠ  r¿   Útargetr�   s
   €€€€€€€€€€r   Ú_target_with_requeueÚBAIAgent._spawn_background_review_now.<locals>._target_with_requeue/  s9   ø€ Ù”Ø×4Ñ4°ZÄØ&7À}ÐdqØ¨(ÐFWÐZ[ÕF[Ø%ôB'ö (r   Tz	bg-review)r¦  ÚdaemonÚname)
r’  rœ  r�  rž  Útools.thread_contextrŸ  Ú	threadingÚThreadÚstartr@   )r¿   rˆ  r‰  rŠ  r‹  r�   rš  rŽ  rœ  r�  rž  rŸ  Ú_promptr§  r   r¦  s   ffffffff      @@r   r•  Ú$AIAgent._spawn_background_review_now  s    ÿù€ ÷	
ñ 	
õ 	Eá2°4Ó8ˆ
ØÒÙð	Ù<ØÐ'°}ÐTaØ h¸:ÐPXô‰OˆF�G÷
(÷ (ñ (ô ×ÒÑ$?Ð@TÓ$UÐ^bÐitÔu×{Ñ{Ö}øÜô 	Ù(¨¨zÔ:Øð	ús   ªAA> Á>Bc                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   ?  s   ø€ ÷ Kñ KÀTñ Kr   c                óä  €  VP                   P                  4       '       d   VP                  R4      e   R# VP                  R^ 4      V P                  8”  d#   \        P                  RV P                  4       R# \        WP                  R4      4      '       g   R# ^ RIHp VP                  V \        V 4      \        V4      4       R#   \         d    \        P                  RRR	7        R# i ; i)
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.
r‹  Nrš  z5Preempted background review dropped after %d requeuesr�   r�  zPreempted-review requeue failedTr7  )Úcancel_requestedÚis_setr   Ú_REVIEW_REQUEUE_MAX_ATTEMPTSr‚   Úinfor—   r–   r‘  r”  rœ   r‘   r@   rƒ   )r¿   r   rz   r‘  s   &&& r   r¥  Ú'AIAgent._maybe_requeue_preempted_review?  s·   € ð	Kà×.Ñ.×5Ñ5×7Ò7¸6¿:¹:ÀgÓ;NÒ;ZÙØ�z‰zÐ-¨qÓ1°D×4UÑ4UÔUÜ—‘ÐSÐUY×UvÑUvÔwÙÜ'¨¯j©j¸Ó.D×EÒEÙÝ5à�M‰M˜$Ô 1°$Ó 7¼¸f»ÖFøÜô 	KÜ�L‰LÐ:ÀTˆL×Jð	Kús(   ‚C	 ¢C	 ·AC	 Á: C	 Â+C	 Ã	"C/Ã.C/Úbuild_memory_write_metadataÚ#apply_pending_steer_to_tool_resultsc                ó    <€ V ^8„  d   QhRS[ /# r¨   )r‘   )r   r·   s   "€r   r   rÍ   W  s   ø€ ÷ 
ñ 
¡dñ 
r   c                óH  € ^ RI Hp \        V RR4      pT! \        V RR4      \        V RR4      ;'       g    RVe   TM\        P                  RV P
                  RV P                  R	V P                  R
V P                  P                  RV P                  P                  /R7      # )zaDiagnostic snapshot: ``last_activity_*`` plus the short aliases gateway and delegate readers use.)Ú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¼  r>   re   ÚUNKNOWNÚ_current_toolÚ_api_call_countrâ   r  ÚusedÚ	max_total)r¿   r¼  Ú
provenances   &  r   Úget_activity_summaryÚAIAgent.get_activity_summaryW  sœ   € åBä˜TÐ#>ÀÓEˆ
Ù&Ü$ TÐ+>ÀÓEÜ&-¨dÐ4IÈ4Ó&P×&VÐ&VÐTVØ3=Ò3I¡ZÔOa×OiÑOià × 2Ñ 2Ð4DÀd×FZÑFZØ  $×"5Ñ"5°}Àd×F[ÑF[×F`ÑF`Ø˜d×3Ñ3×=Ñ=ðô		
ð 		
r   c                ó2   <€ V ^8„  d   QhRS[ R,          RR/# ©r   rž   Nr   ©rŸ   )r   r·   s   "€r   r   rÍ   g  s   ø€ ÷ ;ñ ;±¸µð ;Èñ ;r   c                óŠ  a € \        S RR4      '       d   R# RS n        S P                  '       dX   S P                  P                  RR7      '       d6    S P                  P	                  T;'       g    . 4       \        V 3R l4       \        S V4       R#   \
         d#   p\        P                  RTRR7        Rp?LERp?ii ; i)	zShut down the memory provider and context engine at session end (idempotent: gateway cleanup and
``close()`` may both call it).Ú_memory_provider_shutdownFNT)Úsession_endz9Memory provider on_session_end failed during shutdown: %sr7  c                  ó8   <€ S P                   P                  4       # rÏ   )Ú_memory_managerÚshutdown_allrÑ   s   €r   r¤   Ú2AIAgent.shutdown_memory_provider.<locals>.<lambda>r  s   ø€ ˜T×1Ñ1×>Ñ>Ô@r   )
r>   rÕ  rØ  Úclaim_teardownr£   r@   r‚   rR  r{   r¦   )r¿   rž   rT  s   f& r   Úshutdown_memory_providerÚ AIAgent.shutdown_memory_providerg  s§   ø€ ô �4Ð4°e×<Ò<ÙØ)-ˆÔ&Ø××Ð D×$8Ñ$8×$GÑ$GÐTXÐ$G×$YÒ$YðnØ×$Ñ$×3Ñ3°H·N°NÀÔCô Ô@ÔAÜ*¨4°Ö:øô ô nÜ—‘ÐZÐ\]Ðhl�×mÑmûðnús   ÁB Á1B ÂCÂ B=Â=Cc                ó2   <€ V ^8„  d   QhRS[ R,          RR/# rÒ  rÓ  )r   r·   s   "€r   r   rÍ   u  s   ø€ ÷ ;ñ ;©d°T­kð ;ÀTñ ;r   c                óf   a a€ S P                   '       d   \        VV 3R l4       \        S S4       R# )zjFlush end-of-session extraction on session_id rotation (/new, compression) without tearing providers
down.c                  óN   <€ SP                   P                  S ;'       g    . 4      # rÏ   )rØ  r£   )rž   r¿   s   €€r   r¤   Ú/AIAgent.commit_memory_session.<locals>.<lambda>y  s   ø€ ˜T×1Ñ1×@Ñ@ÀÇÀÈRÔPr   N)rØ  r{   r¦   )r¿   rž   s   ffr   Úcommit_memory_sessionÚAIAgent.commit_memory_sessionu  s$   ù€ ð ××ÐÜÕPÔQÜ*¨4°Ö:r   rž   c          
      óD   <€ V ^8„  d   QhRS[ RS[ RS[RS[R,          RR/# )r   Úoriginal_user_messageÚfinal_responseÚinterruptedrž   Nr   )r   r�   rŸ   )r   r·   s   "€r   r   rÍ   |  s8   ø€ ÷ ñ Ásð Ñ\_ð Ñnrð Ù15¸µðØHLñr   c               ó
  € V'       g#   V P                   '       d   V'       d	   V'       g   R# \        VRR7      p\        VRR7      pV'       d	   V'       g   R#  RV P                  ;'       g    R/Ve   RV/M/ Cp\        V RR4      pVe   W‡R&   V P                   P                  ! WV3/ VB  \        V4      '       g3   V P                   P                  YPP                  ;'       g    RR	7       R# R#   \         d     R# i ; i)
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ž   r�  Úturn_author)rš   )rØ  rl   rš   r>   Úsync_allrS   Úqueue_prefetch_allr@   )	r¿   rå  ræ  rç  rž   Ú	user_textÚresponse_textÚsync_kwargsrë  s	   &$$$$    r   Ú_sync_external_memory_for_turnÚ&AIAgent._sync_external_memory_for_turn|  så   € ÷ ˜t×3×3Ð3¿×K`Ùä3Ð4IÈtÔTˆ	Ü7¸ÈDÔQˆßŸmÙð	Ø'¨¯©×)>Ð)>¸BÐ{Ð]eÒ]qÀJÐPXÑCYÐwyÐ{ˆKä! $¨¸Ó=ˆKØÒ&Ø-8˜MÑ*Ø× Ñ ×)Ò)¨)ÑRÀkÒRä$ Y×/Ò/Ø×$Ñ$×7Ñ7¸	ÏoÉo×NcÐNcÐacÐ7Ödñ 0øäô 	Úð	ús   ÁC3 Á.A8C3 Ã'C3 Ã3DÄDc                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   �  s   ø€ ÷ 8ñ 8 ñ 8r   c                ó  a € S P                  RR7       \        S P                  V 3R l4       S P                  R4       \        S P                  4       \        S RR4      e"   \        S P                  P                  4       R# R# )a  Release LLM clients, child agents and memory providers WITHOUT tearing down session tool state (gateway
cache eviction: the session may resume on the same task_id, so processes, sandbox, browser and computer-use
are kept). Idempotent; distinct from ``close()``.T©Úsoftc                 ó*   <€ SP                  V R R7      # )Úcache_evict©Úreason)Ú_retire_shared_openai_client©Úcr¿   s   &€r   r¤   Ú)AIAgent.release_clients.<locals>.<lambda>¤  s   ø€ °T×5VÑ5VÐWXÐanÐ5VÔ5or   rø  rØ  N)Ú_close_active_childrenr{   Ú_drop_shared_clientÚ_close_request_clientsÚ_close_codex_sessionr>   rØ  Úrelease_softrÑ   s   fr   Úrelease_clientsÚAIAgent.release_clients�  sp   ø€ ð 	×#Ñ#¨Ð#Ô.ô 	�×)Ñ)Ô+oÔpØ×#Ñ# MÔ2ô 	�×*Ñ*Ô+Ü�4Ð*¨DÓ1Ò=Ü�T×)Ñ)×6Ñ6Ö7ñ >r   c                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   ¬  s   ø€ ÷ 3ñ 3�tñ 3r   c           
     ól  a € \        S RR4      p\        S P                  \        V\        4      '       d   TMR4       S P                  \        S RR4      ;'       g    R4       S P                  RR7       \        S P                  V 3R l4       S P                  R4       \        S P                  4       . S n
        RS n        . S n        \        V\        4      '       d+   ^ R	IHp \        W!\        S R
R4      \        S RR4      34       \        S P                  4       \        S P                   4       R# )zqRelease every resource this agent holds (idempotent); each phase is guarded so one failure never
blocks the rest.Ú_session_messagesNrš   r   Frõ  c                 ó,   <€ SP                  V R RR7      # )Úagent_closeT)rú  Úshared)Ú_close_openai_clientrü  s   &€r   r¤   ÚAIAgent.close.<locals>.<lambda>³  s   ø€ °T×5NÑ5NÈqÐYfÐosÐ5NÔ5tr   r
  )Úforget_message_token_memorP  Ú_cached_system_prompt_static)r>   r{   rÜ  rŒ   rŸ   Ú_close_task_resourcesrÿ  r   r  r  r  Ú_db_flush_scan_prefixÚ_streamed_assistant_text_partsÚagent.model_metadata_token_memor  Ú_trim_process_memoryÚ_finalize_owned_session_row)r¿   Úsession_messagesr  s   f  r   ÚcloseÚAIAgent.close¬  s  ø€ ô # 4Ð)<¸dÓCÐÜ�×.Ñ.ÄJÐO_Ôae×DfÒDfÑ0@ÐlpÔqØ×"Ñ"¤7¨4°¸tÓ#D×#JÐ#JÈÔKØ×#Ñ#¨Ð#Ô/Ü�×)Ñ)Ô+tÔuØ×#Ñ# MÔ2Ü�×*Ñ*Ô+ð "$ˆÔØ%)ˆÔ"Ø.0ˆÔ+ÜÐ&¬×-Ò-õ
 RÜÐ.Ä7È4ÐQhÐjnÓCoÜ18¸Ð?]Ð_cÓ1dð1fô gä�×*Ñ*Ô+Ü�×1Ñ1Ö2r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rö  r   Nr©   )r   r·   s   "€r   r   rÍ   É  s   ø€ ÷ ,ñ ,©dð ,°tñ ,r   c               ót  a€  V P                   ;_uu_ 4        \        V P                  4      pV P                  P                  4        RRR4       X F-  oT'       d    SP                  4        K  \        T3R l4       K/  	  R#   + '       g   i     LE; i  \         d     R# i ; i  \         d     LGi ; i)zgDetach and close per-turn child agents; ``soft`` releases their clients first, falling back to close().Nc                  ó$   <€ S P                  4       # rÏ   )r  )Úchilds   €r   r¤   Ú0AIAgent._close_active_children.<locals>.<lambda>Ø  s   ø€ ˜UŸ[™[œ]r   )Ú_active_children_lockrŸ   Ú_active_childrenÚclearr@   r  r{   )r¿   rö  Úchildrenr  s   &$ @r   rÿ  ÚAIAgent._close_active_childrenÉ  s˜   ø€ ð	Ø×+×+Ó+Ü × 5Ñ 5Ó6�Ø×%Ñ%×+Ñ+Ô-÷ ,ó
 ˆEßðØ×)Ñ)Ô+Ùô Ô*Ö+ó ÷ ,×+ûô ô 	Úð	ûô !ô Ùðús@   ƒB —0BÁB ÁB)ÂB	ÂB ÂB ÂB&Â%B&Â)B7Â6B7c                ó:   <€ V ^8„  d   QhRS[ S[.R3,          RR/# )r   Úclose_fnNr   )r   r   )r   r·   s   "€r   r   rÍ   Ú  s&   ø€ ÷ 
ñ 
©H±c°U¸D°[Õ,Að 
Àdñ 
r   c                óJ   € \        V RR4      pVe   V! V4       RV n        R# R# )zLHand the shared OpenAI/httpx client to ``close_fn`` and clear the attribute.ÚclientN)r>   r&  )r¿   r$  r&  s   && r   r   ÚAIAgent._drop_shared_clientÚ  s,   € ô ˜˜x¨Ó.ˆØÒÙ�VÔØˆDŽKñ r   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rú  r   NrÌ   )r   r·   s   "€r   r   rÍ   æ  s   ø€ ÷ Mñ M©Sð M°Tñ Mr   c                ób   € \        V P                  VR7       \        V P                  VR7       R# )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  ÚAIAgent._close_request_clientsæ  s"   € ä�×9Ñ9À&ÕIÜ�×<Ñ<ÀV×Lr   c                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   ë  s   ø€ ÷ "ñ " dñ "r   c                óZ   € \        V RR4      pVe   RV n        VP                  4        R# R# )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)r>   r/  r  )r¿   Úcodex_sessions   & r   r  ÚAIAgent._close_codex_sessionë  s2   € ô   Ð&6¸Ó=ˆØÒ$Ø"&ˆDÔØ×ÑÖ!ñ %r   c                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   ô  s   ø€ ÷ 6ñ 6 $ñ 6r   c                 ó&   € ^ RI Hp  V ! RRR7       R# )zXCollect cycles, then return freed heap pages to the OS (the page release is glibc-only).©Útrim_memoryTzagent close)Úforcerú  N)Úhermes_cli.mem_trimr5  r4  s    r   r  ÚAIAgent._trim_process_memoryó  s   € õ 	4Ù˜$ }×5r   c                ó   <€ V ^8„  d   QhRR/# rF  rG  )r   r·   s   "€r   r   rÍ   ù  s   ø€ ÷ )ñ )¨Tñ )r   c                ó  aa€ \        V RR4      o\        V RR4      o\        V RR4      '       d!   S'       d   S'       d   \        VV3R l4       \        V RR4      '       d   Se   RV n        ^ R	IHp V! S4       R# R# R# )
uq  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.r9  Nrš   Ú_end_session_on_closeTc                  ó(   <€ S P                  SR 4      # )r
  )Úend_session)r-  rš   s   €€r   r¤   Ú5AIAgent._finalize_owned_session_row.<locals>.<lambda>  s   ø€ ˜Z×3Ñ3°JÀÔNr   r;  F)Úrelease_or_close)r>   r{   r;  r:  r?  )r¿   r?  r-  rš   s   & @@r   r  Ú#AIAgent._finalize_owned_session_rowù  sq   ù€ ô
 ˜T =°$Ó7ˆ
Ü˜T <°Ó6ˆ
Ü�4Ð0°$×7Ò7¿JÏ:ÜÕNÔOÜ�4Ð+¨U×3Ò3¸
Ò8NØ$)ˆDÔ!õ ?Ù˜ZÖ(ñ 9OÑ3r   c                óJ   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RR/# )r   Úhistoryr   N)rŸ   r‘   r   r   )r   r·   s   "€r   r   rÍ   	  s(   ø€ ÷ ñ ©4±±S¹#°XµÕ+?ð ÀDñ r   c                óô  € V P                  V4      pVe¿   Vw  r4 \        ^ \        T;'       g    ^ 4      4      pT\        V P
                  P                  4       P                  R^ 4      ;'       g    ^ 4      8”  dY   V P
                  P                  W5R7       V P                  '       g+   V P                  V P                   R\        V4       R24       \        R4       R#   \        \        3 d    ^p L¼i ; i)uö   Replay the most recent todo tool response (the gateway builds a fresh AIAgent per message). Only
results paired with an earlier assistant Todo-tool call count â€” a forged bare ``role: tool`` message
must not seed the store (GHSA-5g4g-6jrg-mw3g).NÚrevision)rD  u   ðŸ“‹ Restored z todo item(s) from historyF)Ú_latest_todo_responser  rŠ   rT  rU  Ú_todo_storeÚsnapshotr   Úrestorerè   Ú_vprintrì   r¬   Ú_set_interrupt)r¿   rB  ÚfoundÚlast_todo_responseÚlast_todo_revisionÚhistory_revisions   &&    r   Ú_hydrate_todo_storeÚAIAgent._hydrate_todo_store	  sã   € ð ×*Ñ*¨7Ó3ˆØÒØ5:Ñ2Ðð%Ü#& q¬#Ð.@×.EÐ.EÀAÓ*FÓ#GÐ ð  ¤# d×&6Ñ&6×&?Ñ&?Ó&A×&EÑ&EÀjÐRSÓ&T×&YÐ&YÐXYÓ"ZÔZØ× Ñ ×(Ñ(Ð);Ð(ÔWØ——�Ø—L‘L D§O¡OÐ#4°NÄ3ÐGYÓCZÐB[Ð[uÐ!vÔwÜ�uÖøô œzÐ*ô %Ø#$Ò ð%ús   ›C! Ã!C7Ã6C7c                ó\   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[S[,          /# )r   rB  r   )rŸ   r‘   r   r   r   rï  )r   r·   s   "€r   r   rÍ     s,   ø€ ÷ ñ ©T±$±s¹C°xµ.Õ-Að ÁhÉuÅoñ r   c                ó²  € ^ RI Hp \        \        V4      ^,
          RR4       EF  pW,          pVP	                  RR4      pVP	                  R4      R8w  g.   \        V\        4      '       d   V P                  W4      '       g   Kc  \        V4      V8”  d7   \        P                  RV P                  ;'       g    R\        V4      4       K©  RV9  d   K²   \        P                  ! V4      pR	T9   g   KÒ  \        TR	,          \        4      '       g   Kñ  TR	,          TP	                  R
^4      3u # 	  R#   \        P                  \        3 d     EK1  i ; i)ua   Walk history backwards for the newest paired, size-bounded todo result â†’ ``(todos, revision)``.)ÚMAX_TODO_RESULT_CHARSrZ  r   r¨  rw  zKSkipping oversized todo tool response during hydration: session=%s chars=%drl  z"todos"ÚtodosrD  Nr9  )Útools.todo_toolrS  Úranger¬   r   rŒ   r   Ú _tool_response_matches_todo_callr‚   rR  rš   rA   ÚloadsÚJSONDecodeErrorrT  rŸ   )r¿   rB  rS  Úidxr¯  rZ  Údatas   &&     r   rE  ÚAIAgent._latest_todo_response  s   € å9äœ˜W›¨Õ)¨2¨r×2ˆCØ•,ˆCØ—g‘g˜i¨Ó,ˆGØ�w‰w�v‹ &Ô(´
¸7ÄC×0HÒ0HÐPT×PuÑPuÐv}÷  QDò  QDÙÜ�7‹|Ð3Ô3Ü—‘ð  5Ø6:·o±o×6OÐ6OÈÔQTÐU\ÓQ]ô_áØ Ô'ÙðÜ—z’z 'Ó*�ð ˜$Ž¤:¨d°7­m¼T×#BÔ#BØ˜G•} d§h¡h¨z¸1Ó&=Ð=Ò=ñ! 3ñ" øô	 ×(Ñ(¬)Ð4ô Ûðús   ÃD6Ä6EÅEc                óR   <€ V ^8„  d   QhRS[ S[S[S[3,          ,          RS[RS[/# )r   rB  Ú
tool_indexr   )rŸ   r‘   r   r   rŠ   r�   )r   r·   s   "€r   r   rÍ   4  s1   ø€ ÷ ñ ±t¹DÁÁcÀ½NÕ7Kð ÑY\ð Ñaeñ r   c                ó  € ^ Tu;8:  d   \        V4      8  d   M MW,          P                  R4      MRpV'       g   R# \        VRV 4       F8  pVP                  R4      pVR8X  d   V P                  WC4      u # VR9   g   K7   R# 	  R# )uï   True when the nearest prior assistant message issued a Todo-tool call (legacy aliases and the
``tool_call`` bridge canonicalized) with this ``tool_call_id``; a ``user``/``system`` boundary or
missing id means unpaired â†’ must not hydrate.Útool_call_idNFr¨  r©  >   ÚuserÚsystem)r¬   r   ÚreversedÚ_assistant_has_todo_tool_call)ÚclsrB  r^  r`  Úpriorr¨  s   &&&   r   rW  Ú(AIAgent._tool_response_matches_todo_call3  sƒ   € ð
 CDÀzÖB`ÔTWÐX_ÓT`×B`�wÕ*×.Ñ.¨~Ô>ÐfjˆßÙÜ˜g k zÐ2Ö3ˆEØ—9‘9˜VÓ$ˆDØ�{Ô"Ø×8Ñ8¸ÓMÒMØÐ)Ö)Úñ 4ñ r   c                óB   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[/# )r   Úassistant_msgr`  r   ©r‘   r   r   r�   )r   r·   s   "€r   r   rÍ   D  s,   ø€ ÷ 
ñ 
¹$¹sÁC¸x½.ð 
ÑX[ð 
Ñ`dñ 
r   c                óâ   a aa€ ^ RI Ho VP                  R4      p\        V\        4      ;'       d?    \
        ;QJ d!    V VV3R lV 4       F  '       g   K   R# 	  R# ! V VV3R lV 4       4      # )z?True when the paired call resolves to the registered Todo tool.)Úis_todo_tool_callr{  c              3   ól   <"  € T F)  pSP                  V4      S8H  ;'       d	    S! V4      x € K+  	  R # 5irÏ   )Ú_get_tool_call_id_static)r"  Útcre  rl  r`  s   & €€€r   r$  Ú8AIAgent._assistant_has_todo_tool_call.<locals>.<genexpr>I  s8   øé € ð 4
ÙakÐ[]ˆC×(Ñ(¨Ó,°Ñ<×VÐVÑARÐSUÓAVÔVÓakùs   ƒ4£4TF)rU  rl  r   rŒ   rŸ   r&  )re  ri  r`  r{  rl  s   f&f @r   rd  Ú%AIAgent._assistant_has_todo_tool_callC  sf   ú€ õ 	6à"×&Ñ& |Ó4ˆ
Ü˜*¤dÓ+÷ 
ð 
·³ö 4
Ùakó4
·´ð 	
²ð 	
°ö 4
Ùakó4
ó 1
ð 	
r   c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   N  s   ø€ ÷ )ñ )¡ñ )r   c                ó   € V P                   # )z)Check if an interrupt has been requested.)Ú_interrupt_requestedrÑ   s   &r   Úis_interruptedÚAIAgent.is_interruptedM  s   € ð ×(Ñ(Ð(r   zagent.system_promptÚbuild_system_promptc                ó    <€ V ^8„  d   QhRS[ /# r¨   rÌ   )r   r·   s   "€r   r   rÍ   X  s   ø€ ÷ Hñ H©#ñ Hr   c                óü   € \        V \        4      '       dF   V P                  R4      p\        V\        4      '       d   VP                  RR4      ;'       g    R# R# \        \        V RR4      RR4      ;'       g    R# )zhFunction name of a tool_call entry (dict or object); Gemini requires it on every ``role: tool`` message.Úfunctionrª  r   N)rŒ   r‘   r   r>   )ro  rw   s   & r   Ú_get_tool_call_name_staticÚ"AIAgent._get_tool_call_name_staticW  si   € ô �bœ$×ÒØ—‘˜
Ó#ˆBÜ1;¸BÄ×1EÒ1E�B—F‘F˜6 2Ó&×,Ð,¨"ÐMÈ2ÐMÜ”w˜r :¨tÓ4°f¸bÓA×GÐGÀRÐGr   Úsanitize_api_messagesÚdrop_codex_reasoning_itemsc                óB   <€ V ^8„  d   QhRS[ S[S[3,          RS[RS[/# )r   r¯  r~  r   rj  )r   r·   s   "€r   r   rÍ   c  s,   ø€ ÷ !ñ !©©c±3¨h­ð !ÑX\ð !Ñhlñ !r   c               ó8  € \        V \        4      '       d.   V P                  R4      R8w  g   V P                  R4      '       d   R# V P                  R4      '       d   R# \        P	                  V P                  R4      4      '       d   R# ^ RIHp V! V P                  R	4      4      '       d   R# V P                  R
4      ;'       g    V P                  R4      pV P                  R4      p\        V\        4      '       d   VP                  4       '       g   \        V\        4      '       d   V'       d   R# V P                  R	4      pV'       dK   \        V\        4      '       d5   \        ;QJ d    R V 4       F  '       g   K   R# 	  R# ! R V 4       4      # R# )a  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_prefillTrZ  )Úhas_compaction_checkpointrª  Úreasoning_contentÚ	reasoningÚreasoning_detailsc              3   óz   "  € T F1  p\        V\        4      ;'       d    VP                  R 4      R8H  x € K3  	  R# 5i)r»   r„  Nrx  )r"  Úitems   & r   r$  Ú6AIAgent._is_thinking_only_assistant.<locals>.<genexpr>ƒ  s3   é € ÐjÑ^iÐVZ”z $¬Ó-×QÐQ°$·(±(¸6Ó2BÀkÑ2QÔQÓ^iùrz  )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_assistantÚ#AIAgent._is_thinking_only_assistantb  s+  € ô ˜#œt×$Ò$¨¯©°«¸;Ô(FÈ#Ï'É'ÐR^×J_ÒJ_Ùð �7‰7Ð&×'Ò'ÙÜ×,Ñ,¨S¯W©W°YÓ-?×@Ò@Ùõ 	Fá$ S§W¡WÐ-DÓ%E×FÒFÙØ—G‘GÐ/Ó0×HÐH°C·G±G¸KÓ4Hˆ	Ø�W‰WÐ(Ó)ˆÜ�y¤#×&Ò&¨9¯?©?×+<Ò+<Ä*ÈRÔQU×BVÒBV×[]Ùð —g‘gÐ5Ó6ˆß%¬*°[Ä$×*GÒ*Gß“3ÑjÑ^iÓj—3”3Ðj’3Ðj�3ÑjÑ^iÓjÓjÐjÙr   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rY  r”  )r   r·   s   "€r   r   rÍ   ‡  s   ø€ ÷ 5ñ 5©3ð 5±4ñ 5r   c                óØ  € \        V \        4      '       d   \        V P                  4       4      # \        V \        4      '       d–   V  F�  p\        V\
        4      '       g   V'       d    R# K&  VP                  R4      pVR8X  dF   VP                  RR4      p\        V\        4      '       d   VP                  4       '       d    R# K�  Kƒ  VR9  g   KŒ   R# 	  R# V RJ;'       d    V R8g  # )z`True when assistant ``content`` carries anything beyond (redacted) thinking blocks / whitespace.Tr»   Útextr   FN>   ÚthinkingÚredacted_thinking)rŒ   r   r�   r   rŸ   r‘   r   )rZ  ÚblockÚbtyper‘  s   &   r   r‰  Ú!AIAgent._content_has_real_payload†  s¾   € ô �gœs×#Ò#Ü˜Ÿ™›Ó(Ð(Ü�gœt×$Ò$Û �Ü! %¬×.Ò.ßÚ#ÙØŸ	™	 &Ó)�Ø˜F”?Ø Ÿ9™9 V¨RÓ0�DÜ! $¬×,Ò,°·±·²Ú#ñ 2>Ñ,àÐ"CÖCÚñ !ñ Ø˜dÐ"×4Ð4 w°"¡}Ð4r   Ú"drop_thinking_only_and_merge_usersc                ó&   <€ V ^8„  d   QhRS[ RS[ /# ©r   r{  r   rÓ  )r   r·   s   "€r   r   rÍ   ž  s   ø€ ÷ ñ ©Tð ±dñ r   c                ó   € ^ RI Hp V! 4       p\        R V  4       4      pW28:  d   V # ^ . rTV  F@  pVP                  P                  R8X  d   WB8¼  d   K&  V^,          pVP                  V4       KB  	  \        P                  RW2,
          V4       V# )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.)Ú_get_max_concurrent_childrenc              3   ó^   "  € T F#  qP                   P                  R 8X  g   K  ^x € K%  	  R# 5i)Údelegate_taskN)rz  rª  )r"  ro  s   & r   r$  Ú3AIAgent._cap_delegate_task_calls.<locals>.<genexpr>£  s!   é € Ð[© 2·{±{×7GÑ7GÈ?Ñ7ZŸQšQ«ùs   ‚-£
-r�  zUTruncated %d excess delegate_task call(s) to enforce max_concurrent_children=%d limit)Útools.delegate_toolr›  Úsumrz  rª  Úappendr‚   rR  )r{  r›  Úmax_childrenÚdelegate_countÚkept_delegatesÚ	truncatedro  s   &      r   Ú_cap_delegate_task_callsÚ AIAgent._cap_delegate_task_calls�  s“   € õ 	EÙ3Ó5ˆÜÑ[©Ó[Ó[ˆØÔ)ØÐØ$% r˜	ÛˆBØ�{‰{×Ñ ?Ô2Ø!Ô1ÙØ !Õ#�Ø×Ñ˜RÖ ñ ô 	�‰ð :Ø;IÕ;XÐZfô	hàÐr   c                ó&   <€ V ^8„  d   QhRS[ RS[ /# r™  rÓ  )r   r·   s   "€r   r   rÍ   ²  s   ø€ ÷ Gñ G©Dð G±Tñ Gr   c                óò  € \        4       . r!V  F³  pVP                  P                  p \        P                  ! \        P
                  ! V4      RRR7      pVP                  P                  V3pWQ9   d-   \        P                  RVP                  P                  4       K‘  VP                  V4       VP                  V4       Kµ  	  \        V4      \        V 4      8  d   V# T #   \        \        3 d     L i ; i)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)Ú,Ú:)Úsetrz  Ú	argumentsrA   rB   rX  rT  rU  rª  r‚   rR  Úaddr¡  r¬   )r{  ÚseenÚuniquero  r¯  rÌ  s   &     r   Ú_deduplicate_tool_callsÚAIAgent._deduplicate_tool_calls±  sÊ   € ô “u˜bˆfÛˆBØŸ™×-Ñ-ˆIðÜ ŸJšJ¤t§z¢z°)Ó'<ÈÐ_cÔd�	ð —;‘;×#Ñ# YÐ/ˆCØŒ{Ü—‘Ð@À"Ç+Á+×BRÑBRÔSÙØ�H‰H�SŒMØ�M‰M˜"Öñ ô ˜V›¤s¨:£Ô6ˆvÐF¸JÐFøô œzÐ*ô Ùðús   ¨-C"Ã"C6Ã5C6Úrepair_tool_callÚinvalidate_system_promptÚinterruptible_api_callÚ interruptible_streaming_api_callÚtry_activate_fallbackc                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ   Õ  s   ø€ ÷ gñ g¡tñ gr   c                ó^   € \        V R^ 4      \        \        V RR4      ;'       g    . 4      8  # )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_indexÚ_fallback_chainN)r>   r¬   rÑ   s   &r   Ú_has_pending_fallbackÚAIAgent._has_pending_fallbackÕ  s2   € ô �tÐ.°Ó2´S¼ÀÐGXÐZ^Ó9_×9eÐ9eÐceÓ5fÑfÐfr   Úrestore_primary_runtimeÚtry_recover_primary_transportÚbuild_api_kwargsc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Údecisionr   N)rm   )r   r·   s   "€r   r   rÍ   á  s    ø€ ÷ Lñ LÑ1Fð LÈ4ñ Lr   c                óº   € VP                   '       d   V P                  f   Wn        VP                   '       d#   \        WP                  VP                  4       R# R# )z?Record the first guardrail decision that should stop this turn.N)Úshould_haltÚ_tool_guardrail_halt_decisionrp   Úactionr²   ©r¿   rÄ  s   &&r   Ú_set_tool_guardrail_haltÚ AIAgent._set_tool_guardrail_haltá  sB   € à××Ð D×$FÑ$FÒ$NØ19Ô.Ø××ÐÜ% d¯O©O¸X¿]¹]ÖKñ  r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# ©r   rÄ  r   ©rm   r   )r   r·   s   "€r   r   rÍ   è  s   ø€ ÷ 
ñ 
Ñ<Qð 
ÑVYñ 
r   c                óP   € R VP                   ;'       g    R RVP                   R2# )z*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_responseÚ+AIAgent._toolguard_controlled_halt_responseè  s6   € ð 9¸×9KÑ9K×9^Ð9^ÈÐ8_Ð_`Ø�~‰~Ðð "ð"ð	
r   r`  c                ó>   <€ V ^8„  d   QhRS[ RS[RS[ RS[RS[ RS[ /# )r   rÑ  Úfunction_argsÚfunction_resultÚfailedr`  r   )r   r‘   r�   )r   r·   s   "€r   r   rÍ   ñ  s;   ø€ ÷  ñ  ±sð  É4ð  Ñbeð  Ù.2ð ÙBEð ÙORñ r   c               óF  € V P                   P                  WW4R 7      pR;p;r‰V P                  4       '       d[    V P                   P                  Y\	        V\
        4      '       d   TMRWTR7      p
V
P                  V
P                  V
P                  r˜pV'       d   \	        V\
        4      '       d   TpVP                  R9   d   \        W64      p\        YV'       d   T	MR4       VP                  '       d   V P!                  V4       MGV P                   P"                  pVe.   VP$                  R9   d   \        W<4      pV P!                  V4       V'       d   T;'       g    RR,           V,           pV#   \         d"   p\        P                  RT4        Rp?ELRp?ii ; i))rØ  N)r`  rØ  z1stall-guard identical-call observation failed: %sr   z

>   Úhaltr*  )Úidentical_call_streak_haltÚidentical_cycle_halt)Ú_tool_guardrailsÚ
after_callÚ_stall_guards_enabledÚobserve_callrŒ   r   ÚnoticeÚstubÚkindr@   r‚   rƒ   rÈ  rn   rq   rÆ  rÊ  Úhalt_decisionr²   )r¿   rÑ  rÖ  r×  rØ  r`  rÄ  Ústall_noticeÚresult_stubÚ
stall_kindÚobservationr„   Ústreak_halts   &&&&$$       r   Ú_append_guardrail_observationÚ%AIAgent._append_guardrail_observationñ  sr  € à×(Ñ(×3Ñ3°IÈoÐ3Ómˆð 37Ð6ˆÐ6�{Ø×%Ñ%×'Ò'ðWØ"×3Ñ3×@Ñ@ØÄÈOÔ]`×AaÒAa©oÐgkØ!-ð Aó �ð 9D×8JÑ8JÈK×L\ÑL\Ð^i×^nÑ^n¨:�÷
 œ: o´s×;Ò;Ø)ˆOØ�?‰?Ð.Ô.Ü7¸ÓRˆOÜ! $Ç±*ÐRVÔWØ××ÐØ×)Ñ)¨(Õ3ð ×/Ñ/×=Ñ=ˆKØÒ&¨;×+;Ñ+;Ð?uÔ+uÜ";¸OÓ"Y�Ø×-Ñ-¨kÔ:ßØ.×4Ð4°"¸Õ>ÀÕMˆOØÐøô' ô WÜ—‘ÐPÐRU×VÒVûðWús   ºAE4 Å4F Å?FÆF c                ó    <€ V ^8„  d   QhRS[ /# r¨   r©   )r   r·   s   "€r   r   rÍ     s   ø€ ÷ :ñ :¡tñ :r   c                ó.   € \        \        V RR4      4      # )zCConfig gate for the runtime anti-stall guards (agent.stall_guards).Ú_stall_guardsTr–  rÑ   s   &r   rß  ÚAIAgent._stall_guards_enabled  s   € ä”G˜D /°4Ó8Ó9Ð9r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# rÍ  rÎ  )r   r·   s   "€r   r   rÍ     s   ø€ ÷ 4ñ 4Ñ0Eð 4É#ñ 4r   c                ó:   € V P                  V4       \        V4      # rÏ   )rÊ  ro   rÉ  s   &&r   Ú_guardrail_block_resultÚAIAgent._guardrail_block_result  s   € Ø×%Ñ% hÔ/Ü)¨(Ó3Ð3r   c                ó0   <€ V ^8„  d   QhRS[ RS[RS[RR/# )r   rž   Úeffective_task_idrÁ  r   N)rŸ   r   rŠ   )r   r·   s   "€r   r   rÍ     s,   ø€ ÷ "4ñ "4¹tð "4ÑX[ð "4Ñmpð "4Ðy}ñ "4r   c                óž  € VP                   pWW43pRV n         \        \        V 4      4      ;_uu_ 4        \	        V4      ^8:  d   V P
                  ! V!   M�^ RIHp \        V4      pVe(   VP                  '       d   \        VP                  4      MRp	V! WYR7      p
\	        V
4      ^8X  d5   V
^ ,          ^ ,          R8X  d   V P                  MV P
                  pV! V!   M^ RIHp V! V .VO5RV
/  RRR4       RV n        \        V R	R4      '       d   RV n        ^ R
IHp V! RR7       R# R#   + '       g   i     LD; i  RT n        i ; i)zÿ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.
T)Ú_plan_tool_batch_segmentsN)Úexecution_cwdÚparallel)Úexecute_tool_calls_segmentedÚsegmentsFÚ_trim_after_tool_batchr4  zlarge tool resultrù  )r{  Ú_executing_toolsrR   rQ   r¬   Ú_execute_tool_calls_sequentialÚagent.tool_dispatch_helpersr÷  rN   r   r
   Ú_execute_tool_calls_concurrentÚagent.tool_executorrú  r>   rü  r7  r5  )r¿   r|  rž   rõ  rÁ  r{  ry   r÷  Ú
active_envÚexec_cwdrû  Úrunrú  r5  s   &&&&&         r   Ú_execute_tool_callsÚAIAgent._execute_tool_calls  s1  € ð '×1Ñ1ˆ
Ø!Ð->ÐOˆØ $ˆÔð	*Ü*Ô+CÀDÓ+I×JÕJÜ�z“? aÔ'Ø×7Ò7¸Ó>åUÜ!/Ð0AÓ!B�JØ7AÒ7MÐR\×R`×R`ÐR`œt J§N¡NÔ3Ðfj�HÙ8¸Ô\�HÜ˜8“}¨Ô)ØEMÈaÅ[ÐQRÅ^ÐWaÔEa˜d×AÒAÐgk÷  hKñ  hK˜Ù˜T›
åTÙ4°TÐT¸DÒTÈ8ÒT÷ Kð %*ˆDÔ!ä�4Ð1°5×9Ò9ð
 +0ˆDÔ'Ý7ÙÐ2×3ñ :÷# K×Jûð %*ˆDÕ!ús*   ™E µAD0Á>A6D0Ã4E Ä0E 	Ä;E Å	Ec                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   rÖ  r   rÈ  )r   r·   s   "€r   r   rÍ   ?  s   ø€ ÷ 
ñ 
±Tð 
¹cñ 
r   c                óp  € ^ RI HpHp V! VP                  R4      VP                  R4      V! VP                  R4      4      VP                  R4      VP                  R4      \	        V R^ 4      ^ 8”  * VP                  R4      VP                  R	4      VP                  R
4      VP                  R4      V R7      # )zaSingle call site for delegate_task dispatch; new DELEGATE_TASK_SCHEMA fields are added only here.)Ú_strip_model_hidden_task_fieldsr�  ÚgoalÚcontextÚtasksrâ   r¨  r�  ÚimagesrÈ  Úsubagent_idr¶   )r
  r  r  râ   r¨  Ú
backgroundr  rÈ  r  r¶   Úparent_agent)rŸ  r	  r�  r   r>   )r¿   rÖ  r	  Ú_delegate_tasks   &&  r   Ú_dispatch_delegate_taskÚAIAgent._dispatch_delegate_task?  s¬   € çhñ Ø×"Ñ" 6Ó*°M×4EÑ4EÀiÓ4PÙ1°-×2CÑ2CÀGÓ2LÓMØ(×,Ñ,Ð-=Ó>À]×EVÑEVÐW]ÓE^Ü# DÐ*;¸QÓ?À!ÒDÈ]×M^ÑM^Ð_gÓMhØ ×$Ñ$ XÓ.Ø%×)Ñ)¨-Ó8À-×BSÑBSÐT]ÓB^Ðmqô
ð 	
r   Úinvoke_toolc                ó2   <€ V ^8„  d   QhRS[ RS[ RS[ RS[ /# )r   Úlabelr‘  Úindentr   rÌ   )r   r·   s   "€r   r   rÍ   Q  s/   ø€ ÷ Dñ D™Sð D©ð D±Sð DÁsñ Dr   c           
     ó˜  € ^ RI p^ RIp\        ^(VP                  R4      P                  \        V4      ,
          4      p. pVP                  R4       FT  p\        V4      V8:  d   VP                  V4       K&  TP                  VP                  WuRRR7      ;'       g    V.4       KV  	  V V  2RV,           P                  V4      ,           # )zqWord-wrap verbose tool output to the terminal width (each existing line separately), continuation
lines indented.Nré  TF)ÚwidthÚbreak_long_wordsÚbreak_on_hyphens)éx   é   )ÚshutilÚtextwrapr  Úget_terminal_sizeÚcolumnsr¬   Úsplitr¡  ÚextendÚwrapÚjoin)r  r‘  r  r  r  Ú
wrap_widthÚ	out_linesÚraw_lines   &&&     r   Ú_wrap_verboseÚAIAgent._wrap_verboseP  sÀ   € ÷ 	 Ü˜˜V×5Ñ5°iÓ@×HÑHÌ3ÈvË;ÕVÓWˆ
Ø!ˆ	ØŸ
™
 4Ö(ˆHÜ�8‹} 
Ô*Ø× Ñ  Ö*à× Ñ  §¡¨xÐ\`Ðsx Ó!y÷  "Hð  "Hð  Gð  ~Hö  Iñ	 )ð
 �˜%˜Ð! T¨F¥]×$8Ñ$8¸Ó$CÕCÐCr   zagent.tool_executorÚexecute_tool_calls_concurrentÚexecute_tool_calls_sequentialÚhandle_max_iterationsc                ó0   <€ V ^8„  d   QhRS[ S[,          /# r¨   r&   )r   r·   s   "€r   r   rÍ   b  s   ø€ ÷ ñ ¡x±¥}ñ r   c                óP  € \        V RR4      pV'       d   \        V4      # \        V RR4      pV'       g   R# \        V RR4      ;'       g    Tp\        V RR4      pVf   V#  VP                  V4      ;'       g    T#   \         d    \        P                  RRR7       Tu # i ; i)	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š   rQ  r9  z%Conversation root lineage walk failedTr7  )r>   r   Úget_conversation_rootr@   r‚   rƒ   )r¿   ÚcachedÚsidr®  Údbs   &    r   Ú_conversation_root_idÚAIAgent._conversation_root_idb  s¨   € ô ˜Ð:¸DÓAˆßÜ�v“;ÐÜ�d˜L¨$Ó/ˆßÙô ˜Ð2°DÓ9×@Ð@¸SˆÜ�T˜=¨$Ó/ˆØŠ:ØˆLð	Ø×+Ñ+¨EÓ2×;Ð;°eÐ;øÜô 	Ü�L‰LÐ@È4ˆLÔPØŠLð	ús   Á#A> Á;A> Á>$B%Â$B%)rÐ   r×   rÖ   r¬  r/  r€  r  rý  r~  r‚  rÕ  r;  r9  rN  r  r  rÇ  rü  r�  r}  r|  r  r&  r{  rz  ry  )NNFrÏ   )FFNF)FFNNé    F>   rw  ra  rb  rz  r©  Ú	developer)r7  )z     )‡rÂ   rÃ   rÄ   rÅ   rÆ   Ú&_TOOL_CALL_ARGUMENTS_CORRUPTION_MARKERÚpropertyrÒ   ÚsetterÚsysÚmaxsizer½   r<  rC  rU  rg  r„  Ústaticmethodr�  r—  r¢  Ú_forwardr¤  r°  Ú_forward_staticÚ_stream_diag_initÚ_stream_diag_capture_responseÚ_flatten_exception_chainr¹  Ú_log_stream_retryÚ_emit_stream_droprÅ  rÍ  Ú$_check_compression_model_feasibilityÚ_replay_compression_warningrÔ  rÚ  rß  ræ  rì  r÷  r
  r  r  r  r'  r.  r2  Ú_anthropic_prompt_cache_policyr5  r<  rI  rN  rV  r]  r\  re  ro  r~  Ú"_looks_like_codex_intermediate_ackÚ_extract_reasoningÚ_cleanup_task_resourcesr’  rƒ  r„  r…  Ú$_summarize_background_review_actionsr—  r•  rµ  r¥  Ú_build_memory_write_metadataÚ$_apply_pending_steer_to_tool_resultsrÏ  rÜ  râ  rñ  r  r  rÿ  r   r  r  r  r  rO  rE  ÚclassmethodrW  rd  ru  Ú_build_system_promptÚ_sanitize_coalesce_tool_call_idrn  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_idrk   Ú(_codex_derive_responses_function_call_idrj   Ú_interruptible_api_callÚ!_interruptible_streaming_api_callÚ_try_activate_fallbackr¾  Ú_restore_primary_runtimeÚ_try_recover_primary_transportÚ_build_api_kwargsrÊ  rÓ  rê  rß  rò  r  r  Ú_invoke_toolr)  r   rþ  Ú_handle_max_iterationsr5  rÇ   rÈ   )r·   s   @r   r%   r%   Ö   sŠ  ø‡ € ñ
 3ð	Oð +ð
 ÷ó ðð ‡_�_÷;ó ð;ð  $¸4ÐX\ÐuyØ"&ÀTÐaeð  AEØØ!Ÿk™kØ#'Ø-1ÐY]Ø"'ÀÐ[`Ø"'ÈtØ #°rØ.2ÐZ^ð  EIØ$(Èeð  }AØ7;Ø!%Ø<@ÐswØ<@ÐquØ8<ÐlpØ<@ÐuyØ<@Ðz~Ø9=ÐjnØ48Ø9=Ø37Ø;?Ðy}Ø7;ÐjnØ59ÐnrØ@DØ=AØ!%ÐQUÐrvØ37ÐimØ#¸4Ð[_Ðy}Ø"¸DÐZ^Ðx|Ø*.Ø#(ÀUØ!À%Ø¸Ø,0ÐX\Ø04ÀdØ$)È2Ø,/ÐTVØ %ÈØ/3ÀtØ °ØGK÷Y4(ò 4(òl÷&Sð S÷!Wð !WðFkØ15ðkØW[ðkà,0ðkàMRðkàim÷kò k÷:/Xò /Xðb ÷
<ó ð
<ð ÷
ó ð
÷
ò 
ñ Ð9¸>ÓJ€LñHØV[÷Hó Hñ$ (Ð(;Ð=OÓPÐÙ$,Ð-@ÐB`Ó$aÐ!Ù.Ð/BÐD]Ó^Ð÷qð qñ
 !Ð!4Ð6HÓIÐÙ Ð!4Ð6HÓIÐ÷	Eð 	E÷
ð 
ñ ,4Ð4TÐV{Ó+|Ð(Ù"*Ð+KÐMiÓ"jÐ÷rð r÷@ò @÷>ò >÷
sò s÷
Sð S÷ð ÷*ð ÷2Kð K÷
ò 
÷0Lð L÷zð z÷zð z÷
Zð Zñ &.Ð.KÐMlÓ%mÐ"Ù5=Ð>[ð  ^Nó  6OÐ2à÷Dó ðDð
 ð<ÐX\÷ <ñ <ó ð<÷.%ð %ð ÷ó ð÷Qð Qñ #Ð#@ÐBVÓWÐà÷tó ðt÷*ð *÷2Cò Cñ  *2Ð2OÐQtÓ)uÐ&Ù!Ð"?ÐATÓUÐÙ&Ð'FÐH`ÓaÐ÷ mÑlÙ+:Ð;TÐV{Ó+|Ð(÷4ò 4÷@&ò &ðP $%Ð ÷Kð Kñ* $,Ð,EÐGdÓ#eÐ Ù+3Ð4QÐSxÓ+yÐ(÷
ð 
÷ ;ò ;÷;ò ;ðØ?C÷ò ÷B8ð 8÷3ð 3÷:,ð ,÷"
ð 
÷Mð M÷
"ð "ð ÷6ó ð6÷
)ð )÷ ð ÷&ð ð. ÷ó ðð ÷
ó ð
ð ÷)ó ð)ñ $Ð$9Ð;PÓQÐñ  ,Ð,KÓLÐà÷Hó ðHñ !Ò!aÓbÐÙ,Ð-JÐLcÓdÐàð!Ð_c÷ !ñ !ó ð!ðF ÷5ó ð5ñ( +:Ð:WÐY}Ó*~Ð'à÷ó ðð& ÷Gó ðGñ( +Ð+KÓLÐá Ð!>Ð@RÓSÐÙ (Ð)>Ð@ZÓ [Ðñ *Ð*FÓGÐÙ+Ð,JÓKÐÙ)5Ð6^Ó)_Ð&á&Ð'FÐH`ÓaÐÙ(0Ð1PÐRtÓ(uÐ%Ù%Ð&EÐG^Ó_Ð÷gð gñ  (Ð(EÐG`ÓaÐÙ%-Ð.KÐMlÓ%mÐ"Ù Ð!@ÐBTÓUÐ÷Lð L÷
ð 
ð ØHJ÷ ò  ÷D:ð :÷4ð 4÷"4ò "4÷H
ð 
ñ Ð9¸=ÓI€Là÷Dñ Dó ðDñ &.Ð.CÐEdÓ%eÐ"Ù%-Ð.CÐEdÓ%eÐ"Ù%Ð&EÐG^Ó_Ð÷ö r   r%   uh  
ðŸ’¡ 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                ó   € V ^8„  d   QhRR/# rF  rG  )r   s   "r   r   r   ‹  s   € ÷ %ñ %˜Tñ %r   c            
     ó0  € ^ RI Hp Hp ^ RIHpHp \        R4       \        R$4       \        R4       \        R%4       . . . repV! 4        FC  pV! V4      pV'       g   K  V\        9   d   TMV\        9   d   TMTp	V	P                  Wx34       KE  	  \        R4       V FS  w  rx\        RVR RVR	,           24       \        R
VR,          '       d   RP                  VR,          4      MR 24       KU  	  \        R4       V Fh  w  rx\        RVR RVR	,           24       \        RVR,          '       d   RP                  VR,          4      MR 24       \        RVR,           24       Kj  	  \        R4       V F3  w  rx\        RVR RVR	,           24       \        RVR,           24       K5  	  \        R4       V! 4       P                  4        Ff  w  rx\        RVR,          '       d   RMR RV RVR	,           24       VR,          '       d   KB  \        RRP                  VR,          4       24       Kh  	  V ! 4       p
\        R\        V
4       R24       \        V
4       F  p\        R V R!\        V4       R"24       K   	  \        \        4       R## )&zi``--list_tools``: print toolsets (basic / composite / scenario / legacy), every tool, and usage examples.)Úget_all_tool_namesÚget_available_toolsets)Úget_all_toolsetsÚget_toolset_infou    ðŸ“‹ Available Tools & Toolsets:u'   
ðŸŽ¯ Predefined Toolsets (New System):u   
ðŸ“Œ Basic Toolsets:u     â€¢ Ú15z - Údescriptionz    Tools: Úresolved_toolsz, rl  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 Ú)Nz2--------------------------------------------------z(----------------------------------------)Úmodel_toolsrh  ri  Útoolsetsrj  rk  ÚprintÚ_BASIC_TOOLSETSÚ_COMPOSITE_TOOLSETSr¡  r%  r(  r¬   ÚsortedrL   Ú_LIST_TOOLS_USAGE)rh  ri  rj  rk  Úbasic_toolsetsÚcomposite_toolsetsÚscenario_toolsetsrª  r¶  ÚbucketÚ	all_toolsrÑ  s               r   Ú_print_tool_listingr‚  ‹  so  € çFß;ä	Ð
,Ô-Ü	ˆ(„OÜ	Ð
4Ô5Ü	ˆ(„OØ<>ÀÀBÐ(9€NÙ Ö"ˆÙ Ó%ˆß‰4Ø'+¬Ô'>‘^ÐZ^ÔbuÔZuÑDVð  |MˆFØ�M‰M˜4˜,Ö'ñ	 #ô
 
Ð
"Ô#Û$‰
ˆÜ��t˜B�i˜s 4¨Õ#6Ð"7Ð8Ô9Ü�ÀÐFV×AWÔAW˜DŸI™I dÐ+;Õ&<Ô=Ð]cÐdÐeÖfñ %ô 
Ð
BÔCÛ(‰
ˆÜ��t˜B�i˜s 4¨Õ#6Ð"7Ð8Ô9Ü�¸dÀ:×>NÔ>N˜tŸy™y¨¨jÕ)9Ô:ÐTZÐ[Ð\Ô]ÜÐ! $ |Õ"4Ð!5Ð6Ö7ñ )ô 
Ð
.Ô/Û'‰
ˆÜ��t˜B�i˜s 4¨Õ#6Ð"7Ð8Ô9ÜÐ! $ |Õ"4Ð!5Ð6Ö7ñ (ô 
Ð
@ÔAÙ,Ó.×4Ñ4Ö6‰
ˆÜ�˜D ×-Ô-‘5°5Ð9¸¸4¸&ÀÀ4ÈÕCVÐBWÐXÔYØ�K× Ö ÜÐ& t§y¡y°°nÕ1EÓ'FÐ&GÐHÖIñ 7ñ #Ó$€IÜ	Ð%¤c¨)£nÐ%5°\Ð
BÔCÜ˜IÖ&ˆ	Ü�˜	�{ 'Ô*>¸yÓ*IÐ)JÈ!ÐLÖMñ 'ä	Ô
Ör   c                ó~   € V ^8„  d   QhR\         \        ,          R\        R\         \        \        ,          ,          /# )r   Úrawr  r   )r   r   rŸ   )r   s   "r   r   r   ³  s.   € ÷ ñ œH¤S�Mð ´#ð ¼(Ä4ÌÅ9Õ:Mñ r   c                óž   € V '       g   R# V P                  R4       Uu. uF  q"P                  4       NK  	  pp\        V RV 24       V# u upi )uG   Comma-separated toolset CLI arg â†’ list (echoed), or None when absent.Nr¬  rs  )r"  r   rx  )r„  r  ÚtÚnamess   &&  r   Ú_parse_toolset_argrˆ  ³  sE   € çÙØ #§	¡	¨#¤Ó/¡˜1�W‰WŽY¡€EÐ/Ü	ˆUˆG�2�e�WÐ
ÔØ€Lùò 0s   žA
c          
      óL   € V ^8„  d   QhR\         R\        R\        R\        RR/# )r   r$   ÚresultÚ
user_queryrá   r   N)r%   r‘   r   )r   s   "r   r   r   ¼  s1   € ÷ 6ñ 6¤7ð 6´Dð 6Äcð 6ÔRUð 6ÐZ^ñ 6r   c           
     ó  € R\        \        P                  ! 4       4      R,           R2pRV P                  VR,          W!R,          4      R\        P
                  ! 4       P                  4       RVRVR,          R	V/p \        VR
RR7      ;_uu_ 4       pVP                  \        P                  ! VR^R7      4       RRR4       \        RV 24       R#   + '       g   i     L ; i  \         d   p\        RT 24        Rp?R# Rp?ii ; i)z```--save_sample``: write one trajectory (same format as batch_runner) to a UUID-named JSON file.Úsample_:Né   Nz.jsonÚconversationsrž   Ú	completedÚ	timestamprá   ÚqueryÚwzutf-8)ÚencodingF)Úensure_asciir  Nu"   
ðŸ’¾ Sample trajectory saved to: u   
âš ï¸� Failed to save sample: )r   ÚuuidÚuuid4Ú_convert_to_trajectory_formatr	   ÚnowÚ	isoformatÚopenÚwriterA   rB   rx  r@   )r$   rŠ  r‹  rá   Úsample_filenameÚentryÚfrT  s   &&&&    r   Ú_save_sample_trajectoryr   ¼  sà   € à¤¤D§J¢J£LÓ 1°"Õ 5Ð6°eÐ<€Oà˜×<Ñ<¸VÀJÕ=OÐQ[ÐdoÕ]pÓqØ”X—\’\“^×-Ñ-Ó/°¸%ÀÈfÐU`ÕNaÐcjÐlvð€Eð6Ü�/ 3°×9Õ9¸QØ�G‰G”D—J’J˜u°5ÀÔCÔD÷ :äÐ3°OÐ3DÐEÖF÷ :×9ûô ô 6ÜÐ0°°Ð4×5Ò5ûð6ús0   Á=C' Â)CÂ<C' ÃC$	ÃC' Ã'DÃ2DÄDc                óà   € V ^8„  d   QhR\         R,          R\         R\         R,          R\         R\        R\         R,          R\         R,          R	\        R
\        R\        R\        R\        /# )r   r’  Nrá   rÛ   rÒ   Ú	max_turnsrä   rå   Ú
list_toolsræ   Úsave_sampleÚverboserë   )r   rŠ   r�   )r   s   "r   r   r   Ë  s–   € ÷ J/ñ J/Ü��:ðJ/Ü%(ðJ/Ü8;¸d½
ðJ/ÜUXðJ/ÜjmðJ/ä˜D•jðJ/ä<?À$½JðJ/ä[_ðJ/ô ðJ/ô 37ðJ/ô JNðJ/ô jmñJ/r   c                óÒ  € \        R4       \        R4       V'       d   \        4       # ^ RIHp V! 4        \	        VR4      p\	        VR4      pV'       d"   \        R4       \        R4       \        R4        \        W1W$WÞWŠVR7	      pT e   T MRp\        RT 24       \        R4       TP                  T4      p\        R4       \        RTR,           RTR,           R\        TR,          4       24       TR,          '       d   \        RTR,          ,           4       T	'       d   \        TTTT4       \        R4       R
#   \         d   p\        R	T 24        R
p?R
# R
p?ii ; i)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 Calling)Úinstall_truststoreu   ðŸŽ¯ 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: u   âœ… Completed: r�  u   
ðŸ“ž API Calls: Ú	api_callsu   
ðŸ’¬ Messages: rž   ræ  u    
ðŸ‘‹ Agent execution completed!z2==================================================z3
==================================================u€   
==================================================
ðŸ“‹ CONVERSATION SUMMARY
==================================================u5   
ðŸŽ¯ FINAL RESPONSE:
------------------------------
)
rx  r‚  Úagent.ssl_verifyr§  rˆ  r%   ÚRuntimeErrorÚrun_conversationr¬   r   )r’  rá   rÛ   rÒ   r¢  rä   rå   r£  ræ   r¤  r¥  rë   r§  Úenabled_toolsets_listÚdisabled_toolsets_listr$   rT  r‹  rŠ  s   &&&&&&&&&&&&       r   Úmainr®  Ë  sk  € ô> 
Ð
+Ô,Ü	ˆ(„OßÜ"Ó$Ð$õ 4áÔä.Ð/?ÐAXÓYÐÜ/Ð0AÐC[Ó\ÐßÜÐ/Ô0ÜÐJÔKÜÐGÔHðÜØ°GØ2Ø/Ð[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   Á8E ÅE&ÅE!Å!E&Ú__main__)r®  )r  >   ÚwebÚvisionÚcreativeÚterminalr„  >   ÚanalysisÚresearchÚ
full_stackÚdevelopmentÚcontent_creation)Nr   Nr   é
   NNFFFFé   )˜rÆ   r   ÚModuleNotFoundErrorr„   rª  r<  ÚmodulesÚ
hermes_clir   Úrestore_interrupted_pullÚrelaunch_after_restorerA   ÚloggingÚ	getLoggerrÂ   r‚   r   r  Útimer¬  r–  r)  Útypingr   r   r   r   r   r	   Úpathlibr
   Úagent.session_sourcer   r   Úhermes_constantsr   r"   rE   Úagent.iteration_budgetrF   Úhermes_cli.env_loaderrG   Úhermes_cli.timeoutsrH   rI   Ú_hermes_homeÚ__file__ÚparentÚ_loaded_env_pathsÚ	_env_pathr¶  rv  rL   Útools.terminal_tool_lifecyclerM   rN   Útools.interruptrO   rJ  Útools.browser_tool_lifecyclerP   Útools.connectors.turnrQ   rR   Úagent.memory_providerrS   Úagent.client_lifecyclerT   Úagent.stream_deliveryrU   Úagent.status_outputrV   Úagent.api_request_hooksrW   Úagent.api_error_summaryrX   rY   Úagent.interrupt_controlrZ   Úagent.turn_explainersr[   Úagent.activity_trackingr\   Úagent.rate_limit_creditsr]   Úagent.session_persistencer^   Úagent.compression_facader_   Úagent.turn_facader`   Úagent.vision_message_prepra   Úagent.reasoning_paramsrb   Úagent.lazy_forwardrc   r?  rd   r@  rÈ  re   Úagent.model_metadatarf   Úagent.message_sanitizationrg   rQ  rh   rZ  ri   rV  r  rj   r]  rk   r\  rl   Úagent.tool_guardrailsrm   rn   ro   Ú/hermes_cli.observability.shared_metrics_harnessrp   rq   Úutilsrr   rs   rt   ru   Ú_MAX_TOOL_WORKERSÚEventÚ_openrouter_prewarm_doner{   r…   rŽ   r—   rœ   r¦   r¯   r@   r±   r%   ry  rz  r|  r‚  rˆ  r   r®  Úagent.legacy_cliÚ_legacy_cli_mainÚ
SystemExitrG  r   r   Ú<module>rî     sL  ðñðÛó
 ð ˜CŸK™KÔ'Ý*à×/Ò/×1Ò1Ø×.Ò.Ô0ã Û Ø	×	Ò	˜8Ó	$€Û 	Û 	Û Û Û Û ß 6Õ 6Ý Ý ç GÝ ,õõõD 3Ý 4ß XáÓ €Ù&°<ÉTÐRZË^×MbÑMbÐekÕMkÔlÐ Û"€IØ
‡K�KÐ6¸	ÖBñ #çØ
‡K�KÐIÔJõ -ß DÝ ;Ý 8ß Uå 3Ý 7Ý 5Ý 1Ý 8ß XÝ 9Ý 5Ý 9Ý :Ý =Ý ;Ý -Ý <Ý 7ß UÝ 5Ý 2÷ñ ÷
ñ ÷
 oÑ nß pß iÓ ið Ð ð %Ÿ?›?Ó,Ð õõKõcõ
\õ@õXõQôs˜	ô sô_ØÐ-Ð/@ÐBVÐXlØÐ.Ð0EÐG\ØÐ3°_ÐF\Ð^rô_òD% I€Ú_Ð ðJÐ õ"%õPõ6÷J/ðZ ˆzÔÝ9á
Ñ%¨$Ô/Ó
0Ð0ñ øðY0 ô Ø
‡x�xÐ%Ô%Øõ &ûðús   „J ÊJ,ÊJ'Ê'J,