Ë
    tPêji/  ã                   óL   — d Z ddlZddlmZmZ ddlmZ ddlmZ  G d„ d«      Z	y)z‘
GitLab API client for fetching files from GitLab repositories.
Now supports selecting a tag via `config["tag"]`; falls back to branch ("main").
é    N)ÚAnyÚFinal)Úquote)ÚHTTPHandlerc                   ó–  — e Zd ZdZdeeef   fd„Zddœdededz  defd	„Zddœdededz  defd
„Z		 	 dddœdede
dedz  defd„Zdeddfd„Zddœdededz  dedz  fd„Zddœdededz  dedz  fd„Z	 	 	 dddœdedede
dedz  dee   f
d„Zdeeef   fd„Zde
fd„Zdeeeef      fd„Zddœdededz  deeef   dz  fd„Zd„ Zy)ÚGitLabClienta¡  
    Client for interacting with the GitLab API to fetch files.

    Supports:
    - Authentication with personal/access tokens or OAuth bearer tokens
    - Fetching file contents from repositories (raw endpoint with JSON fallback)
    - Namespace/project path or numeric project ID addressing
    - Ref selection via tag (preferred) or branch (default "main")
    - Directory listing via the repository tree API
    Úconfigc                 ó  — |j                  d«      }|j                  d«      }|�|€t        d«      ‚|| _        t        |«      | _        |j                  dd«      | _        |j                  dd«      | _        | j                  sd| _        |j                  d	«      | _        |j                  d
d«      | _        t        | j                  | j                  g«      st        d«      ‚t        | j                  xs | j                  «      | _
        dddœ| _        | j
                  dk(  rd| j                  › �| j                  d<   n| j                  | j                  d<   t        t        | j                  «      d¬«      | _        t        «       | _        y)a‹  
        Initialize the GitLab client.

        Args:
            config: Dictionary containing:
                - project: Project path ("group/subgroup/repo") or numeric project ID (str|int) [required]
                - access_token: GitLab personal/access token or OAuth token [required] (str)
                - auth_method: 'token' (default; sends Private-Token) or 'oauth' (Authorization: Bearer)
                - tag: Tag name to fetch from (takes precedence over branch if provided)
                - branch: Branch to fetch from (default: "main")
                - base_url: Base GitLab API URL (default: "https://gitlab.com/api/v4")
        ÚprojectÚaccess_tokenNz%project and access_token are requiredÚauth_methodÚtokenÚbranchÚmainÚtagÚbase_urlzhttps://gitlab.com/api/v4úapplication/json)ÚAcceptzContent-TypeÚoauthzBearer ÚAuthorizationzPrivate-TokenÚ ©Úsafe)ÚgetÚ
ValueErrorr   Ústrr   r   r   r   r   ÚallÚrefÚheadersr   Ú_project_encr   Úhttp_handler)Úselfr	   r   r   s       ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/gitlab/gitlab_client.pyÚ__init__zGitLabClient.__init__   sW  € ð  Ÿ™ IÓ.ˆØ$Ÿj™j¨Ó8ˆØˆ?˜lÐ2ÜÐDÓEÐEà")ˆŒÜ!$ \Ó!2ˆÔØ!Ÿ:™: m°WÓ=ˆÔØ—j‘j ¨4Ó0ˆŒØ�{Š{Ø ˆDŒKØ—:‘:˜eÓ$ˆŒØŸ
™
 :Ð/JÓKˆŒä�D—L‘L $×"3Ñ"3Ð4Ô5ÜÐDÓEÐEô �t—x‘xÒ. 4§;¡;Ó/ˆŒð )Ø.ñ
ˆŒð ×Ñ˜wÒ&Ø.5°d×6GÑ6GÐ5HÐ,IˆD�L‰L˜Ò)ð -1×,=Ñ,=ˆD�L‰L˜Ñ)ô "¤# d§l¡lÓ"3¸"Ô=ˆÔô (›MˆÕó    N©r   Ú	file_pathr   Úreturnc                ó”   — t        |d¬«      }t        |xs | j                  d¬«      }| j                  › d| j                  › d|› d|› �S )Nr   r   ú
/projects/ú/repository/files/z	/raw?ref=©r   r   r   r    ©r"   r'   r   Úfile_encÚref_qs        r#   Ú_file_raw_urlzGitLabClient._file_raw_urlO   sO   € Ü 	°Ô3ˆÜ˜Sš_ D§H¡H°2Ô6ˆØ—-‘-� 
¨4×+<Ñ+<Ð*=Ð=OÐPXÈzÐYbÐchÐbiÐjÐjr%   c                ó”   — t        |d¬«      }t        |xs | j                  d¬«      }| j                  › d| j                  › d|› d|› �S )Nr   r   r*   r+   z?ref=r,   r-   s        r#   Ú_file_json_urlzGitLabClient._file_json_urlT   sO   € Ü 	°Ô3ˆÜ˜Sš_ D§H¡H°2Ô6ˆØ—-‘-� 
¨4×+<Ñ+<Ð*=Ð=OÐPXÈzÐY^Ð_dÐ^eÐfÐfr%   Údirectory_pathÚ	recursivec                ó°   — |rdt        |d¬«      › �nd}|rdnd}t        |xs | j                  d¬«      }| j                  › d| j                  › d|› |› |› �S )Nz&path=r   r   z&recursive=truer*   z/repository/tree?ref=r,   )r"   r3   r4   r   Úpath_qÚrec_qr/   s          r#   Ú	_tree_urlzGitLabClient._tree_urlY   sn   € ñ FT˜&¤ ~¸BÔ!?Ð @ÑAÐY[ˆÙ,5Ñ(¸2ˆÜ˜Sš_ D§H¡H°2Ô6ˆØ—-‘-� 
¨4×+<Ñ+<Ð*=Ð=RÐSXÐRYÐZ`ÐYaÐbgÐahÐiÐir%   c                 ó,   — |st        d«      ‚|| _        y)z;Override the default ref (tag/branch) for subsequent calls.zref must be a non-empty stringN)r   r   )r"   r   s     r#   Úset_refzGitLabClient.set_refi   s   € áÜÐ=Ó>Ð>Øˆ�r%   c                ó  — | j                  ||¬«      }	 | j                  j                  || j                  ¬«      }|j                  dk(  r| j                  ||¬«      S |j                  «        |j                  j                  d«      xs dj                  «       }|j                  d«      sd|v s|j                  d«      r|j                  S 	 |j                  j                  d	«      S # t        $ r  |j                  j                  d	d
¬«      cY S w xY w# t        $ ri}t        t        |dd«      dd«      }|dk(  rY d}~y|dk(  rt        d|› d| j                  › d�«      ‚|dk(  rt        d«      ‚t        d|› d|› �«      ‚d}~ww xY w)a”  
        Fetch the content of a file from the GitLab repository at the given ref
        (tag, branch, or commit SHA). If `ref` is None, uses self.ref.

        Strategy:
          1) Try the RAW endpoint (returns bytes of the file)
          2) Fallback to the JSON endpoint (returns base64-encoded content)

        Returns:
            File content as UTF-8 string, or None if file not found.
        r&   ©r   é”  úcontent-typer   ztext/zcharset=r   úutf-8Úreplace©ÚerrorsÚresponseNÚstatus_codeé“  úAccess denied to file 'ú.'. Check your GitLab permissions for project 'ú'.é‘  ú?Authentication failed. Check your GitLab token and auth_method.úFailed to fetch file 'ú': )r0   r!   r   r   rD   Ú_get_file_content_via_jsonÚraise_for_statusÚlowerÚ
startswithÚtextÚcontentÚdecodeÚ	ExceptionÚgetattrr   )r"   r'   r   Úraw_urlÚrespÚctypeÚeÚstatuss           r#   Úget_file_contentzGitLabClient.get_file_contento   s–  € ð ×+Ñ+¨I¸3Ð+Ó?ˆð	HØ×+Ñ+×/Ñ/°ÀÇÁÐ/ÓNˆDØ×Ñ 3Ò&à×6Ñ6°yÀcÐ6ÓJÐJØ×!Ñ!Ô#à ŸL™L×,Ñ,¨^Ó<ÒBÀ×IÑIÓKˆEØ×Ñ Ô(¨J¸%Ñ,?À5×CSÑCSÐTfÔCgØ—y‘yÐ ðFØ—|‘|×*Ñ*¨7Ó3Ð3øÜò FØ—|‘|×*Ñ*¨7¸9Ð*ÓEÒEðFûô ò 
	HÜ#¤G¨A¨z¸4Ó$@À-ÐQUÓVˆFØ˜Š}ÜØ˜Š}ÜØ-¨i¨[Ð8fÐgk×gsÑgsÐftÐtvÐwóð ð ˜Š}ÜÐ aÓbÐbÜÐ4°Y°K¸sÀ1À#ÐFÓGÐGûð
	HúsD   •AD ÁA.D ÃC) Ã)&DÄD ÄDÄD Ä	FÄFÅ AFÆFc                óÎ  — | j                  ||¬«      }	 | j                  j                  || j                  ¬«      }|j                  dk(  ry|j                  «        |j                  «       }|j                  d«      }|j                  dd«      }|r*|dk(  r%	 t        j                  |«      j                  d	«      S |S # t        $ r) t        j                  |«      j                  d	d
¬«      cY S w xY w# t        $ ri}t        t        |dd«      dd«      }	|	dk(  rY d}~y|	dk(  rt        d|› d| j                  › d�«      ‚|	dk(  rt        d«      ‚t        d|› d|› �«      ‚d}~ww xY w)zf
        Fallback for get_file_content(): use the JSON file API which returns base64 content.
        r&   r<   r=   NrR   Úencodingr   Úbase64r?   r@   rA   rC   rD   rE   rF   rG   rH   rI   rJ   rK   z' via JSON endpoint: )r2   r!   r   r   rD   rN   Újsonr^   Ú	b64decoderS   rT   rU   r   )
r"   r'   r   Újson_urlrW   ÚdatarR   r]   rY   rZ   s
             r#   rM   z'GitLabClient._get_file_content_via_json˜   s�  € ð ×-Ñ-¨i¸SÐ-ÓAˆð	ZØ×+Ñ+×/Ñ/°À$Ç,Á,Ð/ÓOˆDØ×Ñ 3Ò&ØØ×!Ñ!Ô#ØŸ)™)›+ˆDØ!ŸX™X iÓ0ˆGØ"Ÿh™h z°2Ó6ˆHÙ˜8 xÒ/ðWÜ!×+Ñ+¨GÓ4×;Ñ;¸GÓDÐDð ˆNøô !ò WÜ!×+Ñ+¨GÓ4×;Ñ;¸GÈIÐ;ÓVÒVðWûô ò 
	ZÜ#¤G¨A¨z¸4Ó$@À-ÐQUÓVˆFØ˜Š}ÜØ˜Š}ÜØ-¨i¨[Ð8fÐgk×gsÑgsÐftÐtvÐwóð ð ˜Š}ÜÐ aÓbÐbÜÐ4°Y°KÐ?TÐUVÐTWÐXÓYÐYûð
	ZúsI   •6C2 ÁA
C2 Â#B= Â;C2 Â=/C/Ã,C2 Ã.C/Ã/C2 Ã2	E$Ã;EÄAEÅE$Úfile_extensionc                ó€  — | j                  |||¬«      }	 | j                  j                  || j                  ¬«      }|j                  dk(  rg S |j                  «        |j                  «       xs g }g }|D ]N  }	|	j                  d«      dk(  sŒ|	j                  dd«      }
|r|
j                  |«      sŒ>|j                  |
«       ŒP |S # t        $ rk}t        t        |dd	«      d
d	«      }|dk(  rg cY d	}~S |dk(  rt        d|› d| j                  › d�«      ‚|dk(  rt        d«      ‚t        d|› d|› �«      ‚d	}~ww xY w)aÞ  
        List files in a directory with a specific extension using the repository tree API.

        Args:
            directory_path: Directory path in the repository (empty for repo root)
            file_extension: File extension to filter by (default: .prompt)
            recursive: If True, traverses subdirectories
            ref: Optional override (tag/branch/SHA). Defaults to self.ref.

        Returns:
            List of file paths (relative to repo root)
        )r4   r   r<   r=   ÚtypeÚblobÚpathr   rC   NrD   rE   zAccess denied to directory 'rG   rH   rI   rJ   zFailed to list files in 'rL   )r8   r!   r   r   rD   rN   r_   ÚendswithÚappendrT   rU   r   )r"   r3   rc   r4   r   ÚurlrW   rb   ÚfilesÚitemr'   rY   rZ   s                r#   Ú
list_fileszGitLabClient.list_files·   sa  € ð( —^‘^ N¸iÈS�^ÓQˆð	PØ×+Ñ+×/Ñ/°¸T¿\¹\Ð/ÓJˆDØ×Ñ 3Ò&Ø�	Ø×!Ñ!Ô#àŸ)™)›+Ò+¨ˆDØ&(ˆEØò 0�Ø—8‘8˜FÓ# vÓ-Ø $§¡¨°Ó 4�IÙ)¨Y×-?Ñ-?ÀÕ-OØŸ™ YÕ/ð	0ð
 ˆLøäò 
	PÜ#¤G¨A¨z¸4Ó$@À-ÐQUÓVˆFØ˜Š}Ø•	Ø˜Š}ÜØ2°>Ð2BÐBpÐqu×q}Ñq}Ðp~ð  Að  Bóð ð ˜Š}ÜÐ aÓbÐbÜÐ7¸Ð7GÀsÈ1È#ÐNÓOÐOûð
	Pús6   –7C	 Á?C	 Â%C	 Â4C	 Ã		D=ÃD8Ã0D=Ã6AD8Ä8D=c                 ó  — | j                   › d| j                  › �}	 | j                  j                  || j                  ¬«      }|j                  «        |j                  «       S # t        $ r}t        d|› �«      ‚d}~ww xY w)z-Get information about the project/repository.r*   r<   zFailed to get repository info: N)r   r    r!   r   r   rN   r_   rT   )r"   rj   rW   rY   s       r#   Úget_repository_infoz GitLabClient.get_repository_infoè   s   € àŸ™� j°×1BÑ1BÐ0CÐDˆð	CØ×+Ñ+×/Ñ/°¸T¿\¹\Ð/ÓJˆDØ×!Ñ!Ô#Ø—9‘9“;ÐøÜò 	CÜÐ=¸a¸SÐAÓBÐBûð	Cús   �AA$ Á$	B Á-A;Á;B c                 óD   — 	 | j                  «        y# t        $ r Y yw xY w)z*Test the connection to the GitLab project.TF)ro   rT   ©r"   s    r#   Útest_connectionzGitLabClient.test_connectionò   s(   € ð	Ø×$Ñ$Ô&ØøÜò 	Ùð	ús   ‚ “	žc                 ó0  — | j                   › d| j                  › d�}	 | j                  j                  || j                  ¬«      }|j                  «        |j                  «       }t        |t        «      r|S g S # t        $ r}t        d|› �«      ‚d}~ww xY w)z'Get list of branches in the repository.r*   z/repository/branchesr<   zFailed to get branches: N)
r   r    r!   r   r   rN   r_   Ú
isinstanceÚlistrT   )r"   rj   rW   rb   rY   s        r#   Úget_brancheszGitLabClient.get_branchesú   s’   € àŸ™� j°×1BÑ1BÐ0CÐCWÐXˆð	<Ø×+Ñ+×/Ñ/°¸T¿\¹\Ð/ÓJˆDØ×!Ñ!Ô#ØŸ)™)›+ˆDÜ% d¬DÔ1�4Ð9°rÐ9øÜò 	<ÜÐ6°q°cÐ:Ó;Ð;ûð	<ús   žAA9 Á7A9 Á9	BÂBÂBc                ó  — | j                  ||¬«      }	 t        | j                  «      }d|d<   | j                  j	                  ||¬«      }|j
                  dk(  ry|j                  «        |j                  j	                  d«      |j                  j	                  d«      |j                  j	                  d	«      d
œS # t        $ r8}t        t        |dd«      dd«      }|dk(  rY d}~yt        d|› d|› �«      ‚d}~ww xY w)zñ
        Get minimal metadata about a file via RAW endpoint headers at a given ref.

        Args:
            file_path: Path to the file in the repository.
            ref: Optional override (tag/branch/SHA). Defaults to self.ref.
        r&   z	bytes=0-0ÚRanger<   r=   Nr>   zcontent-lengthzlast-modified)Úcontent_typeÚcontent_lengthÚlast_modifiedrC   rD   z!Failed to get file metadata for 'rL   )	r0   Údictr   r!   r   rD   rN   rT   rU   )r"   r'   r   rj   r   rW   rY   rZ   s           r#   Úget_file_metadatazGitLabClient.get_file_metadata  sÿ   € ð ×'Ñ'¨	°sÐ'Ó;ˆð	SÜ! $§,¡,Ó/ˆGØ*ˆG�GÑØ×+Ñ+×/Ñ/°¸WÐ/ÓEˆDØ×Ñ 3Ò&ØØ×!Ñ!Ô#à $§¡× 0Ñ 0°Ó @Ø"&§,¡,×"2Ñ"2Ð3CÓ"DØ!%§¡×!1Ñ!1°/Ó!Bñð øô
 ò 	SÜ#¤G¨A¨z¸4Ó$@À-ÐQUÓVˆFØ˜Š}ÜÜÐ?À	¸{È#ÈaÈSÐQÓRÐRûð		Sús%   •AB= ÁA B= Â=	C>ÃC9Ã(C9Ã9C>c                 óR   — t        | d«      r| j                  j                  «        yy)z)Close the HTTP handler to free resources.r!   N)Úhasattrr!   Úcloserq   s    r#   r€   zGitLabClient.close   s#   € ä�4˜Ô(Ø×Ñ×#Ñ#Õ%ð )r%   )r   F)r   z.promptF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r|   r   r   r$   r0   r2   Úboolr8   r:   r[   rM   ru   rm   ro   rr   rv   r}   r€   © r%   r#   r   r      sü  „ ñ	ð0*˜t C¨ H™~ó 0*ðl BFò k sð k°C¸$±Jð kÈ#ó kð
 CGò g¨ð g°S¸4±Zð gÈ3ó gð !Øð
jð
 ò
jàð
jð ð
jð
 �4‰Zð
jð 
ó
jð ˜3ð  4ó ð EIò 'H¨#ð 'H°s¸T±zð 'HÈSÐSWÉZó 'HðR OSò Z°Cð ZÀÀtÁð ZÐWZÐ]aÑWaó ZðB !Ø'Øð	/Pð ò/Pàð/Pð ð/Pð ð	/Pð �4‰Zð/Pð 
ˆc‰ó/PðbC T¨#¨s¨(¡^ó Cð ó ð	<˜d 4¨¨S¨¡>Ñ2ó 	<ð FJò S¨3ð S¸¸d¹
ð SÈdÐSVÐX[ÐS[ÉnÐ_cÑNcó Só6&r%   r   )
r„   r^   Útypingr   r   Úurllib.parser   Ú&litellm.llms.custom_httpx.http_handlerr   r   r†   r%   r#   ú<module>rŠ      s$   ðñó
 ß Ý å >÷V&ò V&r%   