Ë
    tPêjE*  ã                   óâ   — d Z ddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZ ddlmZ  G d„ de«      Z G d	„ d
e«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zdedefd„Z G d„ d«      Zy)zN
BitBucket API client for fetching .prompt files from BitBucket repositories.
é    N)ÚMapping)ÚFinalÚ	TypedDict)ÚNotRequiredÚReadOnly)ÚHTTPHandlerc                   ó:   — e Zd ZU eee      ed<   eee      ed<   y)ÚBitBucketSrcEntryÚpathÚtypeN©Ú__name__Ú
__module__Ú__qualname__r   r   ÚstrÚ__annotations__© ó    út/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/bitbucket/bitbucket_client.pyr
   r
      ó"   … Ø
�;˜sÑ#Ñ
$Ó$Ø
�;˜sÑ#Ñ
$Ô$r   r
   c                   ó*   — e Zd ZU eeee         ed<   y)ÚBitBucketSrcListingÚvaluesN)r   r   r   r   r   Úlistr
   r   r   r   r   r   r      s   … Ø�[ Ð&7Ñ!8Ñ9Ñ:Ô:r   r   c                   ó:   — e Zd ZU eee      ed<   eee      ed<   y)ÚBitBucketBranchÚnamer   Nr   r   r   r   r   r      r   r   r   c                   ó*   — e Zd ZU eeee         ed<   y)ÚBitBucketBranchListingr   N)r   r   r   r   r   r   r   r   r   r   r   r   r      s   … Ø�[  oÑ!6Ñ7Ñ8Ô8r   r   c                   óP   — e Zd ZU eedz     ed<   eedz     ed<   eedz     ed<   y)ÚBitBucketFileMetadataNÚcontent_typeÚcontent_lengthÚlast_modified)r   r   r   r   r   r   r   r   r   r!   r!   !   s/   … Ø˜3 ™:Ñ&Ó&Ø˜S 4™ZÑ(Ó(Ø˜C $™JÑ'Ô'r   r!   Ú	file_pathÚreturnc                 ó¸   — d| v sd| v rt        d| ›d�«      ‚| j                  d«      }|D ]  }|dk(  sŒ	t        d| ›d�«      ‚ dj                  d„ |D «       «      S )	z7Reject path traversal and URL-encode each path segment.ú#ú?zInvalid file path z!: contains URL special charactersú/z..z: path traversal detectedc              3   ó^   K  — | ]%  }t         j                  j                  |d ¬«      –— Œ' y­w)Ú )ÚsafeN)ÚurllibÚparseÚquote)Ú.0Úparts     r   ú	<genexpr>z&_sanitize_file_path.<locals>.<genexpr>/   s$   è ø€ ÒH¸$”F—L‘L×&Ñ& t°"Ð&×5ÑHùs   ‚+-)Ú
ValueErrorÚsplitÚjoin)r%   Úpartsr2   s      r   Ú_sanitize_file_pathr8   '   sz   € à
ˆiÑ˜3 )Ñ+ÜÐ-¨i¨]Ð:[Ð\Ó]Ð]Ø—?‘? 3Ó'€EØò ZˆØ�4‹<ÜÐ1°)°Ð>WÐXÓYÐYðZð �8‰8ÑHÀ%ÔHÓHÐHr   c                   ó¨   — e Zd ZdZdeeef   fd„Zdededz  fd„Zdded	ede	e   fd
„Z
deeef   fd„Zdefd„Zde	e   fd„Zdededz  fd„Zd„ Zy)ÚBitBucketClienta  
    Client for interacting with BitBucket API to fetch .prompt files.

    Supports:
    - Authentication with access tokens
    - Fetching file contents from repositories
    - Team-based access control through BitBucket permissions
    - Branch-specific file fetching
    Úconfigc                 ó
  — |j                  d«      | _        |j                  d«      | _        |j                  d«      | _        |j                  dd«      | _        |j                  dd«      | _        |j                  dd	«      | _        |j                  d
«      | _        t        | j                  | j                  | j                  g«      st        d«      ‚dddœ| _
        | j                  dk(  rk| j                  r_| j                  › d| j                  › �}t        j                  |j                  «       «      j                  «       }d|› �| j                  d<   nd| j                  › �| j                  d<   t        «       | _        y)a8  
        Initialize the BitBucket client.

        Args:
            config: Dictionary containing:
                - workspace: BitBucket workspace name
                - repository: Repository name
                - access_token: BitBucket access token (or app password)
                - branch: Branch to fetch from (default: main)
                - base_url: Custom BitBucket API base URL (optional)
                - auth_method: Authentication method ('token' or 'basic', default: 'token')
                - username: Username for basic auth (optional)
        Ú	workspaceÚ
repositoryÚaccess_tokenÚbranchÚmainr,   zhttps://api.bitbucket.org/2.0Úauth_methodÚtokenÚusernamez4workspace, repository, and access_token are requiredzapplication/json)ÚAcceptzContent-TypeÚbasicú:zBasic ÚAuthorizationzBearer N)Úgetr=   r>   r?   r@   Úbase_urlrB   rD   Úallr4   ÚheadersÚbase64Ú	b64encodeÚencodeÚdecoder   Úhttp_handler)Úselfr;   ÚcredentialsÚencoded_credentialss       r   Ú__init__zBitBucketClient.__init__=   sL  € ð  Ÿ™ KÓ0ˆŒØ Ÿ*™* \Ó2ˆŒØ"ŸJ™J ~Ó6ˆÔØ—j‘j ¨6Ó2ˆŒØŸ
™
 2Ð'FÓGˆŒØ!Ÿ:™: m°WÓ=ˆÔØŸ
™
 :Ó.ˆŒä�D—N‘N D§O¡O°T×5FÑ5FÐGÔHÜÐSÓTÐTð )Ø.ñ
ˆŒð
 ×Ñ˜wÒ&¨4¯=ª=à$(§M¡M ?°!°D×4EÑ4EÐ3FÐ!GˆKÜ)/×)9Ñ)9¸+×:LÑ:LÓ:NÓ)O×)VÑ)VÓ)XÐØ.4Ð5HÐ4IÐ,JˆD�L‰L˜Ò)ð /6°d×6GÑ6GÐ5HÐ,IˆD�L‰L˜Ñ)ô (›MˆÕr   r%   r&   Nc           
      ó¬  — t        |«      }| j                  › d| j                  › d| j                  › d| j                  › d|› �	}	 | j
                  j                  || j                  ¬«      }|j                  «        |j                  j                  dd«      j                  d«      r|j                  S 	 t        j                  |j                  «      j                  d«      S # t        $ r |j                  cY S w xY w# t        $ rÍ}t!        |d	«      r«t!        |j"                  d
«      r•|j"                  j$                  dk(  rY d}~y|j"                  j$                  dk(  r)t        d|› d| j                  › d| j                  › d�«      ‚|j"                  j$                  dk(  rt        d«      ‚t        d|› d|› �«      ‚t        d|› d|› �«      ‚d}~ww xY w)zå
        Fetch the content of a file from the BitBucket repository.

        Args:
            file_path: Path to the file in the repository

        Returns:
            File content as string, or None if file not found
        ú/repositories/r*   ú/src/©rL   úcontent-typer,   ztext/zutf-8ÚresponseÚstatus_codeé”  Né“  zAccess denied to file 'ú3'. Check your BitBucket permissions for workspace 'ú' and repository 'ú'.é‘  úIAuthentication failed. Check your BitBucket access token and permissions.zFailed to fetch file 'ú': zError fetching file ')r8   rJ   r=   r>   r@   rQ   rI   rL   Úraise_for_statusÚ
startswithÚtextrM   Ú	b64decodeÚcontentrP   Ú	ExceptionÚhasattrr[   r\   )rR   r%   Ú	safe_pathÚurlr[   Úes         r   Úget_file_contentz BitBucketClient.get_file_contenth   sÞ  € ô /¨yÓ9ˆ	ØŸ™� n°T·^±^Ð4DÀAÀdÇoÁoÐEVÐV[Ð\`×\gÑ\gÐ[hÐhiÐjsÐitÐuˆð	KØ"×/Ñ/×3Ñ3°CÀÇÁÐ3ÓNˆHØ×%Ñ%Ô'ð ×Ñ×#Ñ# N°BÓ7×BÑBÀ7ÔKØ—}‘}Ð$ð)Ü!×+Ñ+¨H×,<Ñ,<Ó=×DÑDÀWÓMÐMøÜ ò )Ø#Ÿ=™=Ò(ð)ûô ò 	Kä�q˜*Ô%¬'°!·*±*¸mÔ*LØ—:‘:×)Ñ)¨SÒ0ÜØ—Z‘Z×+Ñ+¨sÒ2Ü#Ø1°)°Ð<oÐpt×p~Ñp~Ðoð  @Rð  SW÷  Sbñ  Sbð  Rcð  ceð  fóð ð —Z‘Z×+Ñ+¨sÒ2Ü#Ð$oÓpÐpä#Ð&<¸Y¸KÀsÈ1È#Ð$NÓOÐOäÐ"7¸	°{À#ÀaÀSÐ IÓJÐJûð	Kús>   ÁA-C= Â4-C" Ã"C:Ã7C= Ã9C:Ã:C= Ã=	GÄ;GÅBGÇGÚdirectory_pathÚfile_extensionc           
      ó   — |rt        |«      nd}| j                  › d| j                  › d| j                  › d| j                  › d|› �	}	 | j
                  j                  || j                  ¬«      }|j                  «        |j                  «       }g }|j                  dg «      D ]L  }|j                  d«      dk(  sŒ|j                  d	d«      }	|	j                  |«      sŒ<|j                  |	«       ŒN |S # t        $ rÏ}
t        |
d
«      r­t        |
j                  d«      r—|
j                  j                  dk(  rg cY d}
~
S |
j                  j                  dk(  r)t        d|› d| j                  › d| j                  › d�«      ‚|
j                  j                  dk(  rt        d«      ‚t        d|› d|
› �«      ‚t        d|› d|
› �«      ‚d}
~
ww xY w)a  
        List files in a directory with a specific extension.

        Args:
            directory_path: Directory path in the repository (empty for root)
            file_extension: File extension to filter by (default: .prompt)

        Returns:
            List of file paths
        r,   rW   r*   rX   rY   r   r   Úcommit_filer   r[   r\   r]   Nr^   zAccess denied to directory 'r_   r`   ra   rb   rc   zFailed to list files in 'rd   zError listing files in ')r8   rJ   r=   r>   r@   rQ   rI   rL   re   ÚjsonÚendswithÚappendrj   rk   r[   r\   )rR   rp   rq   Úsafe_dirrm   r[   ÚdataÚfilesÚitemr%   rn   s              r   Ú
list_fileszBitBucketClient.list_files“   s÷  € ñ BPÔ-¨nÔ=ÐUWˆØŸ™� n°T·^±^Ð4DÀAÀdÇoÁoÐEVÐV[Ð\`×\gÑ\gÐ[hÐhiÐjrÐisÐtˆð	SØ"×/Ñ/×3Ñ3°CÀÇÁÐ3ÓNˆHØ×%Ñ%Ô'à/7¯}©}«ˆDØ&(ˆEàŸ™ ¨2Ó.ò 0�Ø—8‘8˜FÓ# }Ó4Ø $§¡¨°Ó 4�IØ ×)Ñ)¨.Õ9ØŸ™ YÕ/ð	0ð ˆLøäò 	Sä�q˜*Ô%¬'°!·*±*¸mÔ*LØ—:‘:×)Ñ)¨SÒ0Ø•IØ—Z‘Z×+Ñ+¨sÒ2Ü#Ø6°~Ð6FÐFyÐz~÷  {Iñ  {Ið  zJð  J\ð  ]a÷  ]lñ  ]lð  \mð  moð  póð ð —Z‘Z×+Ñ+¨sÒ2Ü#Ð$oÓpÐpä#Ð&?ÀÐ?OÈsÐSTÐRUÐ$VÓWÐWäÐ":¸>Ð:JÈ#ÈaÈSÐ QÓRÐRûð	Sús2   Á	A2C5 Â<#C5 Ã C5 Ã5	GÃ><GÄ:GÅ BGÇGc                 ó   — | j                   › d| j                  › d| j                  › �}	 | j                  j	                  || j
                  ¬«      }|j                  «        |j                  «       S # t        $ r}t        d|› �«      ‚d}~ww xY w)z‚
        Get information about the repository.

        Returns:
            Dictionary containing repository information
        rW   r*   rY   zFailed to get repository info: N©	rJ   r=   r>   rQ   rI   rL   re   rt   rj   )rR   rm   r[   rn   s       r   Úget_repository_infoz#BitBucketClient.get_repository_infoÀ   sŠ   € ð Ÿ™� n°T·^±^Ð4DÀAÀdÇoÁoÐEVÐWˆð	CØ"×/Ñ/×3Ñ3°CÀÇÁÐ3ÓNˆHØ×%Ñ%Ô'Ø—=‘=“?Ð"øÜò 	CÜÐ=¸a¸SÐAÓBÐBûð	Cús   ªAA1 Á1	BÁ:BÂBc                 óD   — 	 | j                  «        y# t        $ r Y yw xY w)z’
        Test the connection to the BitBucket repository.

        Returns:
            True if connection is successful, False otherwise
        TF)r~   rj   ©rR   s    r   Útest_connectionzBitBucketClient.test_connectionÐ   s(   € ð	Ø×$Ñ$Ô&ØøÜò 	Ùð	ús   ‚ “	žc                 óF  — | j                   › d| j                  › d| j                  › d�}	 | j                  j	                  || j
                  ¬«      }|j                  «        |j                  «       }|j	                  dg «      S # t        $ r}t        d|› �«      ‚d}~ww xY w)z
        Get list of branches in the repository.

        Returns:
            List of branch information dictionaries
        rW   r*   z/refs/branchesrY   r   zFailed to get branches: Nr}   )rR   rm   r[   rx   rn   s        r   Úget_brancheszBitBucketClient.get_branchesÝ   sš   € ð Ÿ™� n°T·^±^Ð4DÀAÀdÇoÁoÐEVÐVdÐeˆð	<Ø"×/Ñ/×3Ñ3°CÀÇÁÐ3ÓNˆHØ×%Ñ%Ô'à2:·-±-³/ˆDØ—8‘8˜H bÓ)Ð)øÜò 	<ÜÐ6°q°cÐ:Ó;Ð;ûð	<ús   «AB Â	B ÂBÂB c           	      óª  — t        |«      }| j                  › d| j                  › d| j                  › d| j                  › d|› �	}	 | j
                  j                  «       }d|d<   | j                  j                  ||¬«      }|j                  «        |j
                  j                  d«      |j
                  j                  d«      |j
                  j                  d	«      d
œS # t        $ rg}t        |d«      rEt        |j                  d«      r/|j                  j                  dk(  rY d}~yt        d|› d|› �«      ‚t        d|› d|› �«      ‚d}~ww xY w)zî
        Get metadata about a file (size, last modified, etc.).

        Args:
            file_path: Path to the file in the repository

        Returns:
            Dictionary containing file metadata, or None if file not found
        rW   r*   rX   z	bytes=0-0ÚRangerY   rZ   zcontent-lengthzlast-modified)r"   r#   r$   r[   r\   r]   Nz!Failed to get file metadata for 'rd   z!Error getting file metadata for ')r8   rJ   r=   r>   r@   rL   ÚcopyrQ   rI   re   rj   rk   r[   r\   )rR   r%   rl   rm   rL   r[   rn   s          r   Úget_file_metadataz!BitBucketClient.get_file_metadataï   sR  € ô /¨yÓ9ˆ	ØŸ™� n°T·^±^Ð4DÀAÀdÇoÁoÐEVÐV[Ð\`×\gÑ\gÐ[hÐhiÐjsÐitÐuˆð	Wà!Ÿ\™\×.Ñ.Ó0ˆGØ*ˆG�GÑà"×/Ñ/×3Ñ3°CÀÐ3ÓIˆHØ×%Ñ%Ô'ð !)× 0Ñ 0× 4Ñ 4°^Ó DØ"*×"2Ñ"2×"6Ñ"6Ð7GÓ"HØ!)×!1Ñ!1×!5Ñ!5°oÓ!Fñð øô
 ò 	Wä�q˜*Ô%¬'°!·*±*¸mÔ*LØ—:‘:×)Ñ)¨SÒ0ÜÜÐ"CÀIÀ;ÈcÐRSÐQTÐ UÓVÐVäÐ"CÀIÀ;ÈcÐRSÐQTÐ UÓVÐVûð	Wús   ÁBC" Ã"	EÃ+;EÄ+"EÅEc                 óR   — t        | d«      r| j                  j                  «        yy)z)Close the HTTP handler to free resources.rQ   N)rk   rQ   Úcloser€   s    r   r‰   zBitBucketClient.close  s#   € ä�4˜Ô(Ø×Ñ×#Ñ#Õ%ð )r   )r,   z.prompt)r   r   r   Ú__doc__r   r   ÚobjectrU   ro   r   r{   r~   Úboolr�   r   rƒ   r!   r‡   r‰   r   r   r   r:   r:   2   s´   „ ñð)*˜w s¨F {Ñ3ó )*ðV)K¨#ð )K°#¸±*ó )KñV+S¨ð +SÀ3ð +SÐW[Ð\_ÑW`ó +SðZC W¨S°&¨[Ñ%9ó Cð  ó ð<˜d ?Ñ3ó <ð$!W¨3ð !WÐ3HÈ4Ñ3Oó !WóF&r   r:   )rŠ   rM   Úurllib.parser.   Úcollections.abcr   Útypingr   r   Útyping_extensionsr   r   Ú&litellm.llms.custom_httpx.http_handlerr   r
   r   r   r   r!   r   r8   r:   r   r   r   ú<module>r’      s|   ðñó Û Ý #ß #ç 3å >ô%˜	ô %ô
;˜)ô ;ô%�iô %ô
9˜Yô 9ô(˜Iô (ðI 3ð I¨3ó I÷c&ò c&r   