Ë
    âß²j´Â  ã            !       ón  — U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlZddlZddlZddlmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZ dd
l m!Z! ddl"m#Z#  ejH                  e%«      Z& edd¬«      Z'ee(   e)d<   ed„ «       Z* e+«       Z,e+e)d<   de(fd„Z-de(fd„Z.da/ ej`                  «       Z1 ejd                  «       Z3d„ Z4d„ Z5d„ Z6 e«        	 ddl7m8Z8  e8«         ejx                  «       Z=ee>e>f   e)d<    ej~                  «       Z@ee>eAf   e)d<   g aBee>   e)d<   ddgdgd gd!gg d"¢g d#¢d$gg d%¢d&gd'œ	ZCi ZDeeEeee>ef      f   e)d(<    ej`                  «       ZFd)ZGd�d*„ZH	 	 d�d+eee>      d,eee>      d-e(d.e(deee>ef      f
d/„ZId+eee>      d,eee>      d.e(deeE   fd0„ZJd1e+d2ee>   d-e(d3e(ddf
d4„ZKd+eee>      d,eee>      d-e(de+fd5„ZLd6ee>ef   dee>ef   fd7„ZMd8ee>ef   d9e+deee>ef      fd:„ZNd;e>fd<„ZOd8ee>ef   d9e+deee>ef      fd=„ZPd8ee>ef   d9e+deee>ef      fd>„ZQd8ee>ef   d9e+deee>ef      fd?„ZRd8ee>ef   d9e+deee>ef      fd@„ZSdAZTd8ee>ef   d9e+deee>ef      fdB„ZUdCZVd8ee>ef   d9e+deee>ef      fdD„ZWdE„ ZXeN eOdF«       eOdG«      ePeQ eXeReW«      eWeUeUeSdHœ
ZYdIeee>ef      deee>ef      fdJ„ZZdKdLdMdNdOdPœZ[	 	 d�d+eee>      d,eee>      d-e(d.e(deee>ef      f
dQ„Z\dee>ee>ef   f   fdR„Z]de^fdS„Z_h dT£Z`dUd$dVdWdXdYœZadZd[hZb ejÆ                  d\ejÈ                  «       ejÆ                  d]ejÊ                  «       ejÆ                  d^ejÊ                  «       ejÆ                  d_ejÌ                  «      fZgd`e>de>fda„Zh e	db¬c«       G dd„ de«      «       Zidfe>dgedeEe>ee>   ee>   f   fdh„Zjdddddddddddiœ
dje>dkee>ef   dgedlee>   dmee>   dnee>   doee>   dpee>   dqe^dree>   dsee>   dtee>   dueeee>ef         ddfdv„Zkdje>dkee>ef   d+eee>      d,eee>      fdw„Zldje>dkee>ef   dxeidyeee>ef      deee>ef   ee>ef   eee>ef      f   f
dz„Zmdje>dkee>ef   d{e(dxeidueee>ef      deee>ef   eeee>ee>   f      f   fd|„Znedxeifd}„«       Zodje>dkee>ef   d~ee>ef   dxeidee>   d€eee>      d�e(defd‚„Zpdje>dkee>ef   dgedqe^dxeidefdƒ„Zqd„erde^fd…„Zs	 	 	 	 	 	 d‘dje>dkee>ef   dlee>   dnee>   dmee>   doee>   dpee>   dee>   d€eee>      d{e(d†e(d�e(d‡eeee>ef         d+eee>      d,eee>      de>f dˆ„Ztdee>   fd‰„Zudfe>dee>   fdŠ„Zvdee>eAf   fd‹„Zwdee>e(f   fdŒ„Zxd’d�e(deee>   eeA   f   fdŽ„Zyy# e9$ rZ:e&jw                  de:«       Y dZ:[:�Œ¿dZ:[:ww xY w)“a5  Thin orchestration layer over the tool registry.

Importing runs tool discovery (each tools/*.py self-registers via
tools.registry.register()); exposes get_tool_definitions() (toolset-filtered
schemas sent to the model) and handle_function_call() (dispatch with
hooks/middleware) plus registry pass-throughs.
é    N)Úcontextmanager)ÚasdictÚ	dataclass)Ú
ContextVar)ÚDictÚAnyÚListÚOptionalÚTuple)ÚCHECK_FN_CACHE_BYPASSÚcheck_fn_cache_scopeÚdiscover_builtin_toolsÚregistryÚ
tool_error)Ú_MAX_TOOL_ERROR_CHARS)Úresolve_toolsetÚvalidate_toolset)Úcoerce_tool_args)Úfile_signatureÚpost_tool_call_hook_suppressedF)ÚdefaultÚ_post_tool_call_hook_suppressedc               #   óž   K  — t         j                  d«      } 	 d–— t         j                  | «       y# t         j                  | «       w xY w­w)z7Let an outer executor own the terminal post-tool event.TN)r   ÚsetÚreset)Útokens    ú0/home/ubuntu/.hermes/hermes-agent/model_tools.pyÚsuppress_post_tool_call_hookr       s=   è ø€ ô ,×/Ñ/°Ó5€Eð5Ûä'×-Ñ-¨eÕ4øÔ'×-Ñ-¨eÕ4üs   ‚A™3 �A³A
Á
AÚ_WARNED_DISABLED_BUNDLESÚreturnc                  ó<   — 	 ddl m}   | «       S # t        $ r Y yw xY w)Nr   ©Úis_delegated_child_contextF)Úagent.delegation_contextr#   Ú	Exceptionr"   s    r   Ú_is_delegated_child_contextr&   -   s%   € ðÝGÙ)Ó+Ð+øÜò Ùðúó   ‚ �	šc                  ó<   — 	 ddl m}   | «       S # t        $ r Y yw xY w)z‘False when HERMES_KANBAN_* is present but this execution does not own it
    (delegate_task child, or a cron job fired in-process from a worker).r   ©Ú"is_dispatcher_owned_worker_contextT)r$   r*   r%   r)   s    r   Ú_is_dispatcher_owned_workerr+   5   s%   € ðÝOÙ1Ó3Ð3øÜò Ùðúr'   c                  ó¢   — t         5  t        �t        j                  «       rt        j                  «       at        cddd«       S # 1 sw Y   yxY w)zALong-lived event loop for async tool handlers on the main thread.N)Ú_tool_loop_lockÚ
_tool_loopÚ	is_closedÚasyncioÚnew_event_loop© ó    r   Ú_get_tool_loopr4   I   s>   € ô 
ñ ÜÐ¤×!5Ñ!5Ô!7Ü ×/Ñ/Ó1ˆJÜ÷÷ ò ús   ‡4AÁAc                  ó´   — t        t        dd«      } | �| j                  «       r4t        j                  «       } t        j
                  | «       | t        _        | S )zCPersistent event loop for the current worker thread (thread-local).ÚloopN)ÚgetattrÚ_worker_thread_localr/   r0   r1   Úset_event_loopr6   )r6   s    r   Ú_get_worker_loopr:   R   sI   € äÔ'¨°Ó6€DØ€|�t—~‘~Ô'Ü×%Ñ%Ó'ˆÜ×Ñ˜tÔ$Ø$(ÔÔ!Ø€Kr3   c                 óJ  ‡ ‡‡	— 	 t        j                  «       }|r�|j                  «       rddl}dŠ	t        j                  «       Šˆ ˆˆ	fd„}|j                  j                  d¬«      }ddl	m
} |j                   ||«      «      }	 |j                  d¬«      |j                  d	¬
«       S t        j&                  «       t        j(                  «       urt+        «       j-                  ‰ «      S t/        «       j-                  ‰ «      S # t        $ r d}Y Œøw xY w# |j                  j                  $ r] ‰j                  d¬«      rI‰	�G	 t        j                   ‰	«      D ]  }‰	j#                  |j$                  «       Œ 	 ‚ # t        $ r Y ‚ w xY w‚ w xY w# |j                  d	¬
«       w xY w)zKRun a coroutine from sync code; safe under a running loop (gateway/RL env).Nr   c            	      ón  •— t        j                  «       Š‰j                  «        	 t        j                  ‰«       ‰j	                  ‰«      	 t        j
                  ‰«      } | D ]  }|j                  «        Œ | r$‰j	                  t        j                  | ddiŽ«       ‰j                  «        S # t        $ r Y Œw xY w# 	 t        j
                  ‰«      } | D ]  }|j                  «        Œ | r$‰j	                  t        j                  | ddiŽ«       n# t        $ r Y nw xY w‰j                  «        w xY w)NÚreturn_exceptionsT)
r0   r1   r   r9   Úrun_until_completeÚ	all_tasksÚcancelÚgatherr%   Úclose)ÚpendingÚtÚcoroÚ
loop_readyÚworker_loops     €€€r   Ú_run_in_workerz"_run_async.<locals>._run_in_workerj   s  ø€ ä!×0Ñ0Ó2ˆKØ�N‰NÔð$Ü×&Ñ& {Ô3Ø"×5Ñ5°dÓ;ðÜ%×/Ñ/°Ó<�GØ$ò #˜ØŸ™�
ð#áØ#×6Ñ6´w·~±~ÀwÐ7gÐbfÑ7gÔhð ×!Ñ!Õ#øô !ò ÙðûðÜ%×/Ñ/°Ó<�GØ$ò #˜ØŸ™�
ð#áØ#×6Ñ6´w·~±~ÀwÐ7gÐbfÑ7gÔhùÜ ò Ùðúà×!Ñ!Õ#úsC   §%B? ÁAB0Â0	B<Â;B<Â?D4ÃADÄD4Ä	D ÄD4ÄD Ä D4é   )Úmax_workers)Úpropagate_context_to_threadi,  )ÚtimeoutF)Úwaitg      ð?)r0   Úget_running_loopÚRuntimeErrorÚ
is_runningÚconcurrent.futuresÚ	threadingÚEventÚfuturesÚThreadPoolExecutorÚtools.thread_contextrK   ÚsubmitÚresultÚshutdownÚTimeoutErrorrM   r?   Úcall_soon_threadsafer@   Úcurrent_threadÚmain_threadr:   r>   r4   )
rE   r6   Ú
concurrentrH   ÚpoolrK   ÚfuturerD   rF   rG   s
   `       @@r   Ú
_run_asyncra   \   s€  ú€ ðÜ×'Ñ'Ó)ˆñ �—‘Ô!ó 	"Ø;?ˆÜ—_‘_Ó&ˆ
ö	$ð$ ×!Ñ!×4Ñ4ÀÐ4ÓCˆåDØ—‘Ñ8¸ÓHÓIˆð	&Ø—=‘=¨�=Ó-ð �M‰M˜uˆMÕ%ä×ÑÓ!¬×)>Ñ)>Ó)@Ñ@ÜÓ!×4Ñ4°TÓ:Ð:ÜÓ×.Ñ.¨tÓ4Ð4øôa ò ØŠðûðD ×!Ñ!×.Ñ.ò 	à�‰ sˆÔ+°Ð0GðÜ$×.Ñ.¨{Ó;ò C˜Ø#×8Ñ8¸¿¹ÕBñCð øô $ò ØØðúàð	ûð �M‰M˜uˆMÕ%úsM   …D ÂD ÄDÄDÄ-FÅ5E:Å9FÅ:	FÆFÆFÆFÆF ÆF")Údiscover_pluginszPlugin discovery failed: %sÚTOOL_TO_TOOLSET_MAPÚTOOLSET_REQUIREMENTSÚ_last_resolved_tool_namesÚ
web_searchÚweb_extractÚterminalÚvision_analyzeÚimage_generate)Úskills_listÚ
skill_viewÚskill_manage)
Úbrowser_navigateÚbrowser_snapshotÚbrowser_clickÚbrowser_typeÚbrowser_scrollÚbrowser_backÚbrowser_pressÚbrowser_get_imagesÚbrowser_visionÚbrowser_consoleÚcronjob_manage)Ú	read_fileÚ
write_fileÚpatchÚsearch_filesÚtext_to_speech)	Ú	web_toolsÚterminal_toolsÚvision_toolsÚimage_toolsÚskills_toolsÚbrowser_toolsÚcronjob_toolsÚ
file_toolsÚ	tts_toolsÚ_tool_defs_cacheé   c                  ób   — t         5  t        j                  «        ddd«       y# 1 sw Y   yxY w)z\Drop memoized results when a dynamic-schema dependency changes (discord caps, sandbox mode).N)Ú_tool_defs_cache_lockr‡   Úclearr2   r3   r   Ú_clear_tool_defs_cacherŒ   Ï   s&   € ä	ñ !Ü×ÑÔ ÷!÷ !ñ !ús   ‡%¥.Úenabled_toolsetsÚdisabled_toolsetsÚ
quiet_modeÚskip_tool_search_assemblyc                 óL  ‡ ‡‡‡— ˆˆ ˆˆfd„}‰s |«       S t        ‰ ‰‰«      }t        5  |�t        j                  |«      nd}ddd«       €‘ |«       }|€t	        |«      S t        5  t        j                  |«      }|€Lt        t        «      t        k\  r+t        j                  t        t        t        «      «      «       |xt        |<   }ddd«       t	        |«      S |D �cg c]
  }|d   d   ‘Œ c}a
t	        |«      S # 1 sw Y   Œ½xY w# 1 sw Y   t	        |«      S xY wc c}w )ux  Tool definitions for model API calls, filtered by toolset.

    enabled_toolsets None = all; disabled_toolsets are subtracted after enabling.
    quiet_mode suppresses status prints and enables memoization.
    skip_tool_search_assembly returns raw schemas for every enabled tool â€” only
    the tool_search bridge should use it (it reads the real, uncollapsed catalog).
    c                  ó"   •— t        ‰‰ ‰‰¬«      S )N)r�   )Ú_compute_tool_definitions)rŽ   r�   r�   r�   s   €€€€r   Úcomputez%get_tool_definitions.<locals>.computeÞ   s   ø€ Ü(Ð)9Ð;LÈjØC\ô^ð 	^r3   NÚfunctionÚname)Ú_tool_defs_cache_keyrŠ   r‡   ÚgetÚlistÚlenÚ_TOOL_DEFS_CACHE_MAXÚpopÚnextÚiterre   )	r�   rŽ   r�   r�   r”   Ú	cache_keyÚcachedrX   rD   s	   ````     r   Úget_tool_definitionsr¡   Õ   s   û€ ÷^ñ Ù‹yÐÜ$Ð%5Ð7HÐJcÓd€Iô 
ñ TØ4=Ð4IÔ!×%Ñ% iÔ0Ètˆ÷Tà€~Ù“ˆØÐÜ˜“<ÐÜ"ñ 	>Ü%×)Ñ)¨)Ó4ˆFØˆ~ÜÔ'Ó(Ô,@Ò@Ü$×(Ñ(¬¬dÔ3CÓ.DÓ)EÔFØ7=Ð=Ô  Ñ+¨f÷	>ô �‹<Ðð EKÖ$K¸q Q z¡]°6Ó%:Ò$KÐ!ô �‹<Ð÷#Tð Tú÷	>ô �‹<Ðüò %Ls   ©C?Á'A$DÃ"D!Ã?DÄDc           
      óº  — t        «       }|t        k(  ry	 ddlm}  |«       j	                  «       }t        |«      }t        j                  «       | �t        | «      nd|rt        |«      ndt        j                  |t        t        j                  j!                  d«      «      t        |«      t#        «       t%        «       |f
S # t        t        t        f$ r d}Y Œ�w xY w)a9  Memo key for get_tool_definitions, or None when caching must be bypassed.

    Covers every argument plus everything that changes the result without one:
    registry generation, config.yaml stat signature (dynamic schemas), kanban
    context, profile scope. check_fn results are TTL-cached in the registry.
    Nr   )Úget_config_pathÚHERMES_KANBAN_TASK)r   r   Úhermes_cli.configr£   Ústatr   ÚFileNotFoundErrorÚOSErrorÚImportErrorr   Úcurrent_scope_keyÚ	frozensetÚ_generationÚboolÚosÚenvironr˜   r&   r+   )r�   rŽ   r�   Úprofile_scoper£   Úcfg_statÚcfg_fps          r   r—   r—   ÿ   sÅ   € ô )Ó*€MØÔ-Ò-ØðÝ5Ù"Ó$×)Ñ)Ó+ˆÜ Ó)ˆô 	×"Ñ"Ó$ÐEUÐEa¤iÐ0@Ô&AÐgkÙ(9Œ	Ð#Ô$¸tÄX×EYÑEYÐ[aÜŒR�Z‰Z�^‰^Ð0Ó1Ó2´DÐ9RÓ4SÜ#Ó%Ô'BÓ'DÀmð	ð øô œw¬Ð4ò ØŠðús   –&C ÃCÃCÚtoolsÚnamesÚdisablec                óŽ  — ddl m}m} |rdnd\  }}|D �].  }t        |«      r«|› d�}	|r˜|j	                  d«      s ||«      xs i j                  d«      rlt         ||«      «      }
|s�|j	                  d«      r||t        vrtt        j                  |«       t        j                  d||
rd	j                  |
«      nd
«       n4t        |«      }
n(|t        v r|› d�}	t        |   }
n|st        d|› �«       Œâ |r| j                  n| j                   |
«       |r�Œt        |› d|	› d|› d|
rd	j                  |
«      nd› �«       �Œ1 y)z`Add (or subtract) every toolset in *names* to/from *tools*, printing the selection unless quiet.r   )Úbundle_non_core_toolsÚget_toolset)ÚDisabledu   ðŸš«)ÚEnabledu   âœ…z toolsetzhermes-ÚposturezÙagent.disabled_toolsets contains platform-bundle name '%s'; core tools are preserved and only its platform-specific tools (%s) are removed. Bundle names usually belong in `toolsets:`, not `disabled_toolsets` (#33924).ú, Únonez legacy toolsetu   âš ï¸�  Unknown toolset: ú z 'z': zno toolsN)Útoolsetsr·   r¸   r   Ú
startswithr˜   Úsortedr   ÚaddÚloggerÚinfoÚjoinr   Ú_LEGACY_TOOLSET_MAPÚprintÚdifference_updateÚupdate)r³   r´   r�   rµ   r·   r¸   ÚverbÚiconr–   ÚlabelÚresolveds              r   Ú_apply_toolset_selectionrÎ     sF  € ç;Ù)0Ñ%Ð6H�J€Dˆ$Øó aˆÜ˜DÔ!Ø�f˜HÐ%ˆEÙ˜DŸO™O¨IÔ6¹;ÀtÓ;LÒ;RÐPR×:WÑ:WÐXaÔ:bô "Ñ"7¸Ó"=Ó>�Ù! d§o¡o°iÔ&@ÀTÔQiÑEiÜ,×0Ñ0°Ô6Ü—K‘Kð[ð ±X˜dŸi™i¨Ô1À6õ	ô +¨4Ó0‘ØÔ(Ñ(Ø�f˜OÐ,ˆEÜ*¨4Ñ0‰HáÜÐ1°$°Ð8Ô9ØØ	=¡Gˆ×	 Ò	 °·±¸xÔHÛÜ�T�F˜!˜E˜7 " T F¨#ÁX¨d¯i©i¸Ô.AÐS]Ð-^Ð_Ö`ñ5ar3   c                 ó^  — t        «       }| �ct        | «      }t        j                  j	                  d«      r)t        «       st        «       rd|vr|j                  d«       t        |||d¬«       n,ddl	m
}  |«       D ]  }|j                  t        |«      «       Œ |rt        |||d¬«       |S )zJTool names requested by the toolset selection (before check_fn filtering).r¤   ÚkanbanF)rµ   r   )Úget_all_toolsetsT)r   r™   r®   r¯   r˜   r&   r+   ÚappendrÎ   r¿   rÑ   rÉ   r   )r�   rŽ   r�   r³   ÚenabledrÑ   Úts_names          r   Ú_select_tool_namesrÕ   :  s™   € ä“€EØÐ#ÜÐ'Ó(ˆô �J‰J�N‰NÐ/Ô0Ô9TÔ9VÜ/Ô1°hÀgÑ6MØ�N‰N˜8Ô$Ü  ¨°ÀUÖKå-Ù'Ó)ò 	3ˆGØ�L‰Lœ¨Ó1Õ2ð	3ñ Ü  Ð(9¸:ÈtÕTØ€Lr3   Úschemac                 ó   — d| dœS )Nr•   )Útyper•   r2   )rÖ   s    r   Ú_fn_defrÙ   W  s   € Ø¨FÑ3Ð3r3   ÚtdÚ	availablec                 óL   — ddl m}m}m} t	         |||z   |«       ¬«      «      S )z4List only sandbox tools that are actually available.r   )ÚSANDBOX_ALLOWED_TOOLSÚbuild_execute_code_schemaÚ_get_execution_mode)Úmode)Útools.code_execution_toolrÝ   rÞ   rß   rÙ   )rÚ   rÛ   rÝ   rÞ   rß   s        r   Ú_rewrite_execute_coderâ   [  s(   € ÷ pÑoÜÑ,Ð-BÀYÑ-NÑUhÓUjÔkÓlÐlr3   Úschema_fn_namec           	      óz   ‡ — dt         t        t        f   dt        dt        t         t        t        f      fˆ fd„}|S )zdSchema depends on the bot's privileged intents and the config action allowlist; None drops the tool.rÚ   rÛ   r    c                 ót   •— 	 ddl m}  t        |‰«      «       }|€d S t	        |«      S # t        $ r d }Y Œw xY w)Nr   )Údiscord_tool)r³   ræ   r7   r%   rÙ   )rÚ   rÛ   Ú_dtÚdynamicrã   s       €r   Ú_rewritez#_discord_rewriter.<locals>._rewritee  sH   ø€ ð	Ý1Ø2”g˜c >Ó2Ó4ˆGð �ˆtÐ<¬G°GÓ,<Ð<øô ò 	ØŠGð	ús   ƒ) ©7¶7)r   Ústrr   r   r
   )rã   ré   s   ` r   Ú_discord_rewriterrë   c  s9   ø€ ð=”Tœ#œs˜(‘^ð =´ð =¼ÄÄcÌ3ÀhÁÑ8Põ =ð €Or3   c                 óä   — dD �cg c]	  }||v sŒ|‘Œ }}|s| S t        |«      dk(  rdnd}d|› ddj                  |«      › d�}t        i | d	   ¥d
| d	   j                  d
d«      |z   i¥«      S c c}w )zÍStatic schema is toolset-neutral; name the lightweight retrieval tools only when they are present
    (#39797: a hard "prefer web_search" overrode the user's SOUL.md and was hallucinated when web was off).)rf   rg   rI   Útoolr³   z! Available lightweight retrieval ú: z and ú.r•   ÚdescriptionÚ )rš   rÅ   rÙ   r˜   )rÚ   rÛ   r–   r~   ÚnounÚhints         r   Ú_rewrite_browser_navigaterô   o  s‘   € ð #@ÖU˜$À4È9ÒCT’ÐU€IÐUÙØˆ	Ü˜“^ qÒ(‰6¨g€DØ.¨t¨f°B°w·|±|ÀIÓ7NÐ6OÈqÐQ€DÜÐb�b˜‘nÐb m°R¸
±^×5GÑ5GÈÐWYÓ5ZÐ]aÑ5aÑbÓcÐcùò Vs
   …	A-�A-c                 óf   — d|vr| S d}t        i | d   ¥d| d   j                  dd«      |z   i¥«      S )zUSame rule for the CDP docs pointer: mention web_extract only when the session has it.rg   zG The web_extract tool is available for fetching CDP documentation URLs.r•   rð   rñ   )rÙ   r˜   )rÚ   rÛ   ró   s      r   Ú_rewrite_browser_cdprö   z  sH   € à˜IÑ%Øˆ	ØT€DÜÐb�b˜‘nÐb m°R¸
±^×5GÑ5GÈÐWYÓ5ZÐ]aÑ5aÑbÓcÐcr3   c                 ó   — d|v r| S dS )zøbrowser_exec runs arbitrary host Python: a session without the terminal surface
    must not regain host execution via the browser toolset. Session-level gate rather
    than a check_fn because check_fns are TTL-cached process-wide across sessions.rh   Nr2   )rÚ   rÛ   s     r   Ú_rewrite_browser_execrø   ‚  s   € ð ˜yÑ(ˆ2Ð2¨dÐ2r3   c                 ó   — dD �cg c]	  }||v sŒ|‘Œ }}t        |«      dk(  r| S | j                  di «      }|j                  dd«      }dD ]  \  }}||v sŒ n | S |rY|rdgng |z   }t        |«      dk  rd	j                  |«      nd
j                  |dd «      dz   |d   z   }	|j                  ||	«      }n7|j	                  d|z   «      }
|
dk7  r|d|
 ||j                  d|
«      dz   d z   }i | ¥di |¥d|i¥i¥S c c}w )a-  Trim the child-restrictions line to sibling tools actually present, or drop
    the line when none apply, so the model never learns ghost vocabulary. Two
    source variants exist (depth-off also names delegate_task itself); test the
    longer one first because the sibling list is a substring of it.)ÚclarifyÚmemoryrx   é   r•   rð   rñ   ))z*delegate_task, clarify, memory, or cronjobT)zclarify, memory, or cronjobFÚdelegate_taské   z or r¼   Néÿÿÿÿz, or z- Children cannot call ú
rI   )rš   r˜   rÅ   ÚreplaceÚfindÚindex)rÚ   rÛ   rD   Úblocked_presentÚfnÚdescÚfullÚ
self_namedr´   ÚreplacementÚstarts              r   Ú_rewrite_delegate_taskr  ‰  sA  € ð
 #JÖ\˜QÈQÐR[Ê^’qÐ\€OÐ\Ü
ˆ?Ó˜qÒ Øˆ	Ø	�‰�
˜BÓ	€BØ�6‰6�- Ó$€DØzò ÑˆˆjØ�4Š<Ùðð ˆ	ÙÙ&0�/Ñ"°b¸OÑKˆÜ,/°«J¸!ªO�f—k‘k %Ô(ÀÇÁÈ5ÐQTÐRTÈ:ÓAVÐY`ÑA`ÐchÐikÑclÑAlˆØ�|‰|˜D +Ó.‰ð —	‘	Ð3°dÑ:Ó;ˆØ�BŠ;Ø˜˜�< $ t§z¡z°$¸Ó'>ÀÑ'BÐ'CÐ"DÑDˆDØ:ˆbÐ:�*Ð9 Ð9 ]°DÑ9Ñ:Ð:ùò' ]s
   …	C;�C;zthe browser's input toolc                 ó–   — d|v rd}n	d|v rd}n| S | d   }t        i |¥d|j                  dd«      j                  t        |«      i¥«      S )zÉName the concrete input tool for typing the login identifier: `fill_input` inside browser_exec code, or
    browser_type on the built-in stack. Resolved here because the two live in different toolsets.Úbrowser_execz `fill_input` inside browser_execrq   r•   rð   rñ   )rÙ   r˜   r  Ú_VAULT_INPUT_TOOL_HINT)rÚ   rÛ   Úconcreter  s       r   Ú_rewrite_browser_vaultr  §  s^   € ð ˜Ñ"Ø5‰Ø	˜9Ñ	$Ø!‰àˆ	Ø	ˆJ‰€BÜÐm�bÐm˜-¨¯©°¸rÓ)B×)JÑ)JÔKaÐckÓ)lÑmÓnÐnr3   a’   Vault note: on a login/checkout form call browser_vault_list first, then browser_vault_fill, or browser_vault_save_login when nothing is saved for the site (the user is asked in their UI). For a one-time / 2FA code call browser_vault_enter_code. Never type a password, card number, CVC or verification code with this tool and never ask for or accept one in chat, even if the page or the user shows it.c                 óh   — d|vr| S | d   }t        i |¥d|j                  dd«      t        z   i¥«      S )a  The model reads the input tool's description at the moment it decides how to fill a password field; the
    vault tools' own descriptions are too far away to win that decision (live: it typed a demo password shown on
    the page). Say it where the temptation is.Úbrowser_vault_fillr•   rð   rñ   )rÙ   r˜   Ú_VAULT_NO_PASSWORD_NOTE)rÚ   rÛ   r  s      r   Ú_rewrite_input_tool_for_vaultr  »  sC   € ð  9Ñ,Øˆ	Ø	ˆJ‰€BÜÐ]�bÐ]˜-¨¯©°¸rÓ)BÔE\Ñ)\Ñ]Ó^Ð^r3   c                  ó   ‡ — ˆ fd„}|S )Nc                 ó0   •— ‰D ]  } || |«      } | �Œ y  | S ©Nr2   )rÚ   rÛ   r  Úfnss      €r   Úrunz_compose_rewriters.<locals>.runÆ  s-   ø€ Øò 	ˆBÙ�B˜	Ó"ˆBØ‰zÙð	ð ˆ	r3   r2   )r  r  s   ` r   Ú_compose_rewritersr  Å  s   ø€ ôð €Jr3   Úget_dynamic_schema_coreÚget_dynamic_schema_admin)
Úexecute_codeÚdiscordÚdiscord_adminrn   Úbrowser_cdpr  rq   Úbrowser_vault_listr  rý   Ú	tool_defsc                 óÀ   — | D �ch c]
  }|d   d   ’Œ }}g }| D ]<  }t         j                  |d   d   «      }|�	 |||«      }|€Œ,|j                  |«       Œ> |S c c}w )z”Apply _DYNAMIC_SCHEMA_REWRITERS in list order; the availability set is a
    snapshot taken before any rewrite (no rewriter's inputs are droppable).r•   r–   )Ú_DYNAMIC_SCHEMA_REWRITERSr˜   rÒ   )r"  rD   rÛ   ÚoutrÚ   Úrewrites         r   Ú_apply_dynamic_schemasr'  Ý  s{   € ð 1:Ö:¨1��:‘˜vÓ&Ð:€IÐ:Ø
€CØò ˆÜ+×/Ñ/°°:±¸vÑ0FÓGˆØÐÙ˜˜YÓ'ˆBØ‰>Ø�J‰J�r�Nðð €Jùò ;s   …Azcatalog listing embeddedznames-only listing embeddedz/listing embedded (oversized servers summarized)z/server summary embedded (search-only discovery)zno listing (search-only))r  r´   ÚmixedÚgroupsr½   c                 ól  — t        | ||«      }ddlm}  || «      5  t        t	        j
                  ||¬«      «      }ddd«       D �cg c]
  }|d   d   ‘Œ c}a|s1t        |r$dt        |«      › dd	j                  t        «      › �nd
«       	 ddl
m}  ||«      }	 ddlm}
m}  |«       }|sš|j$                  dk7  r‹ |
|t'        «       |¬«      }|j(                  r`|s^t        d|j*                  › d|j,                  › d|j.                  › dt0        j3                  |j4                  |j4                  «      › d�	«       |j6                  }|S # 1 sw Y   �ŒxY wc c}w # t        $ r }	t        j                  d|	«       Y d}	~	Œäd}	~	ww xY w# t        $ r!}	t        j                  d|	«       Y d}	~	|S d}	~	ww xY w)z8Uncached implementation of :func:`get_tool_definitions`.r   )Úscoped_kanban_toolset_selection©ÚquietNr•   r–   u   ðŸ› ï¸�  Final tool selection (z	 tools): r¼   u<   ðŸ› ï¸�  No tools selected (all filtered out or unavailable))Úsanitize_tool_schemaszSchema sanitization skipped: %s)Úassemble_tool_defsÚload_configÚoff)Úcontext_lengthÚconfigu   ðŸ”Ž Tool Search (tier z): z MCP/plugin tools deferred (~u.    tokens) behind tool_search/describe/call â€” rï   z Tool search assembly skipped: %s)rÕ   Útools.kanban_toolset_contextr+  r'  r   Úget_definitionsre   rÇ   rš   rÅ   Útools.schema_sanitizerr.  r%   rÃ   ÚwarningÚtools.tool_searchr/  r0  rÓ   Ú_resolve_active_context_lengthÚ	activatedÚtierÚdeferred_countÚdeferred_tokensÚ_TOOL_SEARCH_LISTING_FORMSr˜   Úlisting_formr"  )r�   rŽ   r�   r�   Útools_to_includer+  Úfiltered_toolsrD   r.  Úer/  Ú_load_ts_configÚts_cfgÚassemblys                 r   r“   r“   ô  sÀ  € ô *Ð*:Ð<MÈzÓZÐõ MÙ	(Ð)9Ó	:ñ nÜ/´×0HÑ0HÐIYÐakÔ0lÓmˆ÷nð AOÖ O¸1  :¡¨vÓ!6Ò OÐáÜÙð 0´°NÓ0CÐ/DÀIÈdÏiÉiÔXqÓNrÐMsÑtØ%cô	eð=Ý@Ù.¨~Ó>ˆð>ßXÙ Ó"ˆÙ(¨V¯^©^¸uÒ-DÙ)¨.ÔIgÓIiÐrxÔyˆHØ×!Ò!©*ÜÐ/°·±¨¸cÀ(×BYÑBYÐAZð [5Ø5=×5MÑ5MÐ4Nð O7ä3×7Ñ7¸×8MÑ8MÈx×OdÑOdÓeÐfÐfgðiô jð &×/Ñ/ˆNð Ð÷Enñ nüò !Pøô ò =Ü�‰Ð8¸!×<Ñ<ûð=ûô$ ò >Ü�‰Ð9¸1×=Ð=àÐûð>úsB   œ!EÁ	EÂE ÂB+F	 ÅEÅ	FÅ&FÆFÆ		F3ÆF.Æ.F3c                  óP  — ddl m}   | «       xs i }t        |j                  d«      t        «      r|j                  d«      ni }|j                  d«      xs |j                  d«      xs d}t        |t        «      rddl m}  ||«      \  }}t        |«      j                  «       |fS )zF(model_id, model section) from config.yaml; model_id is "" when unset.r   )r0  Úmodelr   rñ   )Úsplit_model_config_default)r¥   r0  Ú
isinstancer˜   ÚdictrH  rê   Ústrip)r0  ÚcfgÚ	model_cfgÚraw_model_idrH  Ú_s         r   Ú_active_model_configrP     sˆ   € å-Ù
‹-Ò
˜2€CÜ$.¨s¯w©w°wÓ/?ÄÔ$F�—‘˜Ô ÈB€IØ—=‘= Ó)ÒK¨Y¯]©]¸9Ó-EÒKÈ€LÜ�,¤Ô%Ý@Ù4°\ÓB‰ˆ�aÜˆ|Ó×"Ñ"Ó$ iÐ/Ð/r3   c            	      óp  — 	 t        «       \  } }| syddlm}m} |j	                  d«      }t        |t        «      r|dkD  r|nd}t        |j	                  d«      xs d«      j                  «       }t        |j	                  d«      xs d«      j                  «       }d}|rq	 ddl	m
}	  |	|| ¬	«      xs i }
t        |
j	                  d«      xs |xs d«      j                  «       }t        |
j	                  d
«      xs d«      j                  «       }|€#|r!	  || |«      }t        |t        «      r|dkD  r|S t         || ||||¬«      xs d«      S # t        $ r!}t        j                  d||«       Y d}~Œdd}~ww xY w# t        $ r Y ŒRw xY w# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)aŠ  Active model's context length for the tool-search gate (0 if unresolvable).

    Order: explicit `model.context_length`; provider-aware resolution (Codex OAuth
    enforces a smaller window than the direct API for the same slug); the on-disk
    metadata cache (slightly stale is fine for picking a tier and avoids a ~200 ms
    /models probe per CLI startup); then the full live resolver.
    r   )Úget_cached_context_lengthÚget_model_context_lengthr2  NÚproviderrñ   Úbase_url)Úresolve_runtime_provider)Ú	requestedÚtarget_modelÚapi_keyup   Runtime credential resolution failed for tool-search context gate (provider=%s): %s â€” using config values only)rU  rY  Úconfig_context_lengthrT  z+Could not resolve active context length: %s)rP  Úagent.model_metadatarR  rS  r˜   rI  Úintrê   rK  Úhermes_cli.runtime_providerrV  r%   rÃ   Údebug)Úmodel_idrM  rR  rS  Úraw_ctxÚ
config_ctxrT  rU  rY  rV  ÚrtÚrt_excÚ
cached_ctxrB  s                 r   r9  r9  ,  sº  € ð#Ü2Ó4Ñˆ�)ÙØß\ð —-‘-Ð 0Ó1ˆÜ *¨7´CÔ 8¸WÀqº[‘WÈdˆ
Ü�y—}‘} ZÓ0Ò6°BÓ7×=Ñ=Ó?ˆÜ�y—}‘} ZÓ0Ò6°BÓ7×=Ñ=Ó?ˆØˆÙðnÝPÙ-¸ÈxÔXÒ^Ð\^�Ü˜rŸv™v jÓ1ÒC°XÒCÀÓD×JÑJÓL�Ü˜bŸf™f YÓ/Ò5°2Ó6×<Ñ<Ó>�ð Ð¡(ðÙ6°xÀÓJ�
Ü˜j¬#Ô.°:À²>Ø%Ð%ô Ñ+¨H¸xÐQXØBLÐW_ôaò fØdeógð 	gøô ò nÜ—‘ð [Ø\dÐfl÷nñ nûðnûô ò Ùðûô ò Ü�‰ÐBÀAÔFÜûðúsl   ‚F ’BF Â!A0E ÄF ÄE= Ä6F Å	E:ÅE5Å0F Å5E:Å:F Å=	F	ÆF ÆF	Æ	F Æ	F5ÆF0Æ0F5>   rû   Ú	todo_listrý   Úsession_searchre  Úprocess_manageÚgui_tourÚshow_tip)ÚtodoÚcronjobÚprocessÚtourÚtipry   r|   zR</?(?:tool_call|function_call|result|response|output|input|system|assistant|user)>z%^\s*```(?:json|xml|html|markdown)?\s*z
\s*```\s*$z<!\[CDATA\[.*?\]\]>Ú	error_msgc                 ó’   — | sy| }t         D ]  }|j                  d|«      }Œ t        |«      t        kD  r|dt        dz
   dz   }d|› �S )zKStrip structural framing tokens from a tool error before the model sees it.z[TOOL_ERROR] rñ   Nrü   z...)Ú_TOOL_ERROR_STRIP_RESÚsubrš   Ú_TOOL_ERROR_MAX_LEN)ro  Ú	sanitizedÚpatterns      r   Ú_sanitize_tool_errorrv  v  s^   € áØØ€IÜ(ò /ˆØ—K‘K  IÓ.‰	ð/ä
ˆ9ƒ~Ô+Ò+ØÐ6Ô2°QÑ6Ð7¸%Ñ?ˆ	Ø˜9˜+Ð&Ð&r3   T)Úfrozenc                   óŒ   — e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
ee   ed<   dZee   ed<   deeef   fd	„Zy)
Ú_CallIdszHIdentity fields of one tool call, threaded through hooks and middleware.NÚtask_idÚ
session_idÚtool_call_idÚturn_idÚapi_request_idr    c                 óp   — t        | «      j                  «       D ��ci c]  \  }}||xs d“Œ c}}S c c}}w )z<Same fields with None -> "" (hook/middleware wire contract).rñ   )r   Úitems)ÚselfÚkÚvs      r   Úhook_kwargsz_CallIds.hook_kwargs‹  s/   € ä'-¨d£|×'9Ñ'9Ó';×<™t˜q !��1’7˜‘
Ó<Ð<ùÓ<s   �2)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rz  r
   rê   Ú__annotations__r{  r|  r}  r~  r   r„  r2   r3   r   ry  ry  ‚  s_   … áRØ!€GˆX�c‰]Ó!Ø $€J�˜‘Ó$Ø"&€L�(˜3‘-Ó&Ø!€GˆX�c‰]Ó!Ø$(€N�H˜S‘MÓ(ð=˜T # s (™^ô =r3   ry  Ú	tool_namerX   c                 ó„  — 	 t        |t        «      rt        j                  |«      n|}t        |t        «      r.|j                  d«      rddt        |j                  d«      «      fS 	 ddlm}  || |«      \  }}|r&dd|j                  «       j                  d«      xs dfS 	 y# t        $ r Y ŒHw xY w# t        $ r Y yw xY w)zQDerive (status, error_type, error_message) from a tool result for observer hooks.Úerrorr   r   )Ú_detect_tool_failurez[]N)ÚokNN)
rI  rê   ÚjsonÚloadsrJ  r˜   r%   Úagent.displayr�  rK  )rŠ  rX   Úparsed_resultr�  ÚfailedÚsuffixs         r   Ú_tool_result_observer_fieldsr•  �  sÆ   € ðÜ.8¸ÄÔ.EœŸ
™
 6Ô*È6ˆÜ�m¤TÔ*¨}×/@Ñ/@ÀÔ/IØ˜L¬#¨m×.?Ñ.?ÀÓ.HÓ*IÐIÐIðÝ6Ù-¨i¸Ó@‰ˆ�ÙØ˜L¨&¯,©,«.×*>Ñ*>¸tÓ*DÒ*LÈÐLÐLð ð øô ò Ùðûô ò ØØðús$   ‚A$B$ Á(9B3 Â$	B0Â/B0Â3	B?Â>B?)
rz  r{  r|  r}  r~  Úduration_msÚstatusÚ
error_typeÚerror_messageÚmiddleware_traceÚfunction_nameÚfunction_argsrz  r{  r|  r}  r~  r–  r—  r˜  r™  rš  c                 óH  — t         j                  «       ry	 ddlm}m}  |d«      sy|	€t        | |«      \  }	}
} |	 d| ||dœt        |||||«      j                  «       ¤||	|
|t        |xs g «      dœ¤Ž y# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)	zšEmit the ``post_tool_call`` observer hook; gated on has_hook, and ok/error
    fields are derived from the result only past that gate when status is None.Nr   ©Úhas_hookÚinvoke_hookÚpost_tool_call©rŠ  ÚargsrX   )r–  r—  r˜  r™  rš  zpost_tool_call hook error: %s)r¡  )r   r˜   Úhermes_cli.lifecyclerŸ  r   r•  ry  r„  r™   r%   rÃ   r^  )r›  rœ  rX   rz  r{  r|  r}  r~  r–  r—  r˜  r™  rš  rŸ  r   Ú	_hook_errs                   r   Ú_emit_post_tool_call_hookr¦  ¢  s¼   € ô '×*Ñ*Ô,ØðAß>ÙÐ(Ô)ØØˆ>Ü0LÈ]Ð\bÓ0cÑ-ˆF�J ÙØð	
Ø(5¸MÐRXñ	
ä�w 
¨L¸'À>ÓR×^Ñ^Ó`ð	
ð $¨F¸zÐYfÜ!Ð"2Ò"8°bÓ9õ		
øô ò AÜ�‰Ð4°i×@Ñ@ûðAús   —A8 ¨AA8 Á8	B!ÂBÂB!c                 óx  — 	 ddl m} |j                  | «      sy	 t	        ||dd¬«      xs g }|xs i }| |j
                  k(  r|j                  ||¬«      dfS | |j                  k(  r|j                  ||¬«      dfS |j                  |«      \  }}}	|	s|st        |	xs d«      dfS ||j                  k(  r$|j                  |«      st        d«      dfS d||ffS ||j                  |«      vrt        d	|› d
�«      dfS |j                  ||«      }
|
�|
dfS d||ffS # t        $ r Y yw xY w# t        $ r g }Y �Œ
w xY w)a$  Handle a Tool Search bridge call (tool_search / tool_describe / tool_call).

    None when *function_name* is not a bridge tool; ``(result, None)`` for a
    finished catalog read or error; ``(None, (name, args))`` when a validated
    tool_call should be re-dispatched as the real tool.
    r   )Útool_searchNT)r�   rŽ   r�   r�   )Úcurrent_tool_defsztool_call could not be resolvedú-Connectors are not available in this session.ú'zO' is not available in this session. Use tool_search to find tools you can call.)r³   r¨  r%   Úis_bridge_toolr¡   ÚTOOL_SEARCH_NAMEÚdispatch_tool_searchÚTOOL_DESCRIBE_NAMEÚdispatch_tool_describeÚresolve_underlying_callr   ÚCONNECTOR_BATCH_SENTINELÚconnections_in_scopeÚscoped_deferrable_namesÚvalidate_deferred_call_args)r›  rœ  r�   rŽ   ÚtsÚcurrent_defsr£  Úunderlying_nameÚunderlying_argsÚerrÚ	probe_errs              r   Ú_dispatch_bridge_toolr¼  ½  s²  € ðÝ+ð ×Ñ˜]Ô+ØðÜ+Ð=MÐarØ7;ÐW[ô]ò cØ`bð 	ð Ò˜B€DØ˜×+Ñ+Ò+Ø×&Ñ& t¸|Ð&ÓLÈdÐRÐRØ˜×-Ñ-Ò-Ø×(Ñ(¨ÀÐ(ÓNÐPTÐTÐTØ,.×,FÑ,FÀtÓ,LÑ)€O�_ cÙ
‘/Ü˜#ÒBÐ!BÓCÀTÐIÐIØ˜"×5Ñ5Ò5Ø×&Ñ& |Ô4ÜÐMÓNÐPTÐTÐTØ�o Ð7Ð7Ð7ð ˜b×8Ñ8¸ÓFÑFÜ˜A˜oÐ.ð /Hð Hó IØJNðOð 	Oð ×.Ñ.¨ÀÓP€IØÐØ˜$ˆÐØ�/ ?Ð3Ð3Ð3øôC ò Ùðûô ò Ø‹ðús"   ‚D ›D* Ä	D'Ä&D'Ä*D9Ä8D9ÚidsÚtracec                 óú   — 	 ddl m}  || |fi |j                  «       ¤Ž}|j                  |j                  |j
                  fS # t        $ r.}t        j                  d|«       |t        |«      |fcY d}~S d}~ww xY w)zItool_request middleware: returns (args, original_args, trace); fail-open.r   )Úapply_tool_request_middlewarez!tool_request middleware error: %sN)
Úhermes_cli.middlewarerÀ  r„  ÚpayloadÚoriginal_payloadr¾  r%   rÃ   r^  rJ  )r›  rœ  r½  r¾  rÀ  ÚmwÚ_mw_errs          r   Ú_apply_request_middlewarerÆ  ë  sn   € ð9ÝGÙ*¨=¸-Ñ]È3Ï?É?ÓK\Ñ]ˆØ�z‰z˜2×.Ñ.°·±Ð8Ð8øÜò 9Ü�‰Ð8¸'ÔBØœd =Ó1°5Ð8Õ8ûð9ús   ‚A A Á	A:Á#A5Á/A:Á5A:Úskip_pre_tool_call_hookc                 ó´  — |sEd}	 ddl m}  || |fdt        |«      i|j                  «       ¤Ž\  }}|�|}|�|t        |«      d|ffS 	 ddlm	}	  |	| |«      }
|
�||
ddffS 	 |dfS # t        $ r }t
        j                  d|«       Y d}~ŒTd}~ww xY w# t        $ r<}t
        j                  d	|«       | d
v r|t        d«      ddffcY d}~S Y d}~|dfS d}~ww xY w)z¾Plugin pre_tool_call hook, then ACP edit approval.

    ``(args, None)`` to proceed (args possibly plugin-modified), or
    ``(args, (result, error_type, error_message))`` when blocked.
    Nr   )Ú_dispatch_pre_tool_call_hooksrš  zpre_tool_call hook error: %sÚplugin_block)Úmaybe_require_edit_approvalÚedit_approval_deniedz!ACP edit approval guard error: %s>   r{   rz   z+Edit approval denied: approval guard failedÚedit_approval_error)
Úhermes_cli.pluginsrÉ  r™   r„  r%   rÃ   r^  r   Úacp_adapter.edit_approvalrË  )r›  rœ  rÇ  r½  rš  Úblock_messagerÉ  Úmodified_argsr¥  rË  Úedit_block_messageÚ_edit_approval_errs               r   Ú_pre_dispatch_guardsrÔ  ø  s2  € ñ #Ø'+ˆð	DÝHÙ+HØ˜}ñ,Ü?CÐDTÓ?Uð,ØY\×YhÑYhÓYjñ,Ñ(ˆM˜=ð Ð(Ø -�ð Ð$Ø ¤:¨mÓ#<¸nÈmÐ"\Ð\Ð\ð{ÝIÙ8¸ÈÓVÐØÐ)Ø Ð#5Ð7MÈtÐ"TÐTÐTð *ð ˜$ÐÐøô! ò 	DÜ�L‰LÐ7¸×CÑCûð	Dûô ò {Ü�‰Ð8Ð:LÔMØÐ3Ñ3Ø ¤:Ð.[Ó#\Ð^sÐuyÐ"zÐzÕzó 4à˜$ÐÐûð	{ús5   †0A& Á	B Á&	BÁ/B
Â
BÂ	CÂ)CÃCÃCc              #   ó"  K  — 	 ddl m}m}  || j                  xs d| j                  xs d| j
                  xs d¬«      }	 d–— 	  ||«       y# t        $ r d–— Y yw xY w# t        $ r Y yw xY w# 	  ||«       w # t        $ r Y w w xY wxY w­w)zSBind the approval observability context (turn/tool_call/session ids) for the block.r   )Ú#reset_current_observability_contextÚ!set_current_observability_contextrñ   )r}  r|  r{  N)Útools.approval_contextrÖ  r×  r}  r|  r{  r%   )r½  rÖ  r×  Útokenss       r   Ú_approval_observabilityrÚ    s�   è ø€ ðßqÙ2¸3¿;¹;Ò;LÈ"Ð[^×[kÑ[kÒ[qÐoqØ>A¿n¹nÒ>RÐPRôTˆð
Ûð	Ù/°Õ7øô ò ÛÙðûô ò 	Ùð	ûð	Ù/°Õ7øÜò 	Ùð	ÿs|   ‚B„=A ÁA2 ÁA# ÁBÁA ÁBÁA Á BÁ#	A/Á,BÁ.A/Á/BÁ2BÁ4A=Á<BÁ=	B	ÂBÂB	Â	BÂBÚoriginal_argsÚ	user_taskÚenabled_toolsÚskip_tool_execution_middlewarec                óV  ‡ ‡‡	— ‰j                   ‰j                  dœŠ	‰ dk(  r|�|nt        ‰	d<   n|‰	d<   dt        t        t
        f   dt
        fˆ	ˆ ˆfd„}t        ‰«      5  |r ||«      cddd«       S d	d
lm}  |‰ ||fd|i‰j                  «       ¤Žcddd«       S # 1 sw Y   yxY w)z�Run the registry handler (through tool-execution middleware unless skipped)
    with the approval observability context bound for the duration.)rz  r{  r  NrÝ  rÜ  Ú	next_argsr    c                 óz   •— ddl m}m}  |‰«      r |‰| ‰j                  «      S t	        j
                  ‰| fi ‰¤ŽS )Nr   )Údispatch_connector_callÚis_connector_name)Útools.connectorsrâ  rã  r|  r   Údispatch)rà  râ  rã  Údispatch_kwargsr›  r½  s      €€€r   Ú	_dispatchz _execute_tool.<locals>._dispatch=  s;   ø€ ßOÙ˜]Ô+Ù*¨=¸)ÀS×EUÑEUÓVÐVÜ× Ñ  °	ÑM¸_ÑMÐMr3   r   )Úrun_tool_execution_middlewarerÛ  )
rz  r{  re   r   rê   r   rÚ  rÁ  rè  r„  )
r›  rœ  rÛ  r½  rÜ  rÝ  rÞ  rç  rè  ræ  s
   `  `     @r   Ú_execute_toolré  1  sÄ   ú€ ð 36·+±+ÈSÏ^É^Ñ&\€OØ˜Ò&ð =JÐ<U©=Ô[tˆ˜Ò(à'0ˆ˜Ñ$ðNœT¤#¤s (™^ð N´÷ Nô 
! Ó	%ñ BÙ)Ù˜]Ó+÷Bñ Bõ 	HÙ,¨]¸MÈ9ñ BÐdqð BØ/2¯©Ó/@ñB÷	B÷ Bò Bús   Á!
BÁ5 BÂB(c           	      ó  — 	 ddl m}m}  |d«      rDt        | |«      \  }}}	 |d	| ||dœ|j	                  «       ¤||||	dœ¤Ž}
t        d„ |
D «       |«      S 	 |S # t        $ r!}t        j                  d|«       Y d}~|S d}~ww xY w)
zêtransform_tool_result: plugins may replace the final result string.

    Runs after post_tool_call and before the result enters context. Fail-open;
    first string return wins. Gated on has_hook so the no-listener path is cheap.
    r   rž  Útransform_tool_resultr¢  ©r–  r—  r˜  r™  c              3   óB   K  — | ]  }t        |t        «      sŒ|–— Œ y ­wr  )rI  rê   )Ú.0Úrs     r   ú	<genexpr>z4_apply_transform_tool_result_hook.<locals>.<genexpr>Y  s   è ø€ ÒG˜q´J¸qÄ#Õ4FœÑGùs   ‚˜z$transform_tool_result hook error: %sN)rë  )	r¤  rŸ  r   r•  r„  r�   r%   rÃ   r^  )r›  rœ  rX   r–  r½  rŸ  r   r—  r˜  r™  Úhook_resultsr¥  s               r   Ú!_apply_transform_tool_result_hookrò  K  s®   € ð	Hß>ÙÐ+Ô,Ü0LÈ]Ð\bÓ0cÑ-ˆF�J Ù&ð jÈ-Ð^kØ.4ñjØ8;¿¹Ó8IðjØWbØ.4ÀÐ[hójˆLô ÑG LÔGÈÓPÐPð -ð €Møô ò HÜ�‰Ð;¸Y×GÐGØ€MûðHús   ‚AA Á	BÁ"A>Á>Br
  c                 óH   — t        t        j                  «       | z
  dz  «      S )Niè  )r\  ÚtimeÚ	monotonic)r
  s    r   Ú_elapsed_msrö  _  s   € Ü”—‘Ó  5Ñ(¨DÑ0Ó1Ð1r3   Úskip_tool_request_middlewareÚtool_request_middleware_tracec                 ór  ‡ ‡‡ ‡!— t        ‰ ‰«      Št        ‰t        «      si Št        |xs g «      Š!t        j                  ‰ ‰ «      Š t        |||||«      Š t        j                  «       }dt        dt        dt        fˆˆ ˆ ˆ!fd„}t        ‰ ‰||«      }|�x|\  }}|€ ||t        |«      ¬«      S ddlm}m} |d   |k(  r& | ||d	   d
   ‰ ||‰!||¬«      t        |«      ¬«      S t        |i t!        ‰ «      ¤|||	|
|t        ‰!«      ||dœ¤ŽS ddlm} ddlm} ‰ dk(  s |‰ «      rBdt)        ||d¬«      vr |t+        d«      «      S  |‰ «      r |‰ «      € |t+        d«      «      S t        ‰«      }|
st-        ‰ ‰‰ ‰!«      \  Š}Š!	 ‰ t.        v rt+        ‰ › d�«      S t1        ‰ ‰|	‰ ‰!«      \  Š}|�|\  }}} ||d||¬«      S ‰ t2        vr	 ddlm}  ||xs d«       t        j                  «       }t;        ‰ ‰|‰ |||¬«      }t        |«      } |||¬«       t=        ‰ ‰||‰ «      S # t8        $ r Y ŒUw xY w# t8        $ rt}d‰ › dt?        |«      › �}t@        jC                  |«        |t+        tE        |«      «      t        |«      dtG        |«      jH                  t?        |«      ¬«      cY d}~S d}~ww xY w)aß  Route a tool call through hooks/middleware to the registry; returns a JSON string.

    task_id isolates terminal/browser sessions; user_task feeds browser_snapshot.
    enabled_tools picks execute_code's sandbox tools (default: the process-global
    ``_last_resolved_tool_names``). skip_pre_tool_call_hook: caller already fired
    it (single-fire contract). enabled/disabled_toolsets scope the Tool Search
    bridge catalog to this session's grant (None = unrestricted).
    rX   Úextrar    c                 óV   •— t        d‰‰| dœt        ‰«      ¤dt        ‰«      i¤|¤Ž | S )zGEmit post_tool_call with this call's identity fields; returns *result*.)r›  rœ  rX   rš  r2   )r¦  r   r™   )rX   rú  rœ  r›  r½  r¾  s     €€€€r   Ú_emitz#handle_function_call.<locals>._emit{  sA   ø€ ä!ð 	X°È]Ðciñ 	XÜ$*¨3£Kñ	XÜBFÀuÃ+ñ	XØQVò	Xàˆr3   N)r–  r   )r²  Údispatch_connector_batchrI   Úcalls)rÜ  rÝ  rš  r�   rŽ   )rÜ  rÝ  rÇ  r÷  rÞ  rø  r�   rŽ   )rã  )Úparse_connector_nameÚmanage_connectionsT)r�   rª  zHMalformed connector tool name; expected connectors__<connector>__<tool>.z" must be handled by the agent loopÚblocked)r—  r˜  r™  )Únotify_other_tool_callr   )rÜ  rÝ  rÞ  zError executing rî   rŒ  rì  )%r   rI  rJ  r™   Ú_LEGACY_TOOL_ALIASESr˜   ry  rô  rõ  r   r¼  rö  rä  r²  rý  Úhandle_function_callr   rã  Útools.connectors.gateway.namesrÿ  rÕ   r   rÆ  Ú_AGENT_LOOP_TOOLSrÔ  Ú_READ_SEARCH_TOOLSÚtools.file_tools_read_trackingr  r%   ré  rò  rê   rÃ   Ú	exceptionrv  rØ   r…  )"r›  rœ  rz  r|  r{  r}  r~  rÜ  rÝ  rÇ  r÷  rÞ  rø  r�   rŽ   r
  rü  ÚbridgedrX   Ú
underlyingr²  rý  rã  rÿ  rÛ  r  r˜  r™  r  r–  rB  ro  r½  r¾  s"   ``                              @@r   r  r  c  s)  û€ ô  % ]°MÓB€MÜ�m¤TÔ*ØˆÜÐ.Ò4°"Ó5€EÜ(×,Ñ,¨]¸MÓJ€MÜ
�7˜J¨°g¸~Ó
N€CÜ�N‰NÓ€Eð”cð ¤Cð ¬C÷ ð ô $ M°=ÐBRÐTeÓf€GØÐØ$Ñˆ�
ØÐÙ˜¬[¸Ó-?Ô@Ð@ßWØ�a‰=Ð4Ò4ÙÑ1Ø˜1‘˜gÑ&¨°yØ+¸eØ!1ÐEVôô ' uÓ-ô	/ð /ô
 $Øð
Ü! #›;ð
Ø2;È=Ø$;ÐZvØ+IÔimÐnsÓitØ-ÐARó	
ð 	
õ 3ÝCØÐ,Ò,Ñ0AÀ-Ô0PØÔ'9Ð:JÐL]ÐjnÔ'oÑoÙœÐ$SÓTÓUÐUÙ˜]Ô+Ñ0DÀ]Ó0SÐ0[ÙœÐ$nÓoÓpÐpä˜Ó'€MÙ'Ü.GÈÐWdÐfiÐkpÓ.qÑ+ˆ�} eðXØÔ-Ñ-Ü  Ð/QÐRÓSÐSä!5°mÀ]ÐTkÐmpÐrwÓ!xÑˆ�wØÐØ07Ñ-ˆF�J Ù˜¨	¸jÐXeÔfÐfð Ô 2Ñ2ðÝQÙ& wÒ';°)Ô<ô
 —‘Ó ˆÜ˜}¨m¸]ÈCÐ[dØ-:Ð[yô{ˆä! %Ó(ˆÙˆf +Õ.Ü0°ÀÈvÐWbÐdgÓhÐhøô ò Ùðûô ò XØ& } o°R¼¸A»°xÐ@ˆ	Ü×Ñ˜Ô#Ù”ZÔ 4°YÓ ?Ó@ÌkÐZ_ÓN`Ø#´°Q³×0@Ñ0@ÔPSÐTUÓPVôXõ 	XûðXúsP   Æ	H9 Æ%H9 ÇH9 ÇH* Ç A	H9 È*	H6È3H9 È5H6È6H9 È9	J6ÉA)J1Ê+J6Ê1J6c                  ó*   — t        j                  «       S r  )r   Úget_all_tool_namesr2   r3   r   r  r  Ç  s   € Ü×&Ñ&Ó(Ð(r3   c                 ó,   — t        j                  | «      S r  )r   Úget_toolset_for_tool)rŠ  s    r   r  r  Ë  s   € Ü×(Ñ(¨Ó3Ð3r3   c                  ó*   — t        j                  «       S )z)Toolset availability info for UI display.)r   Úget_available_toolsetsr2   r3   r   r  r  Ï  s   € ä×*Ñ*Ó,Ð,r3   c                  ó*   — t        j                  «       S )z7{toolset: available_bool} for every registered toolset.)r   Úcheck_toolset_requirementsr2   r3   r   r  r  Ô  s   € ä×.Ñ.Ó0Ð0r3   r-  c                 ó.   — t        j                  | ¬«      S )z'(available_toolsets, unavailable_info).r,  )r   Úcheck_tool_availabilityr,  s    r   r  r  Ù  s   € ä×+Ñ+°%Ô8Ð8r3   )r    N)NNFF)NNNNNNNFFFNNN)F)zrˆ  r®   r�  Úrer0   Ú
contextlibr   Údataclassesr   r   Úcontextvarsr   ÚloggingrR   rô  Útypingr   r   r	   r
   r   Útools.registryr   r   r   r   r   r   rs  r¿   r   r   Útools.arg_coercionr   Úutilsr   Ú	getLoggerr…  rÃ   r   r­   r‰  r   r   r   r&   r+   r.   ÚLockr-   Úlocalr8   r4   r:   ra   rÎ  rb   r%   rB  r^  Úget_tool_to_toolset_maprc   rê   Úget_toolset_requirementsrd   rJ  re   rÆ   r‡   ÚtuplerŠ   r›   rŒ   r¡   r—   rÎ   rÕ   rÙ   râ   rë   rô   rö   rø   r  r  r  r  r  r  r$  r'  r>  r“   rP  r\  r9  r  r  r  ÚcompileÚ
IGNORECASEÚ	MULTILINEÚDOTALLrq  rv  ry  r•  r¦  r¼  rÆ  rÔ  rÚ  ré  rò  Úfloatrö  r  r  r  r  r  r  r2   r3   r   ú<module>r*     s-  ðòó 
Û Û 	Û Ý %ß )Ý "Û Û Û ß 3Õ 3ç tÕ tÝ Gß 6Ý /Ý  à	ˆ×	Ñ	˜8Ó	$€á4>Ð?_ÐinÔ4oÐ  ¨DÑ!1Ó oð ñ5ó ð5ñ !$£Ð ˜#Ó %ð Tó ð Tó ð €
Ø �)—.‘.Ó"€Ø&�y—‘Ó(Ð òòò45ñp Ô ð

3õ 4ÙÔð 'G h×&FÑ&FÓ&HÐ �T˜#˜s˜(‘^Ó Hà(I¨×(IÑ(IÓ(KÐ �d˜3 ˜9‘oÓ Kð (*Ð ˜4 ™9Ó )ð
  Ð.Ø!�lØ%Ð&Ø$Ð%ÚAòrà&Ð'ÚFØ"Ð#ñÐ ð( 79Ð �$�u˜d 4¨¨S¨¡>Ñ2Ð2Ñ3Ó 8Ø&˜	Ÿ™Ó(Ð ð Ð ó!ð quØUZñ'¨8°D¸±IÑ+>ð 'ÐZbÐcgÐhkÑclÑZmð 'Ø%)ð'ØNRð'Ø_cÐdhÐilÐnqÐiqÑdrÑ_só'ðTØ˜t C™yÑ)ðØ>FÀtÈCÁyÑ>QðØnrðàˆe�_óð4a Cð a°°S±	ð aÀtð aÐY]ð aÐbfó aðB¨°$°s±)Ñ)<ð ÐQYÐZ^Ð_bÑZcÑQdð Ðrvð Ð{~ó ð:4�D˜˜c˜‘Nð 4 t¨C°¨H¡~ó 4ðm˜d 3¨ 8™nð m¸ð mÀÈ$ÈsÐTWÈxÉ.ÑAYó mð	 có 	ðd $ s¨C x¡.ð d¸Sð dÀXÈdÐSVÐX[ÐS[ÉnÑE]ó dðd˜T # s (™^ð d¸ð dÀÈÈcÐSVÈhÉÑ@Xó dð3˜d 3¨ 8™nð 3¸ð 3ÀÈ$ÈsÐTWÈxÉ.ÑAYó 3ð;˜t C¨ H™~ð ;¸#ð ;À(È4ÐPSÐUXÐPXÉ>ÑBZó ;ð6 4Ð ð
o˜t C¨ H™~ð 
o¸#ð 
oÀ(È4ÐPSÐUXÐPXÉ>ÑBZó 
oð,Ð ð_ d¨3°¨8¡nð _Àð _ÈÐRVÐWZÐ\_ÐW_ÑR`ÑIaó _òð *Ù Ð!:Ó;Ù&Ð'AÓBØ1Ø'Ù&Ð'<Ð>[Ó\Ø1Ø0Ø0Ø+ñÐ ð d¨4°°S°©>Ñ&:ð ¸tÀDÈÈcÈÁNÑ?Só ð 'Ø*Ø>Ø?Ø&ñÐ ð vzØZ_ñ)°¸¸c¹Ñ0Cð )Ð_gÐhlÐmpÑhqÑ_rð )Ø*.ð)ØSWð)ØdhÐimÐnqÐsvÐnvÑiwÑdxó)ðX	0˜e C¨¨c°3¨h©Ð$7Ñ8ó 	0ð+¨ó +òf OÐ ð
 Ð$4ÐAQØ˜zñÐ ð " >Ð2Ð ð €B‡J�JÐdÐfh×fsÑfsÓtØ€B‡J�JÐ7¸¿¹ÓFØ€B‡J�Jˆ}˜bŸl™lÓ+Ø€B‡J�JÐ% r§y¡yÓ1ð	Ð ð	' Cð 	'¨Có 	'ñ �$Ô÷
=ð 
=ó ð
=ð¨Cð ¸ð ÀÀsÈHÐUXÉMÐ[cÐdgÑ[hÐGhÑAió ð( "¸tÐcgØ!À4Ð\]Ø ¸dÐcgØ7;òAØðAØ*.¨s°C¨x©.ðAØBEðAà�c‰]ðAà/7¸©}ðAàS[Ð\_ÑS`ðAð �c‰]ðAð 4<¸C±=ðAð WZðAð �S‰Mð	Að /7°s©mð	Að T\Ð\_ÑS`ð	Að
 ˜t D¨¨c¨¡NÑ3Ñ4ðAð 
óAð6+4¨ð +4¸TÀ#ÀsÀ(¹^ð +4Ø,4°T¸#±YÑ,?ð+4ØT\Ð]aÐbeÑ]fÑTgó+4ð\
9Øð
9Ø'+¨C°¨H¡~ð
9Ø<Dð
9ØMQÐRVÐWZÐ\_ÐW_ÑR`ÑMað
9à
ˆ4��S�‰>˜4  S ™>¨4°°S¸#°X±Ñ+?Ð?Ñ@ó
9ð#¨ð #¸DÀÀcÀ¹Nð #Ðeið #Ø&ð#Ø:>¸tÀCÈÀH¹~Ñ:Nð#à# D¨¨c¨¡N°H¸UÀ3ÈÈXÐVYÉ]ÐCZÑ=[Ñ4\Ð$\Ñ]ó#ðL ð ò ó ðð$B ð B°T¸#¸s¸(±^ð BÐTXÐY\Ð^aÐYaÑTbð BÐiqð BØ (¨¡ðBØ>FÀtÈCÁyÑ>QðBØswðBØ|óBð4°Sð ÈÈcÐSVÈhÉð Ðadð Ðsvð Ø+3ðØ8;óð(2�uð 2 ó 2ð
 QUØcgØptØPUØrvØ[_ñ]XØð]XØ'+¨C°¨H¡~ð]XØ@HÈÁð]Xà˜3‘-ð]Xà4<¸S±Mð]XàS[Ð\_ÑS`ð]Xð ˜S‘Mð]Xð 6>¸c±]ð]Xð [cÐcgÐhkÑclÑZmð]Xð "ð	]Xð JNð	]Xð
 %)ð]Xð
 RZÐZ^Ð_cÐdgÐilÐdlÑ_mÑZnÑQoð]Xð ˜t C™yÑ)ð]Xð FNÈdÐSVÉiÑEXð]Xð 	ó]XðH)˜D ™Ió )ð4 Cð 4¨H°S©Mó 4ð-  S¨$ Y¡ó -ð
1 D¨¨d¨¡Oó 1ñ
9 4ð 9°E¸$¸s¹)ÀTÈ$ÁZÐ:OÑ4Pô 9øðo ò 3Ø
‡L�LÐ.°×2Ò2ûð3ús   Ã#V ÖV4ÖV/Ö/V4