
    Cj                        S r SSKJr  SSKrSSKJr  SSKJrJrJ	r	  SSK
JrJr  SSKJr  \R                  " \5      rSrS	S
S
S.         SS jjrSS	S
S
S
SS.             SS jjrg)z#Jinja-based system-prompt renderer.    )annotationsN)Any)EnvironmentFileSystemLoaderselect_autoescape)get_available_skillsload_skills)get_strix_resource_pathpromptsdeepF)	scan_modeis_whiteboxis_rootc                   [        U =(       d    / 5      nUR                  SU 35        UR                  S5        UR                  S5        U(       a  UR                  S5        U(       a"  UR                  S5        UR                  S5        / n[        5       nU H5  nU(       d  M  Xv;  d  M  UR                  U5        UR                  U5        M7     U$ )u%  Build the deduped, ordered skills list for the prompt render.

Order:

1. Whatever the caller asked for, in order.
2. ``scan_modes/<mode>`` (always).
3. ``tooling/agent_browser`` (always — every agent has shell + the
   agent-browser CLI).
4. ``tooling/python`` (always — Python runs through ``exec_command``;
   sandbox scripts can import ``caido_api`` for Caido automation).
5. ``coordination/root_agent`` for the root agent only — orchestration
   guidance for delegating to specialist subagents.
6. Whitebox-specific skills if applicable.
zscan_modes/ztooling/agent_browserztooling/pythonzcoordination/root_agentz"coordination/source_aware_whiteboxzcustom/source_aware_sast)listappendsetadd)	requestedr   r   r   ordereddedupedseenskills           e/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/strix/agents/prompt.py_resolve_skillsr      s    * io2.GNN[,-NN*+NN#$01;<12GUD5U&NN5!HHUO  N    )skillsr   r   r   interactivesystem_prompt_contextc           
       ^  [        S[        5      n[        S5      n[        [        Xg/5      [	        SSS9S9n[        U UUUS9n	[        U	5      mU4S jUR                  S	'   UR                  S
5      R                  " S[        TR                  5       5      [        5       UU=(       d    0 S.TD6n
[        R                  SUUU[        T5      [        U
5      5        [!        U
5      $ ! ["         a    [        R%                  S5         gf = f)zCRender the system prompt. Returns empty string on template failure.agentsr    F)enabled_extensionsdefault_for_string)loader
autoescape)r   r   r   r   c                (   > TR                  U S5      $ )N )get)nameskill_contents    r   <lambda>&render_system_prompt.<locals>.<lambda>X   s    0A0A$0Kr   	get_skillzsystem_prompt.jinja)loaded_skill_namesavailable_skillsr   r   zNrender_system_prompt: scan_mode=%s root=%s whitebox=%s skills=%d prompt_len=%dz3render_system_prompt failed; returning empty promptr(   )r
   _PROMPT_DIRNAMEr   r   r   r   r	   globalsget_templaterenderr   keysr   loggerdebuglenstr	Exception	exception)r   r   r   r   r   r   
prompt_dir
skills_direnvskills_to_loadrenderedr+   s              @r   render_system_promptrA   <   s   ',XG
,X6
#Z$<=(#%#(
 )#	
 $N3#KK ##$9:AA 
#M$6$6$8913#"7"=2	

 
 	\M	
 8}  NOs   B/C) )D
D)
r   list[str] | Noner   r9   r   boolr   rC   returnz	list[str])r   rB   r   r9   r   rC   r   rC   r   rC   r   zdict[str, Any] | NonerD   r9   )__doc__
__future__r   loggingtypingr   jinja2r   r   r   strix.skillsr   r	   strix.utils.resource_pathsr
   	getLogger__name__r6   r1   r   rA   r"   r   r   <module>rN      s    ) "   C C : > 
		8	$  %% % 	%
 % %T  $3711 1 	1
 1 1 11 	1r   