
    {j@                       S r SSKJr  SSKrSSKJr  SSKJr  Sr	Sr
Sr1 S	krS
S1r1 SkrSrS%S jrS&S jrS'S jrS(S)S jjrSr S(     S*S jjrS(S)S jjrS(S)S jjrS+S jrS+S jrS+S jrS+S jrS,S jrS%S jrS-S jr        S.S jr      S/S jr           S0S jr!SSSS .         S1S! jjr" S(       S2S" jjr#S+S# jr$  S3       S4S$ jjr%g)5zSExtrae texto de los archivos de contexto del agente (carpeta Files, no plantillas).    )annotationsN)Path)agents_storage   i]  i >   .md.csv.htm.log.txt.xml.yml.html.json.yaml	.markdown.docx.pdf>   .xls.xlsm.xlsx)reporte_interactivozreporte interactivozreporte-interactivoc                |    [         R                  " SSU =(       d    SR                  5       5      R                  5       $ )Nz[^0-9kK] )resubstripupper)values    WC:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agents_file_context.py_normalize_rutr    &   s+    66+rEKR#6#6#89??AA    c                   U R                  5       (       d  gU R                  U5      R                  5       nUR                  S5      (       d  UR                  S5      (       a  g[	        S U R                  U5      R
                   5       5      (       a  gU R                  R                  5       nU[        ;   =(       d    U[        ;   =(       d	    U[        ;   $ )NFzdocumentos/z	_derived/c              3  B   #    U  H  oR                  S 5      v   M     g7f).N)
startswith).0parts     r   	<genexpr>#_is_context_file.<locals>.<genexpr>0   s     
O,ND??3,Ns   )is_filerelative_toas_posixr%   anypartssuffixlower_TEXT_EXTENSIONS_BINARY_EXTENSIONS_SPREADSHEET_EXTENSIONS)path
agent_rootrelexts       r   _is_context_filer8   *   s    <<>>


:
&
/
/
1C
~~m$${(C(C

OD,<,<Z,H,N,N
OOO
++


C""ac-?&?a3JaCaar!   c                  ^^ U R                   R                  5       mU R                  5       R                  5       m[        UU4S j[         5       5      (       a  ST4$ U R
                  R                  5       [        ;   a  ST4$ ST4$ )uC   Prioriza reportes interactivos y Excel antes del orden alfabético.c              3  D   >#    U  H  oT;   =(       d    UT;   v   M     g 7fN )r&   markernamer6   s     r   r(   )_context_file_sort_key.<locals>.<genexpr>:   s!     
U9TvT>*Vs]*9T    r         )r>   r0   r,   r-   _INTERACTIVE_REPORT_MARKERSr/   r3   )r4   r>   r6   s    @@r   _context_file_sort_keyrD   6   sj    99??D
--/


!C

U9T
UUU3x{{553xs8Or!   c                    [         R                  " X5      nUR                  5       (       d  / $ UR                  S5       Vs/ s H  n[	        X25      (       d  M  UPM     nn[        U[        S9$ s  snf )N*)key)storageagent_folderexistsrglobr8   sortedrD   )
agent_namecustomer_idrootpfiless        r   list_all_context_file_pathsrR   A   sZ    
8D;;==	

3E1+;A+DQEE%344 Fs   A/A/)ejemplo_zejemplo-formato_zformato-zformato glosariodecretoorientacionescartilla	normativabase_institucionalc                   ^^ [        X5       H\  nUR                  5       R                  5       mUR                  R                  5       m[	        UU4S j[
         5       5      (       a  M\    g   g)zWTrue si hay archivos en Files (no plantillas/ejemplos) de los que extraer antecedentes.c              3  D   >#    U  H  oT;   =(       d    UT;   v   M     g 7fr;   r<   )r&   mr>   r6   s     r   r(   7agent_files_have_evaluation_evidence.<locals>.<genexpr>_   s!     I.HCx$19$.Hr@   TF)rR   r,   r0   r>   r-   _NON_EVIDENCE_NAME_MARKERS)rM   rN   r4   r>   r6   s      @@r   $agent_files_have_evaluation_evidencer`   X   sV     ,JDmmo##%yy I.HIII E r!   c                &    [        X5      S [         $ r;   )rR   	MAX_FILES)rM   rN   s     r   list_context_file_pathsrc   e   s    &z?
KKr!   c                    [        X5       Vs/ s H)  nUR                  R                  5       [        ;   d  M'  UPM+     sn$ s  snf r;   )rR   r/   r0   r3   )rM   rN   rP   s      r   list_spreadsheet_pathsre   i   sB     -ZEEA88>>66 	
E  s
   &AAc                "    U R                  SSS9$ )Nzutf-8replace)encodingerrors)	read_text)r4   s    r   _read_text_filerk   q   s    >>79>==r!   c                (   SSK Jn  U" [        U 5      5      n/ nUR                   H@  nUR                  =(       d    SR                  5       nU(       d  M/  UR                  U5        MB     UR                   H  nUR                   Hq  nUR                   Vs/ s H%  oR                  =(       d    SR                  5       PM'     n	nSR                  S U	 5       5      n
U
(       d  M`  UR                  U
5        Ms     M     SR                  U5      $ s  snf )Nr   )Documentr   z | c              3  6   #    U  H  o(       d  M  Uv   M     g 7fr;   r<   )r&   cs     r   r(   _read_docx.<locals>.<genexpr>   s     4A!aa   
	
)docxrm   str
paragraphstextr   appendtablesrowscellsjoin)r4   rm   docr.   pararv   tablerowcellrz   lines              r   
_read_docxr   u   s    
3t9
CE		R&&(4LL  ::C=@YYGYTyyB--/YEG::444DtT"	   99U	 Hs   ,Dc                D   SS K nUR                  [        U 5      5      n / nU HD  nUR                  5       =(       d    SR	                  5       nU(       d  M3  UR                  U5        MF     SR                  U5      UR                  5         $ ! UR                  5         f = f)Nr   r   

)fitzopenrt   get_textr   rw   r{   close)r4   r   r|   r.   pagerv   s         r   	_read_pdfr      sv    
))CI
CDMMO)r002DtT"  {{5!				s   3B %B Bc           	        SSK nU R                  R                  5       nSnUS:X  a  SnOUS;   a  SnSS[        S.nU(       a  X4S'    UR                  " U 40 UD6n[        U[        5      (       d  S
U0n/ nSn	UR                  5        H  u  pUR                  S5      n[        U
5      nUR                  SU 35        [        U5      U	:  a)  UR                  U	5      nUR                  SU	 SU S35        UR                  UR                  SSSS95        M     SR                  U5      $ ! [
         aD  n UR	                  U SS[        S9n SnAN! [
         a  n[        U S	U 35      UeSnAff = fSnAff = f)zQConvierte hojas Excel (.xls / .xlsx) a texto tabular para el contexto del modelo.r   Nr   xlrd   r   r   openpyxl
sheet_nameheaderdtypeenginez; reintento: Hoja1iX  r   	## Hoja: z[Mostrando primeras z
 filas de ]F	rr   )indexseplineterminator)pandasr/   r0   rt   
read_excel	ExceptionRuntimeError
isinstancedictitemsfillnarw   lenheadto_csvr{   )r4   pdr7   r   read_kwargssheets	first_exc
second_excr.   max_rowsr   dflabels                r   _read_excelr      s   
++


CF
f}	"	"'+tcJK &HWt3{3 fd##6"EH ,,.
YYr]Jy()r7X"BLL/zE7!LMRYYUTYJK ) 99U)  W	W]]4DS]QF 	W)M*FGYV	WWs0   D* *
E85E
E0E++E00E33E8c                    U (       a  U(       d  g[        U 5      nU(       d  gX!:X  a  g[        U5      S:  a  UR                  US S 5      (       a  g[        U5      S:  a  UR                  US S 5      (       a  gg)NFT   )r    r   r%   )
cell_value
target_rut	cell_norms      r   _cell_matches_rutr      sp    Zz*I
:!	 4 4Z_ E E
9~z44Ys^DDr!   c                   ^ SS K mTR                  SU =(       d    S5      nSR                  U4S jU 5       5      R                  5       n[        R
                  " SSU5      R                  5       $ )Nr   NFKDr   c              3  X   >#    U  H  nTR                  U5      (       a  M  Uv   M!     g 7fr;   )	combining)r&   ro   unicodedatas     r   r(   #_fold_sheet_text.<locals>.<genexpr>   s      AS(=(=a(@!!Ss   *	*z
[^a-z0-9]+ )r   	normalizer{   r0   r   r   r   )r   rawr   s     @r   _fold_sheet_textr      sU    



4C
''ASA
A
G
G
IC66-c*0022r!   c                    [        U =(       d    S5      R                  5        Vs/ s H  n[        U5      S:  d  M  UPM     sn$ s  snf )Nr      )r   splitr   )student_namets     r   _name_tokensr      s:    '(:;AACSC!s1vQR{ACSSSs
   AAc                  ^^ T(       a  [        U4S jU  5       5      (       a  g[        U5      S:  aG  [        SR                  U 5      5      m[	        U4S jU 5       5      nU[        S[        U5      5      :  $ g)Nc              3  L   >#    U  H  o(       d  M  [        UT5      v   M     g 7fr;   )r   )r&   vr   s     r   r(   '_row_matches_student.<locals>.<genexpr>   s"     TJqRS:+Az::Js   
$$TrB   r   c              3  6   >#    U  H  oT;   d  M
  S v   M     g7frA   Nr<   )r&   r   blobs     r   r(   r      s     7k$Y11ks   		F)r-   r   r   r{   summin)
row_valuesr   name_tokenshitsr   s    `  @r   _row_matches_studentr      se     cTJTTT
;1 457k77s1c+.///r!   c                   SnSn[        U 5       Hv  u  pE[        U5      nU[        U5      :  a  X   R                  5       OSnU(       d  M<  U(       d  US;   d  SU;   a  UnU(       a  MZ  SU;   d  SU;   a  SU;   d  US:X  d  Mt  UnMx     / nU(       a  UR	                  SU 35        U(       a  UR	                  S	U 35        S
R                  U5      $ )uF   Especialidad / especialista desde columnas tipo Excel de observación.r   >   areaespecialidadespecialidad arear   especialistadocenterespondeznombre especialistau   área/especialidad: z
responde: z; )	enumerater   r   r   rw   r{   )	header_valsr   	specialty
respondentihhlvalr.   s	            r   _excel_row_area_labelr      s    
 IJ+&a '(3z?':jm!!#??>UWCWIzb RJ"$4**J ' E+I;78z*./99Ur!   c                   / n[        U5      S:  a  UR                  S   R                  S5      R                  5        Vs/ s H  n[	        U5      R                  5       PM     nnUR                  [        U5      S-
     R                  S5      R                  5        Vs/ s H  n[	        U5      R                  5       PM     nnU(       a.  [        S U 5       5      [        S[        U5      S-  5      ::  a  UnU(       a  [        XS5      OSnSU  SU 3n	U(       a	  U	S	U S
3-  n	U	/n
U(       a  [        U5      (       az  / n[        U5       HH  u  pU(       d  M  U[        U5      :  a  X\   (       a  X\   OSUS-    3nUR                  U SU 35        MJ     U
R                  SR                  U5      5        O'U
R                  SR                  S U 5       5      5        SR                  U
5      $ s  snf s  snf )Nr   r   rA   c              3  6   #    U  H  o(       d  M  S v   M     g7fr   r<   r&   r   s     r   r(   (_format_excel_hit_row.<locals>.<genexpr>  s     -4a14rq   r      r   u    — z ()col_z: rr   r   c              3  6   #    U  H  o(       d  M  Uv   M     g 7fr;   r<   r   s     r   r(   r   )  s     :*Qqq*rq   )intilocr   tolistrt   r   r   maxr   r   r-   r   rw   r{   )r   r   row_idxr   r   r   r   prevr   titlelinespairscol_idxr   	col_labels                  r   _format_excel_hit_rowr     s     K
7|a/1wwqz/@/@/D/K/K/MN/M!s1v||~/MN(*Gq0@(A(H(H(L(S(S(UV(U1A(UVC-4--QK8HA8M1NNK=H 9bD
|50E2dV1GEs;''%j1LG S--+2F $GaK=) 
 LLI;b./ 2 	TYYu%&TYY:*::;99U1 OVs    #G1#G6)student_rutr   rN   c               x   [        U=(       d    S5      n[        U5      S:  a  Sn[        U5      nU(       d  [        U5      S:  a  S/ 4$ [        R                  " X5      n[        X5      nU(       d  S/ 4$ SSKn/ n	/ n
U GH  nUR                  U5      R                  5       n UR                  R                  5       nUS:X  a  SO	US;   a  S	OSnSS[        S
.nU(       a  XS'   UR                  " U40 UD6n[        U[        5      (       d  SU0n/ nUR#                  5        H  u  nnUR%                  S5      nSnUR'                  5        H  u  nnUR)                  5        Vs/ s H  n[        U5      R+                  5       PM     nn[-        U5      (       d  MO  [/        U5      S:X  a  M`  [1        UXES9(       d  Mq  U(       a  SU=(       d    U 3OSU 3nUR!                  [3        [        U5      U[/        U5      UUS95        US-  nUS:  d  M    M     M     U(       d  GM  U
R!                  U5        U	R!                  SU S3SR5                  U5      -   5        GM     U	(       d  S/ 4$ SnUSR5                  U	5      -   U
4$ ! [         a$  nU	R!                  SU SU S35         SnAGM.  SnAff = fs  snf )u   
Busca al estudiante (RUT y/o nombre) en todos los Excel de Files.
Los cuestionarios de observación suelen traer nombre, no RUT.
r   r   rB   r   Nr   r   r   r   r   r   r   z### Excel: z
[Error al leer: z9. Verifique openpyxl (xlsx) y xlrd (xls) en el servidor.])r   r   zfila del estudiante zfila con RUT )r   r   r   r   r   rA      ### Archivo: r   u  DATOS EXTRAÍDOS DE EXCEL (cuestionario / pauta / respuestas del estudiante). Esto SÍ es evidencia de evaluación: úsalo en instrumentos, análisis, síntesis y sugerencias. No digas que faltan cuestionarios si estos datos están aquí. Si hay VARIAS FILAS del mismo estudiante (distinta Especialidad / área, p. ej. Fonoaudiología y Terapia Ocupacional), DEBES integrar TODAS en el informe: detalla hallazgos de cada área/especialista, coincidencias y diferencias; no uses solo una fila. PROHIBIDO copiar al Word las etiquetas LOGRADO, EN PROCESO o REQUIERE APOYO: redacta en prosa profesional y detallada las características de ESTE estudiante.


---

)r    r   r   rH   rI   re   r   r+   r,   r/   r0   rt   r   r   r   r   rw   r   r   iterrowsr   r   r-   r   r   r   r{   )rM   r   r   rN   targettokensrO   pathsr   sectionsmatched_filesr4   r6   r7   r   r   r   exc	file_hitsr   r   hits_in_sheetr   r   r   r   whor   s                               r   $extract_spreadsheet_hint_for_studentr  -  s    K-2.F
6{Q,'Fc&kAo2v
8D":;E2vH!Mt$--/	++##%C"f}VHZAZ:`dF/3tc RK(.H%]]47;7Ffd++!6*  "	$llnNJ2BM "69jjlClc!fllnl
C:w<1$+6  $ +<+F;*GH(6 
   )#&z? #G#-! " B&7 !. -@ 9  %OOmC55I8NNOk n 2v	^  M&&x00-??u  	OOcU"4SE :J J 	 Ds   %A-J%#J7

J4J//J4c                    [        XUS9$ )z#Compatibilidad: busca solo por RUT.)r   rN   )r  )rM   r   rN   s      r    extract_spreadsheet_hint_for_rutr    s     0 r!   c                    U R                   R                  5       nU[        ;   a  [        U 5      $ US:X  a  [	        U 5      $ US:X  a  [        U 5      $ U[        ;   a  [        U 5      $ g)Nr   r   r   )r/   r0   r1   rk   r   r   r3   r   )r4   r7   s     r   extract_file_textr
    sb    
++


C
t$$
g~$
f}
%%4  r!   c                  ^ [         R                  " X5      m[        X5      n[        X5      nU Vs/ s H(  oUR                  R                  5       [        ;   d  M&  UPM*     nnSnU(       a#  UR                  5       (       a  [        XU5      u  pxU(       d  U(       d  gU Vs/ s H!  oUR                  T5      R                  5       PM#     n	n/ n
SnSnU(       a  U
R                  U5        U[        U5      -  nU GH  nUR                  T5      R                  5       nUR                  R                  5       n [        U5      R                  5       nU(       d  U[        [         -  [        -  ;   a  SnOM{  [        U5      ["        :  a  US["         S-   nS	U S
U 3nU[        U5      -   [$        :  a(  [$        U-
  nUS:  a  U
R                  USU S-   5          O)U
R                  U5        U[        U5      -  nUS-  nGM     U
(       d  gSnU(       aL  SR'                  U4S jUSS  5       5      n[        U5      S-
  nUS:  a	  USU S3-  nS[        U5       SU 3nS[        U	5       S[(         S3SR'                  U	5      -   U-   S-   nUSR'                  U
5      -   U4$ s  snf s  snf ! [         a  nSU S3n SnAGNsSnAff = f)z
Devuelve (bloque de texto para el prompt, cantidad de archivos incluidos).
Solo archivos subidos en Files; excluye plantillas en documentos/.
r   )r   r   r   z[No se pudo leer el archivo: r   Nu'   [Archivo sin texto extraíble o vacío]u   
… [contenido truncado]r   r      u   
… [contexto total truncado]rA   z, c              3  `   >#    U  H#  oR                  T5      R                  5       v   M%     g 7fr;   )r+   r,   )r&   rP   rO   s     r   r(   ,build_agent_files_context.<locals>.<genexpr>  s(       
4JqMM$((**4Js   +.
   u    … (+u    más)z
Excel en Files (z): u   ARCHIVOS DE CONTEXTO (subidos en Files del agente). Cuando las instrucciones pidan revisar, buscar o usar archivos adjuntos, utiliza ÚNICAMENTE el contenido de estos archivos como fuente.
Índice de archivos elegibles (z; hasta z priorizados en el cuerpo): rr   r   )rH   rI   rc   rR   r/   r0   r3   r   r  r+   r,   rw   r   r
  r   r1   r2   MAX_CHARS_PER_FILEMAX_TOTAL_CHARSr{   rb   )rM   r   rN   r   	all_pathsrP   spreadsheet_paths	rut_block_matchedindex_linesr   total_charsincludedr4   r6   r7   contentr  block	remaining
excel_noteexcel_namesextrar   rO   s                           @r   build_agent_files_contextr    s    
8D#J<E+JDI$-]Iq1AE\1\I]I{((**>zXcd	;DE9a==&//19KEHKH	"s9~%t$--/kk!	='-335G &);;>UUUCw<,,1125QQGuD	2U#o5'+5I3jy 14U UVs5z!A5 8 Jii  
4Ecr4J 
 
 %&+19WUG622K)#.?*@)A[MR
	* +.k*:); <7		9
 ))K
 	! 	 	  M&&x00(::K ^ F  	=5cU!<G	=s)   %J$J$"(J)8J..
K	8KK	)r   rt   returnrt   )r4   r   r5   r   r   bool)r4   r   r   ztuple[int, str]r;   )rM   rt   rN   
int | Noner   z
list[Path])rM   rt   rN   r"  r   r!  )r4   r   r   rt   )r   rt   r   rt   r   r!  )r   
str | Noner   	list[str])r   r$  r   rt   r   r$  r   r!  )r   r$  r   r$  r   rt   )
r   rt   r   r   r   r$  r   rt   r   rt   )
rM   rt   r   r#  r   r#  rN   r"  r   tuple[str, list[str]])rM   rt   r   rt   rN   r"  r   r%  )NN)rM   rt   r   r#  rN   r"  r   ztuple[str, int])&__doc__
__future__r   r   pathlibr   app.backend.utilsr   rH   rb   r  r  r1   r2   r3   rC   r    r8   rD   rR   r_   r`   rc   re   rk   r   r   r   r   r   r   r   r   r   r  r  r
  r  r<   r!   r   <module>r*     s   Y " 	  7 	   v& 4  B	b5   04

",
	
L>$%P 3T  	
 
 	<## 	#
 # # 	#R ##"a@a@ a@ 	a@
 a@ a@J BF"%4>
 #"Q;Q;Q; Q; 	Q;r!   