
    sj2L                    X   U d Z ddlZddlZddlZddlZddlmZmZ ddlZddl	Z	ddl
mZ ddlmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ m!Z"  ej#        e$          Z%i Z&e'e(d<   dZ)dZ*dZ+de,fdZ- e            Z.e.dz  Z/e/Z0defdZ1dZ2dZ3ddddZ4 e	j5        d          Z6 e7h d          Z8da9de:dee:         fdZ;dee:e:f         fdZ< G d de:e          Z=g d Z>e?e(d!<   dd"Z@d#ee:ef         deAfd$ZBd#ee:ef         deAfd%ZCd&edee:         fd'ZDd#ee:ef         deee:         ee:         f         fd(ZEd#ee:ef         dee:ef         fd)ZF	 dd#ee:ef         d*ee:         dz  deee:ef                  fd+ZGd,e:d-eee:ef                  dee:ef         fd.ZHdeAfd/ZIde:fd0ZJ	 dd1e:d2ee:e:f         dz  deAfd3ZKdd4d5eee:ef                  d6ee:ef         d2ee:e:f         dz  dee:         fd7ZLde:fd8ZM	 dd9e=d:ee:         d;e:dz  de:dz  fd<ZNdeAfd=ZOd>e:deee:ef         e:f         fd?ZPd@edee:         fdAZQdee:         fdBZRdee:         fdCZSde:fdDZTdde:dEe:deAfdFZUdGdHdIeAdeee:ef                  fdJZVdeee:ef                  deee:ef                  fdKZWddLe:dMe:de:fdNZX	 ddOddPdQedRe:dSe:dTe:dz  dUeAdVe:dz  de:fdWZYdXedee:ee:         f         dz  fdYZZ	 	 	 dde:dTe:dMe:dUeAde:f
dZZ[e$d[k    ro	  e\d\            e\d]            e\d^            ej]         eX                      Z^e^d_         r e\d`e^da          db e_e^`                    dcg                      dd            e\dee^`                    dcg                        e\df           e^d         ddg         D ]MZaea`                    dL          rdheadL          dindjZb e\dkeb ead          dleadm         ddn          do           Nn e\dpe^dq                      e\dr            ej]         e[ds                    Z^e^d_         r e\dte^d                      e\due^`                    dmdv          ddw          do            e\dx e_e^d>                    dy           e^`                    dz          r e\d{e^dz                     n e\dpe^dq                      e\d|            ej]         e[dsd}                    Z^e^d_         rP e\d~e^d                      e\dx e_e^d>                    dy            e\de^d>         dd          do           n e\dpe^dq                     ddddLdddig ddZcdddddddddddgddZd eje        ddecd eOd           i Zfee:ee,e,f         f         e(d<    ejg                    ZhdZidZjde'de,dz  fdZkde'ddfdZlde:dz  fdZmddMe:dz  ddfdZnd Zo eje        ddedeoeOd           dS )u  
Skills Tool Module

This module provides tools for listing and viewing skill documents.
Skills are organized as directories containing a SKILL.md file (the main instructions)
and optional supporting files like references, templates, and examples.

Inspired by Anthropic's Claude Skills system with progressive disclosure architecture:
- Metadata (name ≤64 chars, description ≤1024 chars) - shown in skills_list
- Full Instructions - loaded via skill_view when needed
- Linked Files (references, templates) - loaded on demand

Directory Structure:
    skills/
    ├── my-skill/
    │   ├── SKILL.md           # Main instructions (required)
    │   ├── references/        # Supporting documentation
    │   │   ├── api.md
    │   │   └── examples.md
    │   ├── templates/         # Templates for output
    │   │   └── template.md
    │   └── assets/            # Supplementary files (agentskills.io standard)
    └── category/              # Category folder for organization
        └── another-skill/
            └── SKILL.md

SKILL.md Format (YAML Frontmatter, agentskills.io compatible):
    ---
    name: skill-name              # Required, max 64 chars
    description: Brief description # Required, max 1024 chars
    version: 1.0.0                # Optional
    license: MIT                  # Optional (agentskills.io)
    platforms: [macos]            # Optional — restrict to specific OS platforms
                                  #   Valid: macos, linux, windows
                                  #   Omit to load on all platforms (default)
    prerequisites:                # Optional — legacy runtime requirements
      env_vars: [API_KEY]         #   Legacy env var names are normalized into
                                  #   required_environment_variables on load.
      commands: [curl, jq]        #   Command checks remain advisory only.
    compatibility: Requires X     # Optional (agentskills.io)
    metadata:                     # Optional, arbitrary key-value (agentskills.io)
      hermes:
        tags: [fine-tuning, llm]
        related_skills: [peft, lora]
    ---

    # Skill Title

    Full instructions and content here...

Available tools:
- skills_list: List skills with metadata (progressive disclosure tier 1)
- skill_view: Load full skill content (progressive disclosure tier 2-3)

Usage:
    from tools.skills_tool import skills_list, skill_view, check_skills_requirements

    # List all skills (returns metadata only - token efficient)
    result = skills_list()

    # View a skill's main content (loads full instructions)
    content = skill_view("axolotl")

    # View a reference file within a skill (loads linked file)
    content = skill_view("axolotl", "references/dataset-formats.md")
    N)get_hermes_homedisplay_hermes_home)Enum)PathPurePosixPathPureWindowsPath)DictAnyListOptionalSetTuple)registry
tool_error)cfg_get)env_var_enabled)EXCLUDED_SKILL_DIRSis_skill_support_path_SKILLS_CACHEg      >@with_disabledfilteredreturnc                 T   ddl m} t          t          |dd          dd          }g }| D ]}	 |                                j        }n# t
          $ r Y )w xY w	 t          j        |          5 }|D ]L}	 |                    d          r#|                    d          j        }	|	|k    r|	}=# t
          $ r Y Iw xY w	 ddd           n# 1 swxY w Y   n# t
          $ r Y nw xY w|	                    t          |          |f           t          |          t          |          |fS )	uN  Cheap change-signature for the skill scan inputs.

    O(#dirs + #categories) stat calls, not a recursive walk. Includes the
    platform the scan's ``skill_matches_platform`` filter will use (read
    from ``agent.skill_utils``'s ``sys`` so test patches of that module
    are honored) — the scan result is platform-dependent.
    r   )skill_utilssysNplatform F)follow_symlinks)agentr   getattrstatst_mtimeOSErrorosscandiris_dirappendstrtuple	frozenset)
dirs_to_scandisabled_skill_utilsr   sigdmitentryems
             5/home/agent/.hermes/hermes-agent/tools/skills_tool.py_skills_scan_signaturer5   k   s    211111w|UD99:rJJH
C    	!AA 	 	 	H		A !" ! !E! <<<>> '!&E!B!B!KB!Avv$&" ! ! ! !!! ! ! ! ! ! ! ! ! ! ! ! ! ! !  	 	 	D	

CFFA;#JJ	(++X66sk   A
AAC-C
39B-,C
-
B:	7C
9B:	:C
>C
C	CC	C
C#"C#skillsc                  f    t          t                    } | t          k    r| S t                      dz  S )aZ  Return the active profile's skills directory at call time.

    Some long-lived runtimes import this module before the active profile has
    set HERMES_HOME. Keep the legacy SKILLS_DIR module attribute for tests and
    external patchers, but when it has not been patched, resolve from the live
    profile-scoped HERMES_HOME on every call.
    r6   )r   
SKILLS_DIR_SKILLS_DIR_AT_IMPORTr   )
configureds    r4   _skills_dirr;      s4     j!!J***x''    @   i   darwinlinuxwin32)macosr?   windowsz^[A-Za-z_][A-Za-z0-9_]*$>   sshmodaldockerdaytonasingularityvercel_sandboxnamec                 2   ddl m} t          | t                    sdS |                                 }t          |                                          s5t          |                                          st          |          j        rdS  ||          rdS dS )uD  Return an error if a local skill lookup *name* can escape search roots.

    The skill ``name`` is joined onto each trusted search dir to build the
    on-disk lookup path, so it must stay relative and free of ``..`` segments —
    otherwise ``name="../outside"`` or an absolute path could select a skill
    (and read files) outside the skills directory. Mirrors the ``file_path``
    validation done later via ``tools.path_security``. We also reject Windows
    drive paths (e.g. ``C:\skills``), whose ``:`` would otherwise be misread as
    a plugin namespace separator.
    r   )has_traversal_componentzSkill name must be a string.z?Skill name must be a relative path within the skills directory.z9Skill name cannot contain '..' path traversal components.N)	tools.path_securityrK   
isinstancer(   stripr   is_absoluter   drive)rI   rK   	candidates      r4   _skill_lookup_path_errorrR      s     <;;;;;dC   .--

Ii  ,,..Q9%%1133Q 9%%+Q
 QPy)) KJJ4r<   c                     t                      dz  } i }|                                 s|S |                     dd          5 }|D ]}|                                }|r|                    d          sxd|v rt|                    d          r
|dd	         }|                    d          \  }}}|                                                    d
          ||                                <   	 d	d	d	           n# 1 swxY w Y   |S )z@Load profile-scoped environment variables from HERMES_HOME/.env.z.env	utf-8-sigreplaceencodingerrors#=zexport    N"')r   existsopenrN   
startswith	partition)env_pathenv_varsflinekey_values          r4   load_envrh      sY     6)H!H?? 
 
I	>	> C! 	C 	CD::<<D CDOOC00 CSD[[??9-- $8D $s 3 3Q(-(;(;E(B(B%	CC C C C C C C C C C C C C C C Os   B)C77C;>C;c                       e Zd ZdZdZdZdS )SkillReadinessStatus	availablesetup_neededunsupportedN)__name__
__module____qualname__	AVAILABLESETUP_NEEDEDUNSUPPORTED r<   r4   rj   rj      s        I!LKKKr<   rj   )	zignore previous instructionszignore all previouszyou are nowzdisregard yourzforget your instructionsznew instructions:zsystem prompt:z<system>z]]>_INJECTION_PATTERNSc                 
    | a d S N)_secret_capture_callback)callbacks    r4   set_secret_capture_callbackrz      s    'r<   frontmatterc                 $    ddl m}  ||           S )u   Check if a skill is compatible with the current OS platform.

    Delegates to ``agent.skill_utils.skill_matches_platform`` — kept here
    as a public re-export so existing callers don't need updating.
    r   )skill_matches_platform)agent.skill_utilsr}   r{   _impls     r4   r}   r}      s'     BAAAAA5r<   c                 $    ddl m}  ||           S )uX  Check if a skill is relevant to the current runtime environment.

    Delegates to ``agent.skill_utils.skill_matches_environment`` — kept here
    as a public re-export so existing callers don't need updating. This is an
    offer-time relevance gate (kanban/docker/s6), NOT a hard-compatibility gate;
    explicit skill loads bypass it.
    r   )skill_matches_environment)r~   r   r   s     r4   r   r     s'     EDDDDD5r<   rg   c                 R    | sg S t          | t                    r| g} d | D             S )Nc                 n    g | ]2}t          |                                          #t          |          3S rt   r(   rN   ).0items     r4   
<listcomp>z2_normalize_prerequisite_values.<locals>.<listcomp>  s3    ===$3t99??+<+<=CII===r<   )rM   r(   )rg   s    r4   _normalize_prerequisite_valuesr     s<     	% ==%====r<   c                     |                      d          }|rt          |t                    sg g fS t          |                     d                    t          |                     d                    fS )Nprerequisitesrb   commands)getrM   dictr   )r{   prereqss     r4   _collect_prerequisite_valuesr     so     ooo..G *Wd33 2v&w{{:'>'>??&w{{:'>'>?? r<   c           	         |                      d          }t          |t                    sd g dS |                     d          }t          |t                    r5|                                r!t          |                                          nd }|                     d          }t          |t                    r|g}t          |t
                    sg }g }|D ]}t          |t                    st          |                     d          pd                                          }|sRt          |                     d          pd|                                           }t          |                     d	          p|                     d
          pd                                          }	||t          |                     dd                    d}
|	r|	|
d	<   |                    |
           ||dS )Nsetup)helpcollect_secretsr   r   env_varr   promptEnter value for provider_urlurlsecretT)r   r   r   )r   rM   r   r(   rN   listboolr'   )r{   r   	help_textnormalized_helpcollect_secrets_rawr   r   r   r   r   r2   s              r4   _normalize_setup_metadatar   '  s   OOG$$EeT"" 5444		&!!I i%%	*3//*;*;	I   ))$566%t,, 423)400 ! ,.O# & &$%% 	dhhy))/R006688 	TXXh''G+Gg+G+GHHNNPP488N33LtxxL"MMSSUU 488Hd3344!
 !

  	1$0E.!u%%%%  *  r<   legacy_env_varsc                   	 t          |           	|                     d          }t          |t                    r|g}t          |t                    sg }g t                      dt          t          t          f         dd f	fd}|D ]E}t          |t                    r |d|i           %t          |t                    r ||           F	d         D ]_} ||                    d          |                    d          |                    d	          p	                    d
          d           `|t          |           \  }}|D ]} |d|i           S )Nrequired_environment_variablesr2   r   c                    t          |                     d          p|                     d          pd                                          }|r|v rd S t                              |          sd S |t          |                     d          pd|                                           d}|                     d          p>|                     d          p)|                     d	          p                    d          }t          |t                     r+|                                r|                                |d<   |                     d
          }t          |t                     r+|                                r|                                |d
<   |                     d          rd|d<                       |                               |           d S )NrI   r   r   r   r   )rI   r   r   r   r   required_foroptionalT)r(   r   rN   _ENV_VAR_NAME_REmatchrM   addr'   )r2   env_name
normalizedr   r   requiredseenr   s        r4   _append_requiredz=_get_required_environment_variables.<locals>._append_requiredb  s   uyy((FEIIi,@,@FBGGMMOO 	8t++F%%h// 	F %))H--N1NH1N1NOOUUWW&
 &

 IIf !yy((!yy! yy  	 	 i%% 	3)//*;*; 	3!*!2!2Jvyy00lC(( 	>\-?-?-A-A 	>)5););)=)=J~&99Z   	*%)Jz"
#####r<   rI   r   r   r   r   r   )rI   r   r   )
r   r   rM   r   r   setr	   r(   r
   r   )
r{   r   required_rawr   r   rf   r   r   r   r   s
          @@@r4   #_get_required_environment_variablesr   T  s    &k22E??#CDDL,%% &$~lD)) %'HUUD$S#X $4 $ $ $ $ $ $ $ $>  # #dC   	fd^,,,dD!! 	#T"""'( 
 
++((8,,00EEIIf4E4E 	
 	
 	
 	
 9+FF" , ,&'*++++Or<   
skill_namemissing_entriesc                 0   |sg dd dS d |D             }t                      r!t          d          s|dt                      dS t          |dd dS d}g }|D ]9}d| i}|                    d          r|d         |d<   |                    d          r|d         |d<   	 t          |d         |d	         |          }nB# t
          $ r5 t                              d
|d          d           d|d         ddd}Y nw xY wt          |t                    o!t          |                    d                    }t          |t                    o!t          |                    d                    }	|r|	sd}|                    |d                    ;||d dS )NF)missing_namessetup_skippedgateway_setup_hintc                     g | ]
}|d          S rI   rt   )r   r2   s     r4   r   z;_capture_required_environment_variables.<locals>.<listcomp>  s    @@@uU6]@@@r<   HERMES_INTERACTIVEr   r   r   rI   r   z#Secret capture callback failed for Texc_info)success	stored_as	validatedskippedr   r   )_is_gateway_surfacer   _gateway_setup_hintrx   r   	ExceptionloggerwarningrM   r   r   r'   )
r   r   r   r   remaining_namesr2   metadatacallback_resultr   r   s
             r4   '_capture_required_environment_variablesr     sI     
""&
 
 	
 A@@@@M  
_5I%J%J 
*""5"7"7
 
 	
  '*""&
 
 	
 M!#O  ". ". *-99V 	-$V}HV99^$$ 	=',^'<H^$	6fh OO
  		 		 		NNEeFmEEPT     !"6]"	 OOO			 _d33 
	**9
 9
 _d33 
	**9
 9
  	7 	uV}---- )&"  s   B==<C<;C<c                  `    t          d          rdS ddlm}  t           | d                    S )NHERMES_GATEWAY_SESSIONTr   get_session_envHERMES_SESSION_PLATFORM)r   gateway.session_contextr   r   r   s    r4   r   r     sC    /00 t777777 9::;;;r<   c                      t          t          j        dd                                                                                    pdS )NTERMINAL_ENVlocal)r(   r$   getenvrN   lowerrt   r<   r4   _get_terminal_backend_namer     s9    ry112288::@@BBMgMr<   var_nameenv_snapshotc                     |t                      }| |v r"t          |                    |                     S t          t          j        |                     S rw   )rh   r   r   r$   r   )r   r   s     r4   _is_env_var_persistedr     sR     zz<L$$X..///	(##$$$r<   r   required_env_varscapture_resultc                    t          |d                   }|t                      }g }| D ]I}|d         }|                    d          r ||v st          ||          s|                    |           J|S )Nr   rI   r   )r   rh   r   r   r'   )r   r   r   r   	remainingr2   rI   s          r4   %_remaining_required_environment_namesr     s     788MzzI" # #V}99Z   	=  (=dL(Q(Q T"""r<   c                  X    	 ddl m}  | S # t          $ r dt                       dcY S w xY w)Nr   *GATEWAY_SECRET_CAPTURE_UNSUPPORTED_MESSAGEziSecure secret entry is not available. Load this skill in the local CLI to be prompted, or add the key to z/.env manually.)gateway.platforms.baser   r   r   r   s    r4   r   r     s~    bUUUUUU99 b b b b  |O  |Q  |Q  b  b  b  	b  	b  	bbs   
 ))readiness_statusmissing
setup_helpc                 z    | t           j        k    r*|rd                    |          nd}d| d}|r| d| S |S d S )N, zrequired prerequisitesz.Setup needed before using this skill: missing . )rj   rr   join)r   r   r   missing_strnotes        r4   _build_setup_noter     se    
 /<<<,3Qdii(((9QNNNN 	*))Z)))4r<   c                      dS )zOSkills are always available -- the directory is created on first use if needed.Trt   rt   r<   r4   check_skills_requirementsr   '  s    4r<   contentc                 $    ddl m}  ||           S )u   Parse YAML frontmatter from markdown content.

    Delegates to ``agent.skill_utils.parse_frontmatter`` — kept here
    as a public re-export so existing callers don't need updating.
    r   )parse_frontmatter)r~   r   )r   r   s     r4   _parse_frontmatterr   ,  s'     433333W%%%r<   
skill_pathc                 ,   t                      g}	 ddlm} |                     |                       n# t          $ r Y nw xY w|D ]L}	 |                     |          }|j        }t          |          dk    r
|d         c S =# t          $ r Y Iw xY wdS )z
    Extract category from skill path based on directory structure.

    For paths like: ~/.hermes/skills/mlops/axolotl/SKILL.md -> "mlops"
    Also works for external skill dirs configured via skills.external_dirs.
    r   )get_external_skills_dirs   N)	r;   r~   r   extendr   relative_topartslen
ValueError)r   dirs_to_checkr   
skills_dirrel_pathr   s         r4   _get_category_from_pathr  6  s     !]]OM>>>>>>55778888   #  
	!--j99HNE5zzQQx  	 	 	H	4s!   #5 
AA
6B
BBc                 4   | sg S t          | t                    rd | D             S t          |                                           } |                     d          r|                     d          r
| dd         } d |                     d          D             S )uB  
    Parse tags from frontmatter value.

    Handles:
    - Already-parsed list (from yaml.safe_load): [tag1, tag2]
    - String with brackets: "[tag1, tag2]"
    - Comma-separated string: "tag1, tag2"

    Args:
        tags_value: Raw tags value — may be a list or string

    Returns:
        List of tag strings
    c                 T    g | ]%}|t          |                                          &S rt   r   r   ts     r4   r   z_parse_tags.<locals>.<listcomp>d  s+    8881a8A888r<   []   c                     g | ]=}|                                 |                                                      d           >S )r\   )rN   r  s     r4   r   z_parse_tags.<locals>.<listcomp>k  s9    OOOqQWWYYOAGGIIOOE""OOOr<   ,)rM   r   r(   rN   r_   endswithsplit)
tags_values    r4   _parse_tagsr  P  s      	 *d## 988
8888 Z&&((JS!! &j&9&9#&>&> &"%
OOJ,<,<S,A,AOOOOr<   c                  "    ddl m}   |             S )u   Load disabled skill names from config.

    Delegates to ``agent.skill_utils.get_disabled_skill_names`` — kept here
    as a public re-export so existing callers don't need updating.
    r   get_disabled_skill_names)r~   r  r  s    r4   _get_disabled_skill_namesr  o  s%     ;:::::##%%%r<   c                  L    	 ddl m}   | d          pdS # t          $ r Y dS w xY w)zResolve the current platform from gateway session context.

    Mirrors the platform-resolution logic in
    ``agent.skill_utils.get_disabled_skill_names`` so that
    ``_is_skill_disabled`` respects ``HERMES_SESSION_PLATFORM``.
    r   r   r   r   )r   r   r   r   s    r4   _get_session_platformr  y  sQ    ;;;;;;899?R?   rrs    
##r   c                 (   	 ddl m}  |            }|                    di           }|p!t          j        d          pt                      }|                    dg           }|rt          |d|          }|| |v p| |v S | |v S # t          $ r Y dS w xY w)	a  Check if a skill is disabled in config.

    Resolves the active platform from (in order of precedence):
    1. Explicit ``platform`` argument
    2. ``HERMES_PLATFORM`` environment variable
    3. ``HERMES_SESSION_PLATFORM`` from gateway session context
    r   )load_configr6   HERMES_PLATFORMr,   platform_disabledNF)hermes_cli.configr  r   r$   r   r  r   r   )rI   r   r  config
skills_cfgresolved_platformglobal_disabledr  s           r4   _is_skill_disabledr    s    111111ZZ"--
$_	2C(D(D_H]H_H_$..R88 	L '
4GIZ [ [ , 00KDO4KK&&   uus   A<B ?B 
BBF)skip_disabledr   c           	         ddl m}m}m}m} | rt
          nt          }| rt                      nt                      }t           |                      }t          |          }t                      }	|	                                r|                    |	           |                     |                       t          ||          }
t          j                    }t"                              |          }|2|d         |
k    r&||d         z
  t&          k     rd |d         D             S g }t                      }|D ]}||v }|r ||          n ||d          }|D ]}t)          d |j        D                       r"|j        }	 |                    d	d
          dd         }t1          |          \  }}t3          |          skt5          |          s{|                    d|j                  dt8                   }||v r||v r|                    dd          }|sY|                                                    d          D ]1}|                                }|r|                    d          s|} n2tA          |          tB          k    r|dtB          dz
           dz   }tE          |          }|#                    |           |                    |||d           # tH          tJ          f$ r'}tL          '                    d||           Y d}~d}~wtP          $ r)}tL          '                    d||d           Y d}~d}~ww xY w|
||ft"          |<   d |D             S )a=  Recursively find all skills in ~/.hermes/skills/ and external dirs.

    Args:
        skip_disabled: If True, return ALL skills regardless of disabled
            state (used by ``hermes skills`` config UI). Default False
            filters out disabled skills.

    Returns:
        List of skill metadata dicts (name, description, category).

    Results are cached per-session; the cache is invalidated when the scan
    signature changes (dir/category mtimes or the disabled-set) and expires
    after a short TTL to bound staleness from in-place SKILL.md edits.
    r   )r   get_project_skills_dirsiter_project_skill_filesiter_skill_index_filesNr  c                 ,    g | ]}t          |          S rt   r   r   ss     r4   r   z$_find_all_skills.<locals>.<listcomp>  s    +++AQ+++r<      SKILL.mdc              3   (   K   | ]}|t           v V  d S rw   )_EXCLUDED_SKILL_DIRS)r   parts     r4   	<genexpr>z#_find_all_skills.<locals>.<genexpr>  s(      KKD4//KKKKKKr<   rT   rU   rV   i  rI   descriptionr   
rY   r   ...)rI   r/  categoryz Failed to read skill file %s: %sz)Skipping skill at %s: failed to parse: %sTr   c                 ,    g | ]}t          |          S rt   r&  r'  s     r4   r   z$_find_all_skills.<locals>.<listcomp>  s    $$$DGG$$$r<   ))r~   r   r"  r#  r$  _SKILLS_CACHE_KEY_DISABLED_SKILLS_CACHE_KEY_FILTEREDr   r  r   r;   r]   r'   r   r5   time	monotonicr   r   _SKILLS_CACHE_TTL_SECONDSanyr   parent	read_textr   r}   r   rI   MAX_NAME_LENGTHrN   r  r_   r   MAX_DESCRIPTION_LENGTHr  r   UnicodeDecodeErrorPermissionErrorr   debugr   )r   r   r"  r#  r$  	cache_keyr,   project_dirsr+   active_skills_dir	signaturenowcachedr6   
seen_namesscan_dir_is_project_iterskill_md	skill_dirr   r{   bodyrI   r/  rd   r2  es                               r4   _find_all_skillsrO    s4               /<[**A[I &Fsuuu+D+F+FH //1122Ll++L#!! /-...0022333&|X>>I
.

Cy))F1I""6!9_ 999
 ,+++++FeeJ
 ! 8 8,. >$$X...''*== 	
  1	 1	HKKHNKKKKK  I+",,k),TTUZVZUZ[$6w$?$?!T-k:: 0== "vy~>>?O?OP:%%8##)oomR@@" " $

 2 24 8 8 " "#zz|| "(<(< "*.K!E{##&<<<"-.I/E/I.I"JU"RK28<<t$$$ #. (      '8   ?1MMM   ?1W[     	[1	n !*37M)$$V$$$$s>   A K$K$,K$K$CK$$M5LM$MMc                 &    t          | d           S )z3Keep every skill listing path ordered the same way.c                 @    |                      d          pd| d         fS )Nr2  r   rI   r   )r(  s    r4   <lambda>z_sort_skills.<locals>.<lambda>!  s     z):):)@b!F)(L r<   )re   )sorted)r6   s    r4   _sort_skillsrU    s    &LLMMMMr<   r2  task_idc                 Z    	 t                      }|                                s|                    dd           t                      }	 ddlm}m}  |              |                                            D ]S}|                    di           }t          |          s(t          |d                   r>|                    |           Tn,# t          $ r t                              dd           Y nw xY w|st          j        dg g d	d
d          S  r fd|D             }t#          |          }t%          d |D                       }t          j        d||t'          |          ddd          S # t          $ r(}	t)          t+          |	          d          cY d}	~	S d}	~	ww xY w)a  
    List all available skills (progressive disclosure tier 1 - minimal metadata).

    Returns only name + description to minimize token usage. Use skill_view() to
    load full content, tags, related files, etc.

    Args:
        category: Optional category filter (e.g., "mlops")
        task_id: Optional task identifier used to probe the active backend

    Returns:
        JSON string with minimal skill info: name, description, category
    T)parentsexist_okr   discover_pluginsget_plugin_managerr{   rI   zPlugin skill listing failedr   z%No skills found in skills/ directory.)r   r6   
categoriesmessageFensure_asciic                 F    g | ]}|                     d           k    |S r2  rR  )r   r(  r2  s     r4   r   zskills_list.<locals>.<listcomp>T  s/    QQQ1553D3D3P3P!3P3P3Pr<   c                 b    h | ],}|                     d           |                     d           -S rb  rR  r'  s     r4   	<setcomp>zskills_list.<locals>.<setcomp>[  s5    HHH1aeeJ6G6GHQUU:HHHr<   z@Use skill_view(name) to see full content, tags, and linked files)r   r6   r]  counthintr   N)r;   r]   mkdirrO  hermes_cli.pluginsr[  r\  list_plugin_skill_metadatapopr}   r  r'   r   r   r@  jsondumpsrU  rT  r   r   r(   )
r2  rV  rC  
all_skillsr[  r\  plugin_skillr{   r]  rN  s
   `         r4   skills_listrp  $  sS   81'MM '')) 	A##D4#@@@ &''
	GOOOOOOOO 2 2 4 4 O O Q Q 0 0*..}bAA-k:: %l6&:;; !!,////0  	G 	G 	GLL6LFFFFF	G  		:# "$F	  #     	RQQQQZQQQJ "*--
 HH
HHH
 

 z$(ZZ  	
 	
 	
 		
  1 1 1#a&&%0000000001sJ   AE8 BC E8 &C74E8 6C77E8 A E8 8
F*F%F*%F*T)
preprocess
session_idrK  	namespacebare	file_pathrq  rr  c                8   ddl m}m} | |            v rt          j        dd| d| dd          S 	 |                     dd	
          n9# t          $ r,}t          j        dd| d d| dd          cY d}~S d}~ww xY wi }		 t                    \  }	}
n# t          $ r Y nw xY w| d }t          |          rt          j        dd| ddd          S t          |	          s-t          j        dd| dt          j        j        dd          S |rhddlm}m} | j        } ||          rt          j        dddd          S ||z  } |||          }|rt          j        d|dd          S |                                s#t          j        dd| d| d ddd          S 	 |                    dd	
          n# t$          $ rG t          j        d| d |d|j         d|                                j         dddd          cY S t          $ r)}t          j        dd| d| dd          cY d}~S d}~ww xY wt          j        d| d ||j        t/          |          dd          S t1          fdt2          D                       rt4                              d |           t/          |	                    d!d"                    }t;          |          t<          k    r|dt<          d#z
           d$z   }	 fd% |                                |          D             }|r+d&                     |          }d'| d(| d)| d|d          d*	}nd'| d+}n# t          $ r d"}Y nw xY w}|rI	 dd,l!m"}  || j        |-          }n.# t          $ r! t4          #                    d.|d/           Y nw xY wt          j        d| d |r| | n||tI          | j                  t          j%        j        d0d          S )1z8Read a plugin-provided skill, apply guards, return JSON.r   )_get_disabled_pluginsr\  FzPlugin 'z5' is disabled. Re-enable with: hermes plugins enable r   errorr_  rT   rU   rV   Failed to read skill ':': NSkill 'z' is disabled.$' is not supported on this platform.r   ry  r   )rK   validate_within_dir%Path traversal ('..') is not allowed.File '' not found in skill ''.T[Binary file: , size:  bytes]r   rI   filer   	is_binaryzFailed to read 'r   rI   r  r   	file_type_source_pathc              3   D   K   | ]}|                                 v V  d S rw   )r   )r   pr   s     r4   r.  z&_serve_plugin_skill.<locals>.<genexpr>  s0      
=
=A1
=
=
=
=
=
=r<   zIPlugin skill '%s:%s' contains patterns that may indicate prompt injectionr/  r   r   r1  c                      g | ]
}|k    |S rt   rt   )r   r(  rt  s     r4   r   z'_serve_plugin_skill.<locals>.<listcomp>  s*     
 
 
Dyy yyr<   r   z,[Bundle context: This skill is part of the 'z' plugin.
Sibling skills: z..
Use qualified form to invoke siblings (e.g. z).]

z' plugin.]

preprocess_skill_contentrr  z'Could not preprocess plugin skill %s:%sr   )r   rI   r   r/  linked_filesr   )&ri  rw  r\  rl  rm  r;  r   r   r  r}   rj   rs   rg   rL   rK   r  r:  is_filer>  rI   r!   st_sizesuffixr(   r9  ru   r   r   r   r   r=  list_plugin_skillsr   agent.skill_preprocessingr  r@  _plugin_skill_linked_filesrq   )rK  rs  rt  ru  rq  rr  rw  r\  rN  parsed_frontmatterrf   qualified_namerK   r  
skill_roottarget
path_errorexcr/  siblingssib_listbannerrendered_contentr  r   s     `                     @r4   _serve_plugin_skillr  p  s    MLLLLLLL))++++z Iy I I=FI I  	
 	
 	
 		

 $$k)$LL 
 
 
z(Y(Y(YT(Y(YVW(Y(YZZ
 
 
 	
 	
 	
 	
 	
 	

 *, 27 ; ;AA    "**D**N.)) 
z A>AAA  
 
 
 	
 ""455 
z W>WWW$8$D$J 
 
 
 
 	
  3
TTTTTTTT_
""9-- 	:!,STT"    i'((<<
 	:!J77e    ~~ 	:$[i[[y[[SW[[[  #   	&&I&NNGG! 
	 
	 
	:#(11411%cccV[[]]EZccc!%  #	 	 	 	 	 	  	 	 	:!,Ry,R,RS,R,RSS"        	
 z$--t--!"#] #F  

 

 

 
	
 
=
=
=
=)<
=
=
=== 
Wt	
 	
 	

 (,,]B??@@K
;000!">$:Q$>">?%G
 
 
 
))++>>yII
 
 
  	^yy**H`y ` `#+` `?H` `KSTU;` ` ` F ^I]]]F     	JJJJJJ77%     
  	 	 	LL99dUY      	
 : ))4))8>T&4"2444DT&6xGG 4 > D	
 	
 
 
 
 
sy   A 
B!B :B BB 
B+*B+7G AI	I(IIIAM2 2N N	N# #(OOr  c                      ddl m i }dD ]R} |z  }|                                s fdt          |                    d                    D             }|r|||<   S|pd S )Nr   )r  )
references	templatesassetsscriptsc                     g | ]D}|                                 r. |          "t          |                                        ES rw   )r  r(   r   )r   pathr  r  s     r4   r   z._plugin_skill_linked_files.<locals>.<listcomp>%  s`     
 
 
||~~
 $#D*55=   ,,-- >==r<   *)rL   r  r&   rT  rglob)r  linkedr2  basefilesr  s   `    @r4   r  r    s    777777#%FD % %H${{}} 	
 
 
 
 
tzz#//
 
 
  	%$F8>Tr<   c                 >'  bcdefghij 	 t          |           }|rt          j        d|ddd          S d}d| v rddlm}m} dd	lm}m}	  ||           \  f}
 |f          s t          j        dd
f d|  ddd          S  |              |	            }d}	 ddl	m
}m}  |            } ||           n2# t          $ r%}t                              d|           Y d}~nd}~ww xY w|                    |           }|a	 ddl	m} f|k    r  |f           |                    |           }n3# t          $ r&}t                              df|           Y d}~nd}~ww xY w|^|                                s5|                    |            t          j        dd|  d| ddd          S t'          |f|
|||          S |                    f          }|rBt          j        dd|
 df dffd|D             df dt+          |           ddd          S |
rf d|
 }ddlm}m} |r+t          |          }|rt          j        d|ddd          S  |            gt1          g          }t3                      }|                                r|                    |           |                     |                       |st          j        dddd          S djd}dd lm} g dt;                      id!t<          t>                   d"t>          d#dfdifd$}|D ]L}|| z  }tA          |          s;|!                                r'|d%z                                  r |||d%z             nh|"                    d&                                          rAtA          |"                    d&                    s |d|"                    d&                     |r||z  }tA          |          s;|!                                r'|d%z                                  r |||d%z             nh|"                    d&                                          rAtA          |"                    d&                    s |d|"                    d&                      ||d%          D ]}|j#        j$        | k    r ||j#        |           $	 |%                    d'd()          }tM          |          \  }} n# t          $ r i }Y nw xY w|'                    d*          | k    r ||j#        |           |(                    |  d&          D ](}!|!j$        d%k    rtA          |!          s |d|!           )Nt+          d          d+k    r(gr&d"t>          d#tR          fgfd,ccfd-dD             }"|"r|"dt+          d          d+k    rd. dD             }#tU          j+        tX                    -                    d/| t+          d          d0.                    |#                     t          j        dd1|  d2t+          d           d3|#d4d5d          S drdd         \  j}|PgrNdd6lm/}$ d7t>          d#tR          fgfd8}% |%|          r) |$|          rt          j        dd9|  d:d;dd          S |r|                                sLd< ta          tc                                dd=         D             }t          j        dd|  d>|d?dd          S 	 |%                    d'd()          }&n6# t          $ r)}'t          j        dd@|  d2|' dd          cY d}'~'S d}'~'ww xY wdA}(|2                                g})	 |)                    dB |D                        n# t          $ r Y nw xY w|)D ]=}*	 |2                                3                    |*           d}( n# th          $ r Y :w xY w|&5                                btm          bfdCtn          D                       }+|(s|+rtg },|(r|,                    dD|            |+r|,                    dE           tU          j+        tX                    -                    dF| d0.                    |,                     i }-	 tM          |&          \  }-} n# t          $ r i }-Y nw xY wtq          |-          s-t          j        dd|  dGtr          j:        j;        dHd          S |-'                    d*|j#        j$                  }.ty          |.          rt          j        dd|. dIdd          S |r׉jrddJl=m>}/m?}0  |0|          rt          j        ddKdLdd          S j|z  }1 |/|1j          }2|2rt          j        d|2dLdd          S |1                                sg g g g g dM}3j(                    dN          D ]/}4|4@                                r|4j$        d%k    rt          |43                    j                    }5|5B                    dO          r|3dP                             |5           w|5B                    dQ          r|3dR                             |5           |5B                    dS          r|3dT                             |5           |5B                    dU          r|3dV                             |5           |4jC        dWv r|3dX                             |5           1dY |3D                                D             }3t          j        ddZ| d[|  d|3d\d]d          S 	 |1%                    d'd()          }&nO# t          $ rB t          j        dA| |d^|1j$         d_|1F                                jG         d`dAdad          cY S w xY w	 ddblHmI}6  |6|1           n-# t          $ r  t                              dc|1dAd           Y nw xY wt          j        dA| ||&|1jC        t          |1          ded          S |-}7g }8g }9g }:g };jrXjdPz  }<|<                                r!jfdf|<J                    dg          D             }8jdRz  }=|=                                r9dhD ]6}>|9                    jfdi|=(                    |>          D                        7jdTz  }?|?                                ra|?(                    dN          D ]K}4|4@                                r5|:                    t          |43                    j                               LjdVz  }@|@                                r9djD ]6}>|;                    jfdk|@J                    |>          D                        7i }A|7'                    dl          }Bt          |Bt                    r|B'                    dmi           pi }At          |A'                    dn          p|7'                    dndo                    }Ct          |A'                    dp          p|7'                    dpdo                    }Di }E|8r|8|EdP<   |9r|9|EdR<   |:r|:|EdT<   |;r|;|EdV<   	 t          |3                    |                    }FnO# th          $ rB |j#        j#        r,t          |3                    |j#        j#                            n|j$        }FY nw xY w|7'                    d*js|jN        njj$                  }Gt          |7          \  }H} t          |7|H          }It                      }Jt                      eefdq|ID             }Kt          |G|K          }L|Krt                      et          |I|Ler          htS          h          }Mhfds|ID             }N|Nr@	 ddtlUmV}O  |O|N           n-# t          $ r  t                              du|GdAd           Y nw xY w|7'                    dvg           }Pt          |Pt0                    sg }Pg }Q|PrD	 ddwlWmX}R  |R|P          }Q|QrdA}Mn-# t          $ r  t                              dx|GdAd           Y nw xY w|&}S|rC	 ddylYmZ}T  |T|&j|z          }Sn-# t          $ r  t                              d{|GdAd           Y nw xY wd}Ujr%	 dd|lm[}Vm\}Wm]}X  |Wj|          r |Xj|          }Ydo}Zdo}[|Yr	 t          j^        |d}z  |Yz  |Vz  %                    d'd()                    }\t          |\'                    d~          p|\'                    d          pdo          }Zt          |\'                    d          pdo          }[n# t          $ r Y nw xY w|Y|Zpd|[pdd}Ud|Y d|Zrd|Z dndoz   |[rd|[ ndoz   dz   }]|]|Sz   }Sn-# t          $ r  t                              d|GdAd           Y nw xY wi ddAd*|Gd|7'                    ddo          dn|Cdp|Dd|Sd|Fdjrt          j          ndd|Ud|Er|Endd|Erdndd|Idg dhd|Qdg d|M|Ld         |Mrtr          j_        j;        ntr          j`        j;        t          |          d}^t          d |ID             d          }_|_r|_|^d<   |Ld         r|Ld         |^d<   	 ddblHmI}6  |6|           n-# t          $ r  t                              dc|dAd           Y nw xY w|Mr`d hD             d |QD             z   }`t          tr          j_        |`|_          }a|Jt          v r|ar|a d|Jd                                 d}a|ar|a|^d<   |7'                    d          r|7d         |^d<   t          |Bt                    r|B|^dl<   t          j        |^d          S # t          $ r(}'t          t          |'          d          cY d}'~'S d}'~'ww xY w)a  
    View the content of a skill or a specific file within a skill directory.

    Args:
        name: Name or path of the skill (e.g., "axolotl" or "03-fine-tuning/axolotl").
            Qualified names like "plugin:skill" resolve to plugin-provided skills.
        file_path: Optional path to a specific file within the skill (e.g., "references/api.md")
        task_id: Optional task identifier used to probe the active backend
        preprocess: Apply configured SKILL.md template and inline shell rendering
            to main skill content. Internal slash/preload callers disable this
            because they render the skill message themselves.

    Returns:
        JSON string with skill content or error message
    Fz>Use a skill name or relative path within the skills directory.)r   ry  rf  r_  Nr{  r   )is_valid_namespaceparse_qualified_namerZ  zInvalid namespace 'z' in 'z('. Namespaces must match [a-zA-Z0-9_-]+.rx  )_get_active_memory_provider&_prune_inactive_memory_provider_skillsz2Failed pruning inactive memory-provider skills: %s)load_memory_providerz1Failed lazy memory-provider skill load for %s: %sr}  z' file no longer exists at uT   . The registry entry has been cleaned up — try again after the plugin is reloaded.)ru  rq  rr  z' not found in plugin 'r  c                     g | ]	} d | 
S )r{  rt   )r   r(  rs  s     r4   r   zskill_view.<locals>.<listcomp>  s'    ,S,S,SA	-?-?A-?-?,S,S,Sr<   zThe 'z' plugin provides z
 skill(s).)r   ry  available_skillsrf  /)r   r"  zISkills directory does not exist yet. It will be created on first install.)r$  sdsmdr   c                     	 |                                 }n# t          $ r |}Y nw xY w|v rd S                     |                               | |f           d S rw   )resolver   r   r'   )r  r  re   
candidatesseen_mds      r4   _recordzskill_view.<locals>._record  sy    kkmm   g~~KKr3i(((((s    ''r*  .mdrT   rU   rV   rI   r  c                     	 |                                  }n# t          $ r | }Y nw xY wD ]*}	 |                    |            dS # t          $ r Y 'w xY wdS NTFr  r   r   r   )r  resolvedpdrB  s      r4   _in_projectzskill_view.<locals>._in_project8  s    #"{{}}HH  # # #"HHH#& ! !B! ,,R000#tt% ! ! ! !u    ''A
AAc                 4    g | ]\  }} |          ||fS rt   rt   )r   r  r  r  s      r4   r   zskill_view.<locals>.<listcomp>E  s@     " " "%b#{{37G7G"S	" " "r<   c                 2    g | ]\  }}t          |          S rt   )r(   )r   rf   r  s      r4   r   zskill_view.<locals>.<listcomp>L  s"    777&!SSXX777r<   u3   Skill name collision for '%s': %d candidates — %sz; zAmbiguous skill name 'r|  u    skills match across your local skills dir and external_dirs. Refusing to guess — load one explicitly by its categorized path.zPass the full relative path instead of the bare name (e.g., 'category/skill-name'), or rename one of the colliding skills so each name is unique.)r   ry  matchesrf  )is_quarantined_project_skillr  c                     	 |                                  }n# t          $ r | }Y nw xY wD ]*}	 |                    |            dS # t          $ r Y 'w xY wdS r  r  )r  rpr  rB  s      r4   _under_projectz"skill_view.<locals>._under_projectl  s    BB    BBB& ! !B!r***#tt% ! ! ! !ur  zProject skill 'z' is quarantined: the security scan flagged its content as dangerous. It will not load until the repo's skill content changes and passes a re-scan.zYInspect the skill in the repo checkout, or untrust the repo with `hermes skills untrust`.c                     g | ]
}|d          S r   rt   r'  s     r4   r   zskill_view.<locals>.<listcomp>  s    RRRq6RRRr<      z' not found.z+Use skills_list to see all available skillsrz  Tc              3   >   K   | ]}|                                 V  d S rw   )r  )r   r/   s     r4   r.  zskill_view.<locals>.<genexpr>  s*       ? ? ? ? ? ? ? ?r<   c              3       K   | ]}|v V  	d S rw   rt   )r   r  _content_lowers     r4   r.  zskill_view.<locals>.<genexpr>  s(      !S!S!!~"5!S!S!S!S!S!Sr<   zHskill file is outside the trusted skills directory (~/.hermes/skills/): zBskill content contains patterns that may indicate prompt injectionz#Skill security warning for '%s': %sr~  r  zT' is disabled. Enable it with `hermes skills` or inspect the files directly on disk.)r  rK   r  z.Use a relative path within the skill directory)r  r  r  r  otherr  zreferences/r  z
templates/r  zassets/r  zscripts/r  >   .py.sh.tex.yml.json.yamlr  r  c                     i | ]
\  }}|||S rt   rt   )r   kvs      r4   
<dictcomp>zskill_view.<locals>.<dictcomp>  s#    "Q"Q"QDAqq"Q1a"Q"Q"Qr<   r  r  z0Use one of the available file paths listed above)r   ry  available_filesrf  r  r  r  r  )!mark_background_review_skill_readz4Could not record background-review skill read for %sr   r  c                 T    g | ]$}t          |                                        %S rt   r(   r   r   rc   rL  s     r4   r   zskill_view.<locals>.<listcomp>^  s:     # # #67Ci0011# # #r<   *.md)r  *.pyz*.yamlz*.ymlz*.jsonz*.tex*.shc                 T    g | ]$}t          |                                        %S rt   r  r  s     r4   r   zskill_view.<locals>.<listcomp>n  s=        !  i 8 899  r<   )r  r  z*.bashz*.jsz*.tsz*.rbc                 T    g | ]$}t          |                                        %S rt   r  r  s     r4   r   zskill_view.<locals>.<listcomp>  s-    VVV1Q]]95566VVVr<   r   hermestagsr   related_skillsc                 j    g | ]/}|                     d           t          |d                   -|0S )r   rI   )r   r   )r   rN  r   s     r4   r   zskill_view.<locals>.<listcomp>  sS     %
 %
 %
55$$%
 *!F)\BB	%
%
 %
 %
r<   r   c                 4    g | ]}|d          v|d          S r   rt   )r   rN  remaining_missing_required_envss     r4   r   zskill_view.<locals>.<listcomp>  s7     
 
 
y ??? fI???r<   )register_env_passthroughz/Could not register env passthrough for skill %srequired_credential_files)register_credential_filesz0Could not register credential files for skill %sr  r  z)Could not preprocess skill content for %s)ORG_PROVENANCE_FILEis_org_mirror_pathorg_id_of_path_orgauthor_deviceauthor_user_idts)org_id	shared_byas_ofu\   > [!NOTE] ORG-SHARED SKILL — provenance
> This skill is shared by your organisation (org ``z, last updated by `z, as of uP  ). It was reviewed and approved for the whole
> team — treat it as third-party instructions rather than your own notes.
> You MAY improve it in place like any other skill. Your edits are kept locally
> and are never overwritten by org updates; share them back with
> `hermes sync propose` (or automatically, if your org enables it).

z'Could not resolve org provenance for %sr   r/  r   r  rL  org_provenancer  
usage_hintzzTo view linked files, call skill_view(name, file_path) where file_path is e.g. 'references/api.md' or 'assets/config.yaml'r   required_commands&missing_required_environment_variablesmissing_credential_filesmissing_required_commandsrl   r   )r   r   r  c              3   P   K   | ]!}|                     d           |d          V  "dS )r   NrR  )r   rN  s     r4   r.  zskill_view.<locals>.<genexpr>R  s5      QQ155==Q1V9QQQQQQr<   r   r   c                     g | ]}d | S )zenv $rt   )r   r   s     r4   r   zskill_view.<locals>.<listcomp>e  s.       '/"""  r<   c                     g | ]}d | S )zfile rt   )r   r  s     r4   r   zskill_view.<locals>.<listcomp>g  s+       #'  r<   r   zW-backed skills need these requirements available inside the remote environment as well.
setup_notecompatibilityrg  )frR   rl  rm  r~   r  r  ri  r[  r\  plugins.memoryr  r  r   r   r@  find_plugin_skillr  r]   remove_plugin_skillr  r  r   r   r"  r   r;   r'   r   r$  r   r   r   _is_skill_support_pathr&   with_suffixr:  rI   r;  r   r   r  r   logging	getLoggerrn   r   r   r  rU  rO  r  r   r   r   r9  ru   r}   rj   rs   rg   r  rL   r  rK   r  r(   r_   r  itemsr>  r!   r  tools.skill_manager_toolr  globrM   r   r  stemr   r   r   rh   r   r   tools.env_passthroughr  tools.credential_filesr  r  r  r  r  r  loadsrr   rq   nextr   _REMOTE_ENV_BACKENDSupperr   )krI   ru  rV  rq  lookup_errorlocal_category_namer  r  r[  r\  rt  pmactive_memory_providerr  r  r  plugin_skill_mdr  rk   r   r"  all_dirsrC  rK  r$  r  
search_dirdirect_pathcategorized_pathfound_skill_md
fm_contentfmrf   found_mdproject_candidatespathsr  r  r   rN  _outside_skills_dir_trusted_dirs_td_injection_detected	_warningsr  resolved_namer  rK   target_filetraversal_errorr  rc   relr  r{   reference_filestemplate_filesasset_filesscript_filesreferences_dirtemplates_dirext
assets_dirscripts_dirhermes_metar   r  r  r  r   r   r   r   backendmissing_required_env_varsr   rl   available_env_namesr  required_cred_files_rawmissing_cred_filesr  r  r  r  r  r  r  prov_orgauthorr  provheaderresultr   missing_itemsr  r  r  r  r   rs  rB  r  r  rL  sk                                                                                                     @@@@@@@@@r4   
skill_viewrH  0  s   *x1
 055 	:$)\ 
 #    +/ $;;RRRRRRRROOOOOOOO22488OIt%%i00 
z#(E) E E4 E E E  "'	 	 	 	 ##%%B%)"       
 *E)D)F)F&667MNNNN   H        !22488O &CCCCCC $:::,,Y777*,*>*>t*D*D    LLK!        *&--// **4000:',!7$ !7 !7#2!7 !7 !7  &+    +#')&    --i88I 	z#(!U4!U!U	!U!U!U,S,S,S,S,S,S,S _	 _ _S^^ _ _ _	  "'     <)2&;&;T&;&;#WWWWWWWW  
	34GHHL z#(!- ` 
 "'    /.00%%'MM##%% 	/OO-...0022333 	:$h  #    	 	=<<<<<8:
uu	) 	)T 	)d 	) 	) 	) 	) 	) 	) 	) # :	, :	,J %t+K*;77	>&&((	> !:-5577	>
 [:%=>>>>((//6688 >AW''..B B > k55e<<===
 # G#-0C#C ./?@@G(//11G *J6>>@@G
 G,.>.KLLLL%11 &((G#9$0077$ $G
 GD"2">">u"E"EFFF #9"8Z"P"P 
C 
C!(-55GN1>BBB!/!9!9;W`!9!a!aJ.z::EB    BBB66&>>T))GN1>BBB ',,\\\:: , ,=J..7M8 8. GD(+++	, z??Q<
 $      " " " ")3" " " " 0/
z??Q77J777Eh''//Ec*ootyy'7'7   :$] ] ]#j// ] ] ]  %C  #   $  	0",Q-Ix
 LFFFFFF$ 4       ~h'' ,H,H,R,R z#(0d 0 0 0E  "'   "  
	x00 
	RRL9I9K9K,L,LSbS,QRRRI:$9t999(1I	  #   		((+i(PPGG 	 	 	:$BdBBqBB  #        	 #*22445	   ? ?h ? ? ????? 	 	 	D	  	 	C  ""..s333&+#   
 !!!S!S!S!S?R!S!S!SSS 	s"5 	sI" x  !vlt!v!vwww" g  !efffh''//0UW[]a]f]fgp]q]qrrr-/	$$6w$?$?! 	$ 	$ 	$!#	$ &&899 	:$QtQQQ(<(H(N 
 #    +..vx7KLLm,, 
	:$`- ` ` `  #	 	 	 	  p	 p	XXXXXXXX '&y11 z#(!H P 
 "'    $i/K 21+yIIO z#(!0 P 
 "'    %%'' , #%!# !# # #-- A AAyy{{ Aqv';';!!--	":":;;>>-88 A+L9@@EEEE ^^L99 A+K8??DDDD ^^I66 A+H5<<SAAAA ^^J77 A+I6==cBBBBX *   ,G4;;C@@@ #R"QO4I4I4K4K"Q"Q"Qz#(!S)!S!S4!S!S!S+: R	  "'   %//Y/WW%   z#' $ )#qK4D#q#qkN^N^N`N`Nh#q#q#q%)  "'	 	 	 	 	 		VVVVVV11+>>>>   J!       :# %&!,!3 %($4$4	 	 #    )  %	&5N$$&& # # # #;I;N;Nv;V;V# # # &3M##%%   C #))   %2%8%8%=%=      #X-J  "" J#))#.. J JAyy{{ J#**3q}}Y/G/G+H+HIII#i/K!!## M  C ''VVVV@P@PQT@U@UVVV    ??:..h%% 	;",,x44:K;??622Qkoofb6Q6QRR$OO,--VAQSU1V1V
 

  	9)8L& 	7(6L% 	1%0L" 	3&2L#	v8//0ABBCCHH 	v 	v 	vLTOLbus8//0FGGHHHhphuHHH	v !__FHMM	
 

 :+FF?
 
 -..zz%
 %
 %
 %
&%
 %
 %
! A%
 
 % 	&#::L*O%+
 +
 +
'
 ;<<

 
 
 
&
 
 

  
		JJJJJJ(()<====   E!       #.//2Mr"R"R1488 	)&(##%" 	LLLLLL%>%>?V%W%W"% (#'L   F!       # 	NNNNNN#;#;&$ $ $  
    ?VZ        9	8          &%i1BCC +A-~i9JKKHFB !!#':$5&,%-&.%/ ':%: #,)[)"S"S$ $D &) $ 9 9 !&#'88,<#=#=!&#%& &F
 "%TXXd^^%9r!:!:BB( ! ! ! D! #+%+^t!#t& &N($( ( ( ?EL:::::"N /18?b???b	:
//   (.0@'@$   =!      
t
J
 ;??="==
 D	

 n
 '
 H
 9>Y$
 n
 LBLLd
   W  W
 -.?
  
  56U!
" '(:#
$ (%
& L'
( ,O<!6 4 A G G%/5  MM5
 
 
: QQ.?QQQSWXX
 	.#-F< ./ 	P+9:N+OF'(		RRRRRR--h7777 	 	 	LLF      	  	2 3R   +=  M
 +$1 J
 ...:. *  V  VW]]__  V  V  V
 2'1|$ ???++ 	C&1/&BF?#h%% 	*!)F:z&u5555 1 1 1#a&&%0000000001sM  *AM* AAM* AM* B; :AM* ;
C*C% AM* %C**AM* ,D2 1AM* 2
E"<EAM* E""AAM* 0AM* AAM* =AM* BAM* $G!AM* )S0/AM* 0S?<AM* >S??EAM* AAM* 'A!AM* 
\" !AM* "
],]
]AM* ]AM* 0^ AM* 
^AM* ^AM* %)_AM* 
_AM* _B1AM* b" !AM* "b1.AM* 0b11>AM* 0AAM* <2AM* /,AM* F"AM*  m AM* A	n$!AM* #n$$AM* (n: 9AM* :'o$!AM* #o$$1AM* H7AM* "y1 0AM* 1A	z=:AM* <z==CAM* ~ AM* '~>;AM* =~>>4AM* 3A@	 @AM* @	'A@3@0AM* @2A@3@3AM* @;AA AAM* A'AA:A7AM* A9AA:A:AM* B(AE: B,BAD< D;AE: D<
AE	EAE: EAE	E	0AE: E9AM* E:'AF$F!AM* F#AF$F$CAM* I9AJ J
AM* J'AJ5J2AM* J4AJ5J5B4AM* M*
ANM4ANNANNAN__main__u   🎯 Skills Tool Testz<============================================================u   
📋 Listing all skills:r   zFound re  z skills in r]  z categorieszCategories: z
First 10 skills:
   r  z] r   u     • z: r/  <   r1  zError: ry  u   
📖 Viewing skill 'axolotl':axolotlzName: zDescription: zN/Ad   zContent length: z charsr  zLinked files: uE   
📄 Viewing reference file 'axolotl/references/dataset-formats.md':zreferences/dataset-formats.mdzFile: r  z	Preview:    rp  zVList available skills (name + description). Use skill_view(name) to load full content.objectstringz*Optional category filter to narrow results)typer/  )rQ  
propertiesr   )rI   r/  
parametersrH  ah  Skills allow for loading information about specific tasks and workflows, as well as scripts and templates. Load a skill's full content or access its linked files (references, templates, scripts). First call returns SKILL.md content plus a 'linked_files' dict showing available references/templates/scripts. To access those, call again with file_path parameter.zThe skill name (use skills_list to see available skills). For plugin-provided skills, use the qualified form 'plugin:skill' (e.g. 'superpowers:writing-plans').zOPTIONAL: Path to a linked file within the skill (e.g., 'references/api.md', 'templates/config.yaml', 'scripts/validate.py'). Omit to get the main SKILL.md content.)rI   ru  c                 p    t          |                     d          |                    d                    S )Nr2  rV  )r2  rV  )rp  r   )argskws     r4   rS  rS    s2    {*%%rvvi/@/@      r<   u   📚)rI   toolsetschemahandlercheck_fnemoji_skill_view_tracker   u   Skill content unchanged since it was loaded earlier in this conversation — refer to the earlier skill_view result; it is still current and complete. (Re-issued after context compression, this returns the full content again.)payloadc                     |                      d          }|sdS 	 t          j        |          }||j        |j        fS # t
          $ r Y dS w xY w)zIStat the skill file a successful skill_view served, for change detection.r  N)r   r$   r!   st_mtime_nsr  r#   )r^  srcsts      r4   _skill_view_fingerprintrc    se    
++n
%
%C tWS\\R^RZ00   tts   "> 
AAc                 n   | sdS |                     d          s|                     d          dk    rdS t          |          }|dS t          |                     d          p|          |pdf}t          5  t                              t          |           i           }|||<   t          |          t          k    r`	 |                    t          t          |                               n# t          t          f$ r Y nw xY wt          |          t          k    `ddd           dS # 1 swxY w Y   dS )zARecord a served skill_view so an identical repeat can be deduped.Nrl   r   rI   r   )r   rc  r(   _skill_view_tracker_lockr\  
setdefaultr   _SKILL_VIEW_DEDUP_CAPrk  r  iterStopIterationKeyError)rV  rI   ru  r^  fpre   caches          r4   _record_skill_viewrm    s     {{>"" gkk2D&E&E&W&W	 	)	)B	zw{{6""*d++Y_"
=C	!  #..s7||R@@c
%jj000		$tE{{++,,,,!8,    %jj000                 s7   7AD*>/C.-D*.D?D*DD**D.1D.c                    | sdS t           5  t                              t          |                     }|s	 ddd           dS t	          |                                          D ]T\  }\  }}}|\  }}	|	|pdk    r|t          |          k    rwt          |                              d|z             sR|                    dt          |          z             s-t          |                              d          d         |k    r	 t          j	        |          }
|
j
        |
j        f||fk    r$|                    |d            ddd           dS n3# t          $ r& |                    |d           Y  ddd           dS w xY wt          j        dd||pddd	t           d
d	          c cddd           S 	 ddd           n# 1 swxY w Y   dS )z|Return a dedup stub when this exact skill file was already served
    to this task and is unchanged on disk; None otherwise.Nr   r  r{  r	  T	unchangedr*  F)r   statusrI   r  dedupcontent_returnedr^  r_  )re  r\  r   r(   r   r  r  r  r$   r!   r`  r  rk  r#   rl  rm  _SKILL_VIEW_DEDUP_MESSAGE)rV  rI   ru  rl  re   ra  mtime_nssizerec_namerec_fprb  s              r4   _check_skill_view_deduprx    s     t	! ! !#''G55 	! ! ! ! ! ! ! ! +/u{{}}*=*= 	 	&C&#x"Hf)/r**3t99$$SYY-?-?h-O-O$$--cCIIo>> %D		,,R0H<<WS\\NBJ/Hd3CCCIIc4(((%! ! ! ! ! ! ! !  D    		#t$$$t+! ! ! ! ! ! ! !& :#)$%3!(-8  #    -! ! ! ! ! ! ! !	! ! ! ! ! ! ! ! ! ! ! ! ! ! !D 4sB   +GCG>EGG F5GF)GGGc                     t           5  | t                                           n(t                              t	          |           d           ddd           dS # 1 swxY w Y   dS )zClear the skill_view dedup cache (all tasks when task_id is None).

    Called on context compression: the original skill content is
    summarized away, so a re-view must return full content again.
    N)re  r\  clearrk  r(   )rV  s    r4   reset_skill_view_dedupr{  =  s     
" 8 8?%%''''##CLL$777	8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   AAA!Ac                    |                      dd          }|                     d          }t          |||                      d                    }||S t          ||                      d          |          }	 t          j        |          }t          |t                    r|                     d          rt          |||                      d          |           |                     d          p|}|radd	lm	}m
}	  |	t          |                      |t          |          |                     d          |                     d
                     n# t          $ r Y nw xY w|S )ztInvoke skill_view, then bump view_count on success. Best-effort: a
    telemetry failure never breaks the tool call.rI   r   rV  ru  N)ru  rV  r   r   )bump_use	bump_viewrr  )rV  rr  )r   rx  rH  rl  r  rM   r   rm  tools.skill_usager}  r~  r(   r   )
rU  rV  rI   rV  stubrF  parsedr  r}  r~  s
             r4   _skill_view_with_bumpr  J  s    88FBDffYG #7D$((;2G2GHHD--w  FF##fd## 	

9(=(= 	wdhh{.C.CVLLL zz&))1TH 
AAAAAAAA	#h--((( MMFF9--!vvl33   
    Ms   :CE 
E%$E%)r   Nrw   )NN)NNT)p__doc__rl  r  r6  	threadinghermes_constantsr   r   r$   reenumr   pathlibr   r   r   typingr	   r
   r   r   r   r   tools.registryr   r   r  r   utilsr   r~   r   r,  r   r  r  rn   r   r   r   __annotations__r8  r4  r5  r)   r5   HERMES_HOMEr8   r9   r;   r<  r=  _PLATFORM_MAPcompiler   r*   r  rx   r(   rR   rh   rj   ru   r   rz   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  rO  rU  rp  r  r  rH  printr  rF  r   r   skillcatSKILLS_LIST_SCHEMASKILL_VIEW_SCHEMAregisterr\  Lockre  rg  rs  rc  rm  rx  r{  r  rt   r<   r4   <module>r     s  A A AF        A A A A A A A A 				 				       8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 / / / / / / / / % % % % % % ! ! ! ! ! !       
 
	8	$	$ t     , ' 7e 7 7 7 7H o8#
" (T ( ( ( (  
  
 2:9::  yJJJ     3 8C=    6$sCx.    *         3      
 
 
 T 
 
 
( ( ( (
S#X 4    	4S> 	d 	 	 	 	># >$s) > > > >	c3h	
49d3i 	 	 	 	*4S> *d38n * * * *^ )-B Bc3hB#Y%B 
$sCx.B B B BJKK$sCx.)K 
#s(^K K K K\<T < < < <NC N N N N
 :>% %%!%c3h$!6%	% % % % +/	  DcN+cN sCx.4'	
 
#Y   (bS b b b b " *#Y d
 	4Z	   4    
& &d38nc.A(B & & & & #    4PtCy P P P P>&3s8 & & & &s     S C 4    4 /4 {% {% {%t {%T#s(^8L {% {% {% {%|Nd38n- N$tCH~2F N N N N
F1 F1# F1s F1c F1 F1 F1 F1` !	j !j j jjj j Tz	j j d
j 	j j j jZ4 Dd3i4H44O    * 	M1 M1
M1M1 M1 	M1
 	M1 M1 M1 M1d z	E
!"""	E(OOO 
E
&'''TZ&&Fi 
+_VG___VZZb5Q5Q1R1R___	
 	
 	
 	;VZZb99;;<<<"###H%crc* 	Q 	QE/4yy/D/DL+eJ'++++"CEO3OfOO}1Ecrc1JOOOPPPP	Q 	)w))*** 
E
+,,,TZ

9--..Fi +'vf~''(((Ifjj>>ttDIIIJJJ?VI%6!7!7???@@@::n%% 	=E;6.#9;;<<<)w))*** 
E
RSSSTZ

9.MNNOOFi +'vf~''(((?VI%6!7!7???@@@6&+DSD16667777)w))*** k K 
 	 	     ~ !  A 
 !  F 	
 	
 H   &  	  '
	 	 	 	" 68 T#tE5L112 7 7 7)9>++  ' 	T 	edl 	 	 	 	$ 4    .'t ' ' ' 'T
8 
8C$J 
8$ 
8 
8 
8 
8) ) )X  	!&
     r<   