
    `gjA*                        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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j4                   e              yy)uB	  Hermes-tools-as-MCP server for the codex_app_server runtime.

When the user runs `openai/*` turns through the codex app-server, codex
owns the loop and builds its own tool list. By default, that means
Hermes' richer tool surface — web search, browser automation,
delegate_task subagents, vision analysis, persistent memory, skills,
cross-session search, image generation, TTS — is unreachable.

This module exposes a curated subset of those Hermes tools to the
spawned codex subprocess via stdio MCP. Codex registers it as a normal
MCP server (per `~/.codex/config.toml [mcp_servers.hermes-tools]`) and
the user gets full Hermes capability inside a Codex turn.

Scope (what we expose):
  - web_search, web_extract              — Firecrawl, no codex equivalent
  - browser_navigate / _click / _type /  — Camofox/Browserbase automation
    _snapshot / _scroll / _back / _press /
    _get_images / _console / _vision
  - vision_analyze                       — image inspection by vision model
  - image_generate                       — image generation
  - skill_view, skills_list              — Hermes' skill library
  - text_to_speech                       — TTS
  - kanban_* (complete/block/comment/    — kanban worker + orchestrator
    heartbeat/show/list/create/            handoff (stateless: read env var,
    unblock/link)                          write ~/.hermes/kanban.db)

What we DO NOT expose:
  - terminal / shell                     — codex's own shell tool
  - read_file / write_file / patch       — codex's apply_patch + shell
  - search_files / process               — codex's shell
  - clarify                              — codex's own UX
  - delegate_task / memory /             — `_AGENT_LOOP_TOOLS` in Hermes
    session_search / todo                  (model_tools.py). They require
                                           the running AIAgent context to
                                           dispatch (mid-loop state), so a
                                           stateless MCP callback can't
                                           drive them. See the inline
                                           comment on EXPOSED_TOOLS below.

Run with: python -m agent.transports.hermes_tools_mcp_server
Spawned by: CodexAppServerSession.ensure_started() when the runtime is
            active and config opts in.
    )annotationsN)AnyOptional)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 )a3  Build a Python function signature and annotations from a JSON schema.

    Args:
        schema: JSON Schema dict with "properties" and "required" keys.

    Returns:
        (signature, annotations_dict) where signature has KEYWORD_ONLY params
        and annotations maps param names to Python types.
    
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
             [/root/.hermes/venv/lib/python3.12/site-packages/agent/transports/hermes_tools_mcp_server.py_signature_from_schemar)   C   s    \r|,2EFLb%%j17R8HFF 
uC __ekr..v6<   ""(()2,% 	W
 uw((55#w	

  Vs;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_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  | dd      } |d	
      xs g D ci c]2  }t        |t              r |j                  d      dk(  r|d   d   |d   4 }}d}t        D ]  }|j                  |      }|t        j                  d|       -|j                  d      xs d| d|j                  d      xs di d}	df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)zCreate the FastMCP server with Hermes tools attached. Lazy imports
    so the module can be imported without the mcp package installed
    (we degrade to a clear error only when actually run).r   )FastMCPz4hermes-tools MCP server requires the 'mcp' package: N)get_tool_definitionshandle_function_callzhermes-toolsa  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nameu5   skipping %s — not registered in this Hermes processdescriptionzHermes z tool
parametersr   )r   r   c                     t        |      \  }}d fd} |_        |_        ||_        i |dt        i|_        |S )Nreturnc                    	 | j                         D ci c]  \  }}|	|| }}} |xs i       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argsexcrI   	tool_names        r(   	_dispatchz7_build_server.<locals>._make_handler.<locals>._dispatch   s    N .4\\^MTQq}AqDMDM/	4:2FF N  N$$%5yA::C)&LMMNs+   < 
66< < 	B6B;BB)rZ   r   rQ   r   )r)   __name____doc____signature__r   __annotations__)r_   r    sigr#   r`   rN   rI   s   `    r(   _make_handlerz$_build_server.<locals>._make_handler   sK    08KCN "+I +I&)I#(A6(A8S(AI%r*   )rM   rN      z.hermes-tools MCP server registered %d/%d tools)r_   r   r    dict | None)mcp.server.fastmcprG   ImportErrormodel_toolsrH   rI   
isinstancedictr   rE   rV   debugadd_tool	TypeErrorrT   infolen)rG   r^   rH   mcptdall_defsexposed_countrM   specparams_schemarf   handlerrN   rI   s               @@r(   _build_serverrz      s   .
 8	C (48>Bb$BFF6Nj$@ 	:v:.H  M 0||D!<LLG hh}-F74&1F.V8SU2V	&	LLLdM2'   	a0d KK8M
 Jo  B3%H
	0b  	L $D-8GBchhDkhB7KG	Ls.   D 7D:D?	D7#D22D7?+E-,E-c                   | xs t         j                  dd } d| v xs d| v }|rt        j                  nt        j                  }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`.rg   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: 
   r   zhermes-tools MCP server crashedzhermes-tools MCP server error: )sysargvloggingINFOWARNINGbasicConfigstderrosenviron
setdefaultrz   rj   writerunKeyboardInterruptrU   rV   rW   )r   verbose	log_levelserverr^   s        r(   mainr      s   388AB<DT!1TT\G 'W__IzzB JJ.#.JJ16:

   

A#bIJ   :;

:3%rBCs6   +
C 6D  	C=#C88C= 	EE8EE__main__)r    rh   rQ   z)tuple[inspect.Signature, dict[str, type]])rQ   r   )N)r   zOptional[list[str]]rQ   int)rb   
__future__r   r   rX   r   r   r   typingr   r   	getLoggerra   rV   r   r   floatboollistrm   r   r)   rE   rd   rz   r   exit r*   r(   <module>r      s   *X #    	 
  			8	$ DZ%" %P]@ F zCHHTV r*   