
    nSjR                    V   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Zd dlZd dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ dZ ej        d	e d
          ZdZdZ ed          dz  fZ ed          dz   ed          dz   ed          dz   ed          dz   ed           ed           ed           ed           ed           ed           ed           ed           ed          fZ e
d           G d d                       Ze
 G d! d"                      Zd]d'Zddd(d^d1Z ddd(d^d2Z!ddd(d_d7Z"dd8d`d9Z#dd8d`d:Z$dad>Z%dd?dbdAZ&dcdBZ'dd8dddDZ(dedGZ)dfdIZ*dfdJZ+dgdLZ,dhdNZ-didPZ.djdkdSZ/dldUZ0dmdWZ1dndYZ2dodZZ3dpd[Z4dpd\Z5dS )q    )annotationsN)	dataclassfield)Path)	AwaitableCallable)estimate_tokens_rough)
IS_WINDOWSwindows_hide_flagsz$(?:`[^`\n]+`|"[^"\n]+"|\'[^\'\n]+\')zP(?<![\w/])@(?:(?P<simple>diff|staged)\b|(?P<kind>file|folder|git|url):(?P<value>z(?::\d+(?:-\d+)?)?|\S+))z,.;!?).sshz.awsz.gnupgz.kubez.dockerz.azurez
.config/ghskillsz.hubr   authorized_keysid_rsa
id_ed25519configz.bashrcz.zshrcz.profilez.bash_profilez	.zprofilez.netrcz.pgpassz.npmrcz.pypircT)frozenc                  ^    e Zd ZU ded<   ded<   ded<   ded<   ded<   dZd	ed
<   dZd	ed<   dS )ContextReferencestrrawkindtargetintstartendNz
int | None
line_startline_end)__name__
__module____qualname____annotations__r   r        :/home/ice/.hermes/hermes-agent/agent/context_references.pyr   r   )   sa         HHHIIIKKKJJJHHH!J!!!!Hr#   r   c                      e Zd ZU ded<   ded<    ee          Zded<    ee          Zded<   d	Zd
ed<   dZ	ded<   dZ
ded<   dS )ContextReferenceResultr   messageoriginal_message)default_factorylist[ContextReference]
references	list[str]warningsr   r   injected_tokensFboolexpandedblockedN)r   r   r    r!   r   listr+   r-   r.   r0   r1   r"   r#   r$   r&   r&   4   s         LLL).t)D)D)DJDDDD%555H5555OHGr#   r&   r'   r   returnr*   c                   g }| s|S t                               |           D ]>}|                    d          }|r_|                    t	          |                    d          |d|                                |                                                     y|                    d          }t          |                    d          pd          }d }d }t          |          }|dk    rt          |          \  }}}|                    t	          |                    d          |||                                |                                ||                     @|S )	Nsimpler    )r   r   r   r   r   r   valuefile)r   r   r   r   r   r   r   )
REFERENCE_PATTERNfinditergroupappendr   r   r   _strip_trailing_punctuation_strip_reference_wrappers_parse_file_reference_value)	r'   refsmatchr5   r   r7   r   r   r   s	            r$   parse_context_referencesrB   ?   sf   #%D "++G44 !
 !
X&& 
	KK A++--		     {{6""+EKK,@,@,FBGG
*5116>>+Fu+M+M(FJKKNNkkmmIIKK%!  
	
 
	
 
	
 
	
 Kr#   url_fetcherallowed_rootcwd
str | Pathcontext_lengthr   rD   ,Callable[[str], str | Awaitable[str]] | NonerE   str | Path | Nonec                  t          | ||||          }	 t          j                    }n# t          $ r d }Y nw xY w|r}|                                ridd l}|j                            d          5 }|                    t          j	        |          
                                cd d d            S # 1 swxY w Y   t          j	        |          S )N)rF   rH   rD   rE   r      )max_workers)#preprocess_context_references_asyncasyncioget_running_loopRuntimeError
is_runningconcurrent.futuresfuturesThreadPoolExecutorsubmitrunresult)	r'   rF   rH   rD   rE   coroloop
concurrentpools	            r$   preprocess_context_referencesr]   j   s%    /%!  D'))    ;!! ;!!!!22q2AA 	;T;;w{D1188::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;;ts   * 9912B00B47B4c          
     R  K   t          |           }|st          | |           S t          |                                                                          |3t          |                                                                          ng }g }d}t          j        fd|D               d {V }	|	D ]E\  }
}|
r|                    |
           |r'|                    |           |t          |          z  }Ft          dt          |dz                      }t          dt          |dz                      }||k    r2|                    d| d| d	           t          | | |||d
d          S ||k    r|                    d| d| d	           t          | |          }|}|r%| dd                    d |D                       z   }|r| dd                    |          z   }t          |                                | |||t          |p|          d
          S )N)r'   r(   r   c              3  >   K   | ]}t          |           V  dS )rC   N)_expand_reference).0refallowed_root_pathcwd_pathrD   s     r$   	<genexpr>z6preprocess_context_references_async.<locals>.<genexpr>   sT       

 

  '.	  

 

 

 

 

 

r#   rL   g      ?g      ?z@ context injection refused: z$ tokens exceeds the 50% hard limit (z).FT)r'   r(   r+   r-   r.   r0   r1   z@ context injection warning: z$ tokens exceeds the 25% soft limit (z

--- Context Warnings ---

c              3      K   | ]	}d | V  
dS )- Nr"   )ra   warnings     r$   re   z6preprocess_context_references_async.<locals>.<genexpr>   s)      DlDlX_^'^^DlDlDlDlDlDlr#   z

--- Attached Context ---

z

)rB   r&   r   
expanduserresolverO   gatherr<   r	   maxr   _remove_reference_tokensjoinstripr/   )r'   rF   rH   rD   rE   r@   r-   blocksr.   r0   ri   block
hard_limit
soft_limitstrippedfinalrc   rd   s      `            @@r$   rN   rN      s      $G,,D Q%gPPPPCyy##%%--//H 6B5M\%%''//111S[  HFO ^

 

 

 

 

 

 

 

 


 
 
 
 
 
 
H # < < 	%OOG$$$ 	<MM%   4U;;;OQNT12233JQNT12233J##oOooakooo	
 	
 	
 &$+
 
 
 	
 ##oOooakooo	
 	
 	
 (66HE m888499DlDlckDlDlDl;l;ll Q:::V[[=P=PP! 'f())   r#   rb   r   Path | Nonetuple[str | None, str | None]c                 K   	 | j         dk    rt          | ||          S | j         dk    rt          | ||          S | j         dk    rt          | |dgd          S | j         dk    rt          | |ddgd          S | j         d	k    rNt	          d
t          t          | j        pd          d                    }t          | |dd| dgd| d          S | j         dk    rIt          | j        |           d {V }|s| j	         dd fS d d| j	         dt          |           d| fS n%# t          $ r}| j	         d| d fcY d }~S d }~ww xY w| j	         dd fS )Nr8   rE   folderdiffzgit diffstagedz--stagedzgit diff --stagedgitrL   1
   log-z-pz	git log -z -purlrD   z: no content extractedu   🌐  (	 tokens)
: z: unsupported reference type)r   _expand_file_reference_expand_folder_reference_expand_git_referencerm   minr   r   _fetch_url_contentr   r	   	Exception)rb   rF   rD   rE   countcontentexcs          r$   r`   r`      s     )8v)#sNNNN8x+C<PPPP8v(cF8ZHHH8x(cFJ3GI\]]]8u3s3:#455r::;;E(cE;u;;3MOe[`OeOeOefff8u.sz{SSSSSSSSSG @'9994??___,A',J,J__V]____	 
  ) ) )'""S""D((((((() g333T99s@   D) D) D) D) ;AD) 4D) 	D) )
E3E EErz   c          
        t          || j        |          }t          |           |                                s| j         dd fS |                                s| j         dd fS t          |          rd t          | |          fS |                    d          }| j	        r|
                                }t          | j	        dz
  d          }t          | j        p| j	        t          |                    }d                    |||                   }t!          |          }| j        }	d d	|	 d
t#          |           d| d| d	fS )Nrz   z: file not foundz: path is not a fileutf-8encodingrL   r   rf   u   📄 r   z tokens)
```
```)_resolve_pathr   _ensure_reference_path_allowedexistsr   is_file_is_binary_file_binary_reference_block	read_textr   
splitlinesrm   r   r   lenro   _code_fence_languager	   )
rb   rF   rE   pathtextlines	start_idxend_idxlanglabels
             r$   r   r      sb    cj|DDDD"4(((;;== 2'+++T11<<>> 6'///55t 8 ,S$7777>>7>++D
~!!!*A..	cl4cnc%jjAAyyy0122%%DGE___"7"="=__D__TX_____r#   c               ,   t          || j        |          }t          |           |                                s| j         dd fS |                                s| j         dd fS t          ||          }d d| j         dt          |           d| fS )Nrz   z: folder not foundz: path is not a folderu   📁 r   r   )r   r   r   r   r   is_dir_build_folder_listingr	   )rb   rF   rE   r   listings        r$   r   r     s     cj|DDDD"4(((;;== 4'---t33;;== 8'111477#D#..GWWW$9'$B$BWWgWWWWr#   argsr,   r   c           	        t           rdt                      ini }	 t          j        dg|f|dddt          j        d|}n!# t          j        $ r | j         dd fcY S w xY w|j        dk    r+|j        pd	                                pd	}| j         d
| d fS |j
        	                                }|sd}d d| dt          |           d| dfS )Ncreationflagsr~   T   rF   capture_outputr   timeoutstdinz: git command timed out (30s)r   r6   zgit command failedr   z(no output)u   🧾 r   z tokens)
```diff
r   )r
   r   
subprocessrW   DEVNULLTimeoutExpiredr   
returncodestderrrp   stdoutr	   )rb   rF   r   r   _popen_kwargsrX   r   r   s           r$   r   r   +  s<    @JQ_&8&:&:;;rM?NTN
$
 
 
 
 $ ? ? ?'888$>>>>?A-%2,,..F2F'%%V%%t++m!!##G  ccc"7"@"@ccU\cccccs   %A AAr   r   c                  K   |pt           } ||           }t          j        |          r| d {V }t          |pd                                          S )Nr6   )_default_url_fetcherinspectisawaitabler   rp   )r   rD   fetcherr   s       r$   r   r   G  sb      
 11GgcllG7##  ------w}"##%%%r#   c                <  K   ddl m}  || gd           d {V }t          j        |          }|                    dg           }|sdS |d         }t          |                    d          p|                    d          pd                                          S )	Nr   )web_extract_toolmarkdown)formatresultsr6   r   raw_content)tools.web_toolsr   jsonloadsgetr   rp   )r   r   r   payloaddocsdocs         r$   r   r   S  s      000000  #z:::
:
:
:
:
:
:CjooG;;y"%%D r
q'Cswwy!!ASWW]%;%;ArBBHHJJJr#   r   c               .   t          t          j                            |                    }|                                s| |z  }|                                }|9	 |                    |           n"# t          $ r}t          d          |d }~ww xY w|S )Nz%path is outside the allowed workspace)r   osr   rj   is_absoluterk   relative_to
ValueError)rF   r   rE   r   resolvedr   s         r$   r   r   _  s    ""6**++D Tz||~~H	O  .... 	O 	O 	ODEE3N	OOs   A3 3
B=BBr   Nonec                   ddl m} t          t          j                            d                                                     |                                            fdt          D             }|                    dz             fdt          D             }|
                    fdt          D                        | |v rt          d          |D ]7}	 |                     |           n# t          $ r Y %w xY wt          d	          	 dd
lm}  |t!          |                     t          d	          d S # t          $ r  t"          $ r t          d          w xY w)Nr   )get_hermes_home~c                    h | ]}|z  S r"   r"   ra   relhomes     r$   	<setcomp>z1_ensure_reference_path_allowed.<locals>.<setcomp>q  s    AAACTCZAAAr#   z.envc                    g | ]}|z  S r"   r"   r   s     r$   
<listcomp>z2_ensure_reference_path_allowed.<locals>.<listcomp>s  s    ???3D3J???r#   c              3  "   K   | ]	}|z  V  
d S Nr"   )ra   r   hermes_homes     r$   re   z1_ensure_reference_path_allowed.<locals>.<genexpr>t  s(      LLcc)LLLLLLr#   z:path is a sensitive credential file and cannot be attachedzMpath is a sensitive credential or internal Hermes path and cannot be attached)get_read_block_errorzRpath could not be verified against the credential deny-list and cannot be attached)hermes_constantsr   r   r   r   rj   rk   _SENSITIVE_HOME_FILESadd_SENSITIVE_HOME_DIRSextend_SENSITIVE_HERMES_DIRSr   r   agent.file_safetyr   r   r   )r   r   blocked_exactblocked_dirsblocked_dirr   r   r   s         @@r$   r   r   l  s   000000""3''((0022D!/##++--KAAAA+@AAAMkF*+++????*>???LLLLL5KLLLLLL}UVVV# j j	[)))) 	 	 	H	hiii
::::::D		**6_   76     

 

 

 `
 
 	


s   C55
DD-E $E(r7   c                    |                      t                    }|                    d          rL|d         }dddd|         }|                    |          |                    |          k    r|d d         }`	 |S )N))]}([{)rstripTRAILING_PUNCTUATIONendswithr   )r7   ru   closeropeners       r$   r=   r=     s    ||011H


O
,
, "3//7>>&!!HNN6$:$:::}HOr#   c                x    t          |           dk    r&| d         | d         k    r| d         dv r
| dd         S | S )N   r   r   z`"'rL   )r   )r7   s    r$   r>   r>     sD    
5zzQ58uRy00U1X5G5GQrT{Lr#   "tuple[str, int | None, int | None]c                ,   t          j        d|           }|rf|                    d          }|                    d          }|                    d          |t          |          nd |t          |p|          nd fS t          j        d|           }|rot          |                    d                    }|                    d          |t          |                    d          p|                    d                    fS t	          |           d d fS )NzP^(?P<quote>`|"|\')(?P<path>.+?)(?P=quote)(?::(?P<start>\d+)(?:-(?P<end>\d+))?)?$r   r   r   z0^(?P<path>.+?):(?P<start>\d+)(?:-(?P<end>\d+))?$)rerA   r;   r   r>   )r7   quoted_matchr   r   range_matchs        r$   r?   r?     s)   8[ L  
!''00
%%e,,v&&)5C
OOO4+5+AC&J'''t
 	
 (NPUVVK 
**73344
f%%!!%((FK,=,=g,F,FGG
 	
 %U++T477r#   r@   c                J   g }d}|D ]+}|                     | ||j                            |j        },|                     | |d                     d                    |          }t	          j        dd|          }t	          j        dd|          }|                                S )Nr   r6   z\s{2,} z\s+([,.;:!?])z\1)r<   r   r   ro   r   subrp   )r'   r@   piecescursorrb   r   s         r$   rn   rn     s    FF  gfSY./000
MM'&''"###776??D6)S$''D6"E400D::<<r#   r/   c                     t          j         j                  \  }}|r2|                    d          st	           fddD                       sdS                                  d d         }d|v S )Nztext/c              3  L   K   | ]}j                             |          V  d S r   )namer   )ra   extr   s     r$   re   z"_is_binary_file.<locals>.<genexpr>  sD       9 9$'	39 9 9 9 9 9r#   )	.py.mdz.txt.json.yaml.yml.toml.js.tsTi       )	mimetypes
guess_typer  
startswithany
read_bytes)r   mime_chunks   `   r$   r   r     s    "49--GD! DOOG,, S 9 9 9 9+r9 9 9 6 6  tOOete$Eer#      limitc           
     t   |                      |           dg}t          | ||          }|D ]}|                     |          }dt          t          |j                  t          |                      |          j                  z
  dz
  d          z  }|                                r!|                    | d|j         d           t          |          }|                    | d|j         d| d           t          |          |k    r|                    d	           d
	                    |          S )N/r  z  rL   r   rh   r   r   z- ...rf   )
r   _iter_visible_entriesrm   r   partsr   r<   r  _file_metadataro   )	r   rF   r  r   entriesentryr   indentmetas	            r$   r   r     sB     %%((()E#D#U;;;G = =$$C	NNS1A1A#1F1F1L-M-MMPQQSTUUU<<>> 	=LLF33ej3334444!%((DLLF;;ej;;D;;;<<<<
7||uW99Ur#   
list[Path]c                   t          | ||          }|g }t                      }|D ]g}||z  }|j        D ]C}||k    s||v s| |h|j        vr|                    |           |                    |           D|                    |           ht          d |D             d           S g }t          j        |           D ]\  }	}
}t          d |
D                       |
d d <   t          d |D                       }t          |	          }|
D ]3}|                    ||z             t          |          |k    r|c c S 4|D ]3}|                    ||z             t          |          |k    r|c c S 4|S )Nr  c                :    h | ]}|                                 |S r"   )r   )ra   ps     r$   r   z(_iter_visible_entries.<locals>.<setcomp>   s%    777QAHHJJ7q777r#   c                J    |                                   t          |           fS r   )r   r   )r(  s    r$   <lambda>z'_iter_visible_entries.<locals>.<lambda>   s    AHHJJX[\]X^X^G_ r#   )keyc              3  P   K   | ]!}|                     d           |dk    |V  "dS ).__pycache__Nr  )ra   ds     r$   re   z(_iter_visible_entries.<locals>.<genexpr>  s=      YYqS0A0AYa=FXFXFXFXFXFXYYr#   c              3  D   K   | ]}|                     d           |V  dS )r-  Nr/  )ra   fs     r$   re   z(_iter_visible_entries.<locals>.<genexpr>  s3      AAQq||C/@/@AqAAAAAAr#   )
	_rg_filessetparentsr   r<   sortedr   walkr   r   )r   rF   r  
rg_entriesoutput	seen_dirsr   fullparentrootdirsfiles	root_pathr0  r2  s                  r$   r  r    s   4E222J"uu	 	  	 C9D, & &S==Fi$7$74G`QWQ_G`;`;`f%%%f%%%%MM$77&777=_=_````FWT]]  dEYYDYYYYYQQQAA%AAAAAJJ	 	 	AMM)a-(((6{{e## $ 	 	AMM)a-(((6{{e## $	 Mr#   list[Path] | Nonec           	     |   t           rdt                      ini }	 t          j        ddt	          |                     |                    gf|dddt          j        d|}n## t          t          t          j	        f$ r Y d S w xY w|j
        dk    rd S d |j                                        D             }|d |         S )	Nr   rgz--filesTr   r   r   c                x    g | ]7}|                                 t          |                                           8S r"   )rp   r   )ra   lines     r$   r   z_rg_files.<locals>.<listcomp>"  s5    WWWD$**,,WT$**,,WWWr#   )r
   r   r   rW   r   r   r   FileNotFoundErrorOSErrorr   r   r   r   )r   rF   r  r   rX   r?  s         r$   r3  r3    s    ?IQ_&8&:&:;;rM9c$"2"23"7"7889
$
 
 
 
 w
(AB   ttAtWWFM,D,D,F,FWWWE%=s   AA! !B Bnc                    t          |           }dD ]7}|dk     s|dk    r$|dk    rt          |           d| n|dd| c S |dz  }8|ddS )N)BKBMBGBi   rM  rJ  r   z.1fz GB)floatr   )rH  sizeunits      r$   _human_bytesrQ  &  s    88D'  $;;$$,,,0CKKc$ii(($(((=Q=Q=Q4=Q=QQQQr#   c           	         t          j        |j                  \  }}|pd}	 t          |                                j                  }n# t          $ r d}Y nw xY wd| j         d| d| d| d	S )Nzapplication/octet-streamzunknown sizeu   📎 r   z, uD   ) — binary file, not inlined as text. It is available on disk at `z`. Use your tools to work with it (read or convert it, extract its text, or view/render it as needed); do not tell the user the file type is unsupported.)r  r  r  rQ  statst_sizerG  r   )rb   r   r  r  rO  s        r$   r   r   /  s    "49--GD!--DDIIKK/00   	> 	> 	>4 	> 	>4 	> 	>'+	> 	> 	>s   &A	 	AAc                   t          |           r|                                 j         dS 	 |                     d                              d          dz   }n,# t
          $ r |                                 j         dcY S w xY w| dS )Nz bytesr   r   rf   rL   z lines)r   rS  rT  r   r   r   )r   
line_counts     r$   r   r   >  s    t .))++%----.^^W^55;;DAAAE

 . . .))++%------.    s   ,A &BBc                x    ddddddddd	d	d
d}|                     | j                                        d          S )Npython
javascript
typescripttsxjsxr   r   bashyamltoml)r  r  r  z.tsxz.jsxr
  r	  z.shr  r  r  r6   )r   suffixlower)r   mappings     r$   r   r   H  sS     G ;;t{((**B///r#   )r'   r   r3   r*   )r'   r   rF   rG   rH   r   rD   rI   rE   rJ   r3   r&   )
rb   r   rF   r   rD   rI   rE   rw   r3   rx   )rb   r   rF   r   rE   rw   r3   rx   )
rb   r   rF   r   r   r,   r   r   r3   rx   )r   r   rD   rI   r3   r   )r   r   r3   r   )rF   r   r   r   rE   rw   r3   r   )r   r   r3   r   )r7   r   r3   r   )r7   r   r3   r   )r'   r   r@   r*   r3   r   )r   r   r3   r/   )r  )r   r   rF   r   r  r   r3   r   )r   r   rF   r   r  r   r3   r%  )r   r   rF   r   r  r   r3   rA  )rH  r   r3   r   )rb   r   r   r   r3   r   )r   r   r3   r   )6
__future__r   rO   r   r   r  r   r   r   dataclassesr   r   pathlibr   typingr   r   agent.model_metadatar	   hermes_cli._subprocess_compatr
   r   _QUOTED_REFERENCE_VALUEcompiler9   r   r   r   r   r   r&   rB   r]   rN   r`   r   r   r   r   r   r   r   r=   r>   r?   rn   r   r   r  r3  rQ  r   r   r   r"   r#   r$   <module>rk     s   " " " " " "        				 				     ( ( ( ( ( ( ( (       & & & & & & & & 6 6 6 6 6 6 H H H H H H H HA BJ JXo  J  J  J    ] $x..613 DLL$$DLL8DLL<DLL8DOODNNDDDDNNDOODNNDOO " $                       ( ( ( (` AE&*     @ AE&*R R R R R Rr AE $: : : : : :D !%	` ` ` ` ` `L !%	X X X X X X"d d d d> AE	& 	& 	& 	& 	& 	&	K 	K 	K 	K JN 
 
 
 
 
 
1
 1
 1
 1
h	 	 	 	   8 8 8 84
 
 
 
           >   (      ! ! ! !0 0 0 0 0 0r#   