Ë
    áß²j»  ã                  óê   — U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
  ej                  e«      ZdZeeeeeedœZdd„ZdZd	ed
<   dd„Zddd„Zedk(  r ej6                   e«       «       yy)a/  Hermes-tools-as-MCP server for the codex_app_server runtime.

Codex owns the loop and tool list there, so a curated subset of Hermes tools is
exposed over stdio MCP; codex registers it via ``~/.codex/config.toml
[mcp_servers.hermes-tools]``. Run: ``python -m agent.transports.hermes_tools_mcp_server``.
é    )ÚannotationsN)ÚAnyÚOptionalzhermes-tools)ÚstringÚintegerÚnumberÚbooleanÚarrayÚobjectc           	     óN  — | xs i j                  d«      xs i }t        | xs i j                  d«      xs g «      }g i }}|j                  «       D ]·  \  }}|j                  d«      rŒt        j                  |xs i j                  d«      t
        «      }||v r|t        j                  j                  fn
t        |   df\  }}	|||<   |j                  t        j                  |t        j                  j                  ||	¬«      «       Œ¹ t        j                  |t        ¬«      |fS )zZKEYWORD_ONLY signature + annotations from a JSON schema (optional params default to None).Ú
propertiesÚrequiredÚ_ÚtypeN)Ú
annotationÚdefault)Úreturn_annotation)ÚgetÚsetÚitemsÚ
startswithÚ_JSON_TO_PYr   ÚinspectÚ	ParameterÚemptyr   ÚappendÚKEYWORD_ONLYÚ	SignatureÚstr)
ÚschemaÚpropsr   ÚparamsÚannotsÚpnameÚpspecÚpyÚannr   s
             úM/home/ubuntu/.hermes/hermes-agent/agent/transports/hermes_tools_mcp_server.pyÚ_signature_from_schemar)      s  € àŠ\�r×Ñ˜|Ó,Ò2°€EÜ�F’L˜b×%Ñ% jÓ1Ò7°RÓ8€HØ˜ˆF€FØŸ™›ò q‰ˆˆuØ×Ñ˜CÔ ØÜ�_‰_˜ešk r×.Ñ.¨vÓ6¼Ó<ˆØ8=ÀÑ8I˜œG×-Ñ-×3Ñ3Ñ4ÔPXÐY[ÑP\Ð^bÐOc‰ˆˆWØˆˆu‰Ø�‰”g×'Ñ'¨¬w×/@Ñ/@×/MÑ/MÐZ]ÐgnÔoÕpðqô ×Ñ˜V´sÔ;¸VÐCÐCó    )Ú
web_searchÚweb_extractÚbrowser_navigateÚbrowser_clickÚbrowser_typeÚbrowser_pressÚbrowser_snapshotÚbrowser_scrollÚbrowser_backÚbrowser_get_imagesÚbrowser_consoleÚbrowser_visionÚvision_analyzeÚimage_generateÚ
skill_viewÚskills_listÚtext_to_speechÚkanban_completeÚkanban_blockÚkanban_request_reviewÚkanban_request_changesÚkanban_commentÚkanban_heartbeatÚkanban_showÚkanban_listÚkanban_createÚkanban_unblockÚkanban_linkztuple[str, ...]ÚEXPOSED_TOOLSc            	     óä  ‡— 	 ddl m}  ddlm}mŠ  | t        d¬«      } |d¬	«      xs g D �ci c]2  }t        |t        «      r |j                  d
«      dk(  r|d   d   |d   “Œ4 }}dˆfd„}d}t        D ]  }|j                  |«      }	|	€t        j                  d|«       Œ-|	j                  d«      xs d|› d�}
|	j                  d«      xs di dœ}	 |j                   ||||
«      ||
¬«       |dz  }Œ� t        j!                  d|t#        t        «      «       |S # t        $ r}t        d|› �«      |‚d}~ww xY wc c}w # t        $ r$  |j                  ||
¬«       ||||
«      «       Y Œ~w xY w)z\Create the MCP server with Hermes tools attached (lazy imports: importable without ``mcp``).r   )Ú	MCPServerz4hermes-tools MCP server requires the 'mcp' package: N)Úget_tool_definitionsÚhandle_function_calla  Hermes Agent's tool surface, exposed for use inside a Codex session. Use these for capabilities Codex's built-in toolset doesn't cover: web search/extract, browser automation, subagent delegation, vision, image generation, persistent memory, skills, and cross-session search.)ÚinstructionsT)Ú
quiet_moder   ÚfunctionÚnameÚdescriptionc                ó€   •‡ — t        |«      \  }}dˆˆ fd„}‰ |_        ||_        ||_        i |¥dt        i¥|_        |S )NÚreturnc            	     ó  •— 	  ‰‰| j                  «       D ��ci c]  \  }}|€Œ	||“Œ c}}«      S c c}}w # t        $ rA}t        j                  d‰«       t	        j
                  t        |«      ‰dœ«      cY d }~S d }~ww xY w)Nztool %s raised)ÚerrorÚtool)r   Ú	ExceptionÚloggerÚ	exceptionÚjsonÚdumpsr   )ÚkwargsÚkÚvÚexcrK   Ú	tool_names       €€r(   Ú	_dispatchz7_build_server.<locals>._make_handler.<locals>._dispatch]   ss   ø€ ðJá+¨IÈÏÉË×7iÁÀÀAÐ[\Ñ[h¸¸1¹Ó7iÓjÐjùÓ7iøÜò JÜ× Ñ Ð!1°9Ô=Ü—z‘z¬C°«H¸iÑ"HÓIÕIûðJús+   ƒ7 ™
1¤1©7 ±7 ·	BÁ 6A<Á6BÁ<B)r[   r   rR   r   )r)   Ú__name__Ú__doc__Ú__signature__r   Ú__annotations__)r_   r    rP   Úsigr#   r`   rK   s   `     €r(   Ú_make_handlerz$_build_server.<locals>._make_handlerY   sK   ù€ ä,¨VÓ4‰ˆˆVö	Jð 'ˆ	ÔØ'ˆ	ÔØ"%ˆ	ÔØ$= vÐ$=¨x¼Ñ$=ˆ	Ô!ØÐr*   u5   skipping %s â€” not registered in this Hermes processzHermes z toolÚ
parametersr   )r   r   )rO   rP   é   z.hermes-tools MCP server registered %d/%d tools)r_   r   r    údict | NonerP   r   )Ú
mcp.serverrI   ÚImportErrorÚmodel_toolsrJ   rK   ÚHERMES_TOOLS_MCP_SERVER_NAMEÚ
isinstanceÚdictr   rG   rW   ÚdebugÚadd_toolÚ	TypeErrorrU   ÚinfoÚlen)rI   r^   rJ   ÚmcpÚtdÚall_defsrf   Úexposed_countrO   ÚspecrP   Úparams_schemarK   s               @r(   Ú_build_serverr{   =   s¡  ø€ ðaå(÷ Gá
Ü$ð8ô	€Cñ (°4Ô8Ò>¸BöàÜ�bœ$Ô B§F¡F¨6£N°jÒ$@ð 	ˆ:‰�vÑ  :¡Ñ.ð€Hð õð$ €MÜò ˆØ�|‰|˜DÓ!ˆØˆ<Ü�L‰LÐPÐRVÔWØØ—h‘h˜}Ó-ÒF°7¸4¸&ÀÐ1FˆØŸ™ Ó.ÒV¸8ÐSUÑ2Vˆð	jØ�L‰L™ t¨]¸KÓHÈtÐalˆLÔmð 	˜Ñ‰ðô ‡K�KÐ@À-ÔQTÔUbÓQcÔdØ€Jøôs ò aÜÐPÐQTÐPUÐVÓWÐ]`Ð`ûðaüò"øôD ò 	jà8ˆC�H‰H˜$¨KˆHÓ8¹ÀtÈ]Ð\gÓ9hÖið	jús.   ƒD ®7D=ÃEÄ	D:Ä&D5Ä5D:Å*E/Å.E/c                ó¬  — | xs t         j                  dd } d| v xs d| v }t        j                  |rt        j                  nt        j
                  t         j                  d¬«       t        j                  j                  dd«       t        j                  j                  d	d
«       	 t        «       }	 |j                  «        y# t        $ r-}t         j                  j                  d|› d�«       Y d}~yd}~ww xY w# t        $ r Y yt        $ rB}t         j#                  d«       t         j                  j                  d|› d�«       Y d}~yd}~ww xY w)zEEntry point for `python -m agent.transports.hermes_tools_mcp_server`.rh   Nz	--verbosez-vz1%(asctime)s [%(levelname)s] %(name)s: %(message)s)ÚlevelÚstreamÚformatÚHERMES_QUIETÚ1ÚHERMES_REDACT_SECRETSÚtruez&hermes-tools MCP server cannot start: ú
é   zhermes-tools MCP server crashedzhermes-tools MCP server error: r   )ÚsysÚargvÚloggingÚbasicConfigÚINFOÚWARNINGÚstderrÚosÚenvironÚ
setdefaultr{   rk   ÚwriteÚrunÚKeyboardInterruptrV   rW   rX   )r‡   ÚverboseÚserverr^   s       r(   Úmainr•   ~   s  € àÒ”3—8‘8˜A˜B�<€DØ˜TÐ!Ò1 T¨T \€GÜ×ÑÙ%Œg�lŠl¬7¯?©?Ü�z‰zØBõô ‡J�J×Ñ˜.¨#Ô.Ü‡J�J×ÑÐ1°6Ô:ðÜ“ˆðØ�
‰
Œð øô ò Ü�
‰
×ÑÐAÀ#ÀÀbÐIÔJÜûðûô
 ò Øð
 ô	 ò Ü×ÑÐ:Ô;Ü�
‰
×ÑÐ:¸3¸%¸rÐBÔCÜûðús6   Â)
C Â4C> Ã	C;Ã#C6Ã6C;Ã>	EÄ	EÄ8EÅEÚ__main__)r    ri   rR   z)tuple[inspect.Signature, dict[str, type]])rR   r   )N)r‡   zOptional[list[str]]rR   Úint)rb   Ú
__future__r   r   rY   rˆ   r�   r†   Útypingr   r   Ú	getLoggerra   rW   rm   r   r—   ÚfloatÚboolÚlistro   r   r)   rG   rd   r{   r•   Úexit© r*   r(   ú<module>r       s�   ðòõ #ã Û Û Û 	Û 
ß  à	ˆ×	Ñ	˜8Ó	$€ð  .Ð ð ¨¸È$ÐY]ÐimÑn€óDð$"€ˆó ó>ôBð: ˆzÒØ€C‡H�H‰T‹VÕð r*   