Ë
    ãß²jú  ã                  ó¼   — d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	 ddl
mZ  ej                  d«      Z eg d¢«      Zg d	¢Zdd
„Zdd„Zdd„Zdd„Z	 	 	 	 	 	 dd„Zy)zOChild toolset resolution for delegate_task: what a child may and may never use.é    )ÚannotationsN)ÚListÚOptional)ÚTOOLSETSÚresolve_toolset)Ú_get_inherit_mcp_toolsetsztools.delegate_tool)Údelegate_taskÚclarifyÚmemoryÚsend_messageÚcronjob_manage)ÚterminalÚfileÚwebc                óð   — | syt        | «      j                  d«      ry	 ddlm} |j	                  t        | «      «      }t        |xr t        |«      j                  d«      «      S # t
        $ r d}Y Œ4w xY w)zDReturn True for canonical MCP toolsets and their registered aliases.Fzmcp-Tr   )ÚregistryN)ÚstrÚ
startswithÚtools.registryr   Úget_toolset_alias_targetÚ	ExceptionÚbool)Únamer   Útargets      úA/home/ubuntu/.hermes/hermes-agent/tools/delegate_tool_toolsets.pyÚ_is_mcp_toolset_namer      sp   € áØÜ
ˆ4ƒy×Ñ˜FÔ#ØðÝ+Ø×2Ñ2´3°t³9Ó=ˆô �Ò9œ3˜v›;×1Ñ1°&Ó9Ó:Ð:øô ò ØŠðús     A' Á'A5Á4A5c                óÌ   ‡‡‡— | D ��ch c]  }|t         v sŒt        |d¬«      D ]  }|’Œ Œ! c}}Št        | «      Š‰r ‰j                  ˆˆˆfd„t         D «       «       ‰S c c}}w )a¦  Add every toolset whose tools are a subset of the parent's tools: a parent on a composite like ``hermes-cli``
    must still let a child request ``web``/``terminal``; bare name intersection would reject them. Both sides use
    the RESOLVED static surface: a composite's ``includes`` (``debugging`` -> ``web``/``file``, ``safe``) are tools
    the parent genuinely holds, and the child never gains a tool the parent lacks.F©Úinclude_registryc              3  ó|   •K  — | ]3  }|‰vr-t        |d ¬«      xŠrt        ‰«      j                  ‰«      r|–— Œ5 y­w)Fr   N)r   ÚsetÚissubset)Ú.0Úts_nameÚexpandedÚparent_tool_namesÚresolveds     €€€r   ú	<genexpr>z*_expand_parent_toolsets.<locals>.<genexpr>0   sF   øè ø€ ò 
ØØ˜hÑ&Ü,¨WÀuÔMÐM�ÐMÜ�H“×&Ñ&Ð'8Ô9ô ñ
ùs   ƒ9<)r   r   r!   Úupdate)Úparent_toolsetsr$   Útr%   r&   r'   s      @@@r   Ú_expand_parent_toolsetsr,   &   sq   ú€ ð )÷Ø¨G´xÒ,?ÌÐY`ÐsxÔIyòØDEŠðØ	óÐô �?Ó#€HÙØ�‰õ 
Ü#+ô
ô 	
ð €Oùós
   ‰A —A c                ó´   — ddht         D �ch c]%  }t        |d¬«      x}rt        d„ |D «       «      r|’Œ' c}z  }| D �cg c]	  }||vsŒ|‘Œ c}S c c}w c c}w )zºRemove toolsets whose tools are ALL blocked (derived from DELEGATE_BLOCKED_TOOLS so the two can't drift) plus
    composite toolsets children must never get (``delegation``, ``kanban``).Ú
delegationÚkanbanFr   c              3  ó,   K  — | ]  }|t         v –— Œ y ­w)N)ÚDELEGATE_BLOCKED_TOOLS)r#   Útools     r   r(   z'_strip_blocked_tools.<locals>.<genexpr>?   s   è ø€ ÒJ°4�Ô.Ô.ÑJùs   ‚)r   r   Úall)Útoolsetsr   Úresolved_toolsÚblocked_toolset_namesr+   s        r   Ú_strip_blocked_toolsr7   8   sp   € ð *¨8Ð4äö8àÜ-¨dÀUÔKÐKˆNÐKÜÑJ¸>ÔJÔJò 	ò8ñ Ðð  ÖB�! 1Ð,AÒ#AŠAÒBÐBùò8ùò Cs   Œ*A¿	AÁ	Ac                óš   ‡— t        t        «      Š| dk(  r‰j                  d«       t        ˆfd„t	        j
                  «       D «       «      S )z˜One-tool deny toolsets for the role; passed as ``disabled_toolsets`` so
    blocked names inside mixed bundles are subtracted AFTER composite expansion.Úorchestratorr	   c              3  ó¢   •K  — | ]F  \  }}|j                  d «      sŒt        |j                  d d«      «      j                  ‰«      sŒC|–— ŒH y­w)Útools© N)Úgetr!   r"   )r#   r   ÚdefnÚblocked_namess      €r   r(   z-_blocked_toolsets_for_role.<locals>.<genexpr>I   sE   øè ø€ ò Ù��t°4·8±8¸GÕ3DÌÈTÏXÉXÐV]Ð_aÓMbÓIc×IlÑIlÐmzÕI{Œñùs   ƒA�*AÁA)r!   r1   ÚdiscardÚsortedr   Úitems)Úroler?   s    @r   Ú_blocked_toolsets_for_rolerD   C   sG   ø€ ô Ô.Ó/€MØˆ~ÒØ×Ñ˜oÔ.Üó Ü'Ÿ~™~Ó/ôó ð ó    c                óL  — t        | dd«      }|�t        |«      }nO| r>t        | d«      r2ddl}| j                  D �ch c]  }|j                  |«      x}€Œ|’Œ }}nt        t        «      }|rWt        |«      }|D �	cg c]	  }	|	|v sŒ|	‘Œ }
}	t        «       rH|
t        |«      D �cg c]  }t        |«      sŒ||
vsŒ|‘Œ c}z  }
n| r|�|}
nt        |«      xs t        }
t        |
«      }
t        | dd«      }t        |t        t        t        f«      r|D �cg c]  }t        |«      ‘Œ c}ng }|dk(  r*|D �cg c]
  }|dk7  sŒ	|‘Œ }}d|
vr|
j!                  d«       t        t"        j%                  |t'        |«      z   dgz   «      «      }|
|fS c c}w c c}	w c c}w c c}w c c}w )	uF  ``(enabled_toolsets, disabled_toolsets)`` for a child. Children never gain tools the parent lacks: explicit
    ``toolsets`` are intersected with the parent's (composite-expanded) set, else the parent's enabled set is
    inherited. Blocked tools are stripped twice â€” whole blocked toolsets here, and exact one-tool deny toolsets via
    ``disabled_toolsets`` so blocked names inside mixed bundles (hermes-cli) are subtracted AFTER composite
    expansion and survive registry refreshes. Orchestrators get ``delegation`` re-added unconditionally
    (role-granted, not inherited).Úenabled_toolsetsNÚvalid_tool_namesr   Údisabled_toolsetsr9   r.   r/   )Úgetattrr!   ÚhasattrÚmodel_toolsrH   Úget_toolset_for_toolÚDEFAULT_TOOLSETSr,   r   rA   r   r7   Ú
isinstanceÚlistÚtupler   ÚappendÚdictÚfromkeysrD   )Úparent_agentr4   Úeffective_roleÚparent_enabledr*   rL   r   ÚtsÚexpanded_parentr+   Úchild_toolsetsÚraw_parent_disabledÚinherited_disabledÚchild_disabled_toolsetss                 r   Ú_resolve_child_toolsetsr^   M   sÏ  € ô ˜\Ð+=¸tÓD€NØÐ!Ü˜nÓ-‰Ù	œ' ,Ð0BÔCÛà'×8Ñ8ö
ØÀ;×CcÑCcÐdhÓCiÐ=i¸RÑ<vŠBð
ˆñ 
ô Ô.Ó/ˆáÜ1°/ÓBˆØ%-ÖF °°oÒ1Eš!ÐFˆÐFÜ$Ô&àÜ!'¨Ó!8öØÔ<PÐQUÕ<VÐ[_ÐguÒ[u’òñ ‰Nñ 
˜.Ð4Ø'‰ä Ó0ÒDÔ4DˆÜ)¨.Ó9€Nä! ,Ð0CÀTÓJÐä7AÐBUÔX\Ô^cÔehÐWiÔ7jÐ2Ö3�tŒˆT�Ó3Ðprð ð ˜Ò'Ø/AÖZ tÀTÈ\ÓEYšdÐZÐÐZØ˜~Ñ-Ø×!Ñ! ,Ô/Ü"Ü�‰Ð(Ô+EÀnÓ+UÑUÐYaÐXbÑbÓcóÐð Ð2Ð2Ð2ùò?
ùò Gùòùò 	4ùò [s;   ¼FÁFÁ<	FÂFÂ$FÂ5FÂ:FÄFÄ5
F!Å F!)r   r   Úreturnr   )r*   r!   r_   r!   )r4   ú	List[str]r_   r`   )rC   r   r_   r`   )r4   zOptional[List[str]]rV   r   r_   ztuple[List[str], List[str]])Ú__doc__Ú
__future__r   ÚloggingÚtypingr   r   r4   r   r   Útools.delegate_tool_configr   Ú	getLoggerÚloggerÚ	frozensetr1   rN   r   r,   r7   rD   r^   r<   rE   r   ú<module>ri      sv   ðÙ Uå "ã ß !ç .Ý @à	ˆ×	Ñ	Ð0Ó	1€ñ #òóÐ ò /Ð ó;óó$	Cóð.3Ø/ð.3ØADð.3à ô.3rE   