
    W6j                    H   S r SSKJr  SSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
  SSKJr  SSKJr  S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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!S,S jr"S-S jr#g).zNAlmacenamiento de informes del Workspace Agent: {FILES_DIR}/agents/{agent_id}/    )annotationsN)datetimetimezone)Path)Any)settingsi   c                    [         R                  " SSU =(       d    SR                  5       5      nU(       d  [        S5      eU$ )Nz[^a-zA-Z0-9._-]_ u6   Identificador de agente o nombre de archivo inválido.)resubstrip
ValueError)valuecleaneds     [C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\utils\agent_workspace_storage.py_safe_segmentr      s6    ff'u{.A.A.CDGQRRN    c                 P    [        [        R                  5      R                  5       $ N)r   r   	files_dirresolve r   r   r   r      s    ""#++--r   c                 @    [        5       S-  n U R                  SSS9  U $ )NagentsTparentsexist_ok)r   mkdir)roots    r   agents_rootr!      s#    ;!DJJtdJ+Kr   c                 4    [        [        R                  5      $ r   )r   r   workspace_agent_idr   r   r   default_agent_idr$   $   s    4455r   c                x    U =(       d    SR                  5       =(       d    [        R                  n[        U5      $ )Nr   )r   r   r#   r   )agent_idr   s     r   resolve_agent_idr'   (   s*    ^""$C(C(CEr   c                    [        5       [        U 5      -  R                  5       n[        U5      R	                  [        [        5       5      5      (       d  [        S5      eUR                  SSS9  U$ )NzRuta de agente no permitida.Tr   )r!   r'   r   str
startswithr   r   r&   folders     r   agent_folderr-   -   sZ    m.x88AACFv;!!#km"455788
LLL-Mr   c                    [        U 5      nU[        U5      -  R                  5       n[        U5      R	                  [        U5      5      (       d  [        S5      eU$ )NzRuta de archivo no permitida.)r-   r   r   r)   r*   r   )r&   filenamer,   paths       r   target_filer1   5   sN    (#F]8,,557Dt9F,,899Kr   c           
        SUU[        U 5      [        U R                  [        5       5      5      R                  SS5      U R	                  5       R
                  [        R                  " [        R                  5      R                  5       S.$ )NT\/)okr&   r/   r0   relative_path
size_bytessaved_at)r)   relative_tor   replacestatst_sizer   nowr   utc	isoformat)r0   r&   r/   s      r   file_resultr@   =   sf    D	T--ik:;CCD#Niik))LL.88: r   c                0   [        U 5      nUR                  5       (       d  / $ [        UR                  5       5       Vs/ s HK  nUR	                  5       (       d  M  UR
                  [        U5      UR                  5       R                  S.PMM     sn$ s  snf )N)namer0   r7   )	r-   existssortediterdiris_filerB   r)   r;   r<   )r&   r,   items      r   list_agent_filesrH   I   s~    (#F==??	 6>>+, -D<<>	
III))+--	

 -  s   B5Bc                    [        U 5      S-  R                  5       n[        U5      R                  [        [	        5       5      5      (       d  [        S5      eUR                  SSS9  U$ )Nz.uploadszRuta de uploads no permitida.Tr   )r-   r   r)   r*   r!   r   r   r+   s     r   uploads_rootrJ   X   sW    8$z1::<Fv;!!#km"455899
LLL-Mr   c                    [        U5      n[        U 5      U-  R                  5       n[        U 5      n[        U5      R	                  [        U5      5      (       d  [        S5      eU$ )Nzupload_id no permitido.)r   rJ   r   r)   r*   r   )r&   	upload_idsafe_idsessionr    s        r   _upload_session_dirrO   `   sX    I&GH%/88:G!Dw<""3t9--233Nr   c                    U S-  nUR                  5       (       d  [        S5      e[        R                  " UR	                  SS95      $ )N	meta.json    Sesión de subida no encontrada.utf-8encoding)rC   r   jsonloads	read_text)session_dir	meta_paths     r   _load_upload_metar[   i   sD    k)I;<<::i))7);<<r   c                P    U S-  R                  [        R                  " USS9SS9  g )NrQ   F)ensure_asciirS   rT   )
write_textrV   dumps)rY   metas     r   _save_upload_metara   p   s+    ;**

4e, + r   c                   US:  a  [        S5      e[        U 5      n[        UR                  5       5      n[        R
                  " 5       R                  n[        X55      nUR                  SSS9  UUUU/ [        R                  " [        R                  5      R                  5       S.n[        Xg5        SUUUU[        S.$ )N   ztotal_chunks debe ser >= 1.Tr   )rL   r&   r/   total_chunksreceived
created_at)r5   rL   r&   r/   rd   recommended_chunk_bytes)r   r'   r   r   uuiduuid4hexrO   r   r   r=   r   r>   r?   ra   RECOMMENDED_CHUNK_BYTES)r&   r/   rd   aidfnamerL   rY   r`   s           r   begin_chunked_uploadrn   w   s    a677
8
$C(..*+E

  I%c5KdT2$ll8<<0::<D k($#: r   c           
        [        U 5      n[        XA5      nUR                  5       (       d  [        S5      e[	        U5      n[        US   5      nUS:  d  X':  a  [        SUS-
   S35      eUSUS 3-  nUR                  U5        [        UR                  S	/ 5      5      n	U	R                  U5        [        U	5      US	'   [        XV5        S
UUU[        US	   5      U[        US	   5      U:H  S.$ )NrR   rd   r   zchunk_index fuera de rango (0-rc   z).chunk_06dre   T)r5   rL   r&   chunk_indexreceived_countrd   complete)r'   rO   rC   r   r[   intwrite_bytessetgetaddrD   ra   len)
r&   rL   rr   datarl   rY   r`   total
chunk_pathre   s
             r   append_upload_chunkr~      s    8
$C%c5K;<<[)D^$%EQ+.9%!)BGHHC'899J4 488J+,HLLh'Dk("d:./Z()U2 r   c                   [        U 5      n[        X!5      nUR                  5       (       d  [        S5      e[	        U5      n[        US   5      n[        [        UR                  S/ 5      5      5      n[        U5      U:w  a7  [        [        [        U5      5      [        U5      -
  5      n[        SU 35      e/ n[        U5       HO  n	USU	S 3-  n
U
R                  5       (       d  [        SU	 S35      eUR                  U
R                  5       5        MQ     [        X$S	   5      nUR                  S
R                  U5      5        [         R"                  " USS9  [%        XUS	   5      $ )NrR   rd   re   zFaltan chunks: rp   rq   zChunk z no encontrado en disco.r/   r   Tignore_errors)r'   rO   rC   r   r[   ru   rD   rw   rx   rz   rangeappend
read_bytesr1   rv   joinshutilrmtreer@   )r&   rL   rl   rY   r`   r|   re   missingpartsindexr}   r0   s               r   finalize_chunked_uploadr      sD   
8
$C%c5K;<<[)D^$%Ec$((:r234H
8}U5\*S]:;?7)455Eu VE#;#77
  ""veW,DEFFZ**,-	 
 s,-DSXXe_%
MM+T2t$z"233r   c                    [        U 5      n[        X!5      nUR                  5       (       a  [        R                  " USS9  SXSS.$ )NTr   )r5   rL   r&   	cancelled)r'   rO   rC   r   r   )r&   rL   rl   rY   s       r   cancel_chunked_uploadr      s@    
8
$C%c5Kk6YdSSr   c                    [        U 5      n[        UR                  5       5      n[        X45      nUR	                  U5        [        XSU5      $ r   )r'   r   r   r1   rv   r@   )r&   r/   r{   rl   rm   r0   s         r   save_uploaded_bytesr      sB    
8
$C(..*+Es"DTt%((r   c                    [        U 5      n[        U5      n[        X45      nUR                  [        R
                  " USSS9SS9  [        XSU5      $ )NF   )r]   indentrS   rT   )r'   _ensure_json_filenamer1   r^   rV   r_   r@   )r&   r/   payloadrl   rm   r0   s         r   save_json_payloadr      sS    
8
$C!(+Es"DOO

7q9   t%((r   c                    U R                  5       nUR                  5       R                  S5      (       d  [        U5       S3$ US S R                  5       =(       d    Sn[        U5       S3$ )Nz.jsonanalisis)r   lowerendswithr   )r/   rB   bases      r   r   r      sb    >>D::<  ))%&e,,9??*
DD!"%((r   )r   r)   returnr)   )r   r   )r   r)   )r&   z
str | Noner   r)   )r&   r)   r   r   )r&   r)   r/   r)   r   r   )r0   r   r&   r)   r/   r)   r   dict)r&   r)   r   z
list[dict])r&   r)   rL   r)   r   r   )rY   r   r   dict[str, Any])rY   r   r`   r   r   None)r&   r)   r/   r)   rd   ru   r   r   )
r&   r)   rL   r)   rr   ru   r{   bytesr   r   )r&   r)   rL   r)   r   r   )r&   r)   r/   r)   r{   r   r   r   )r&   r)   r/   r)   r   r   r   r   )r/   r)   r   r)   )$__doc__
__future__r   rV   r   r   rh   r   r   pathlibr   typingr   app.backend.core.configr   rk   r   r   r!   r$   r'   r-   r1   r@   rH   rJ   rO   r[   ra   rn   r~   r   r   r   r   r   r   r   r   <module>r      s    T "  	   '   , $ .6 
	=6  	
 >4.T)))r   