
    3Uj                        d Z 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ej                  j                  dd      ZddZddZddZddd	Z	 	 d	 	 	 dd
ZddZddZddZddZddZy)u	  Supabase Storage — the WRITABLE shared file store for jarvis-tools.

A service account can't write to a personal Google Drive (no quota), so this is
the write layer: Jarvis/any AI on any device can save, read, list, and delete
files here, and they sync everywhere. Works from the cloud connector (plain
HTTPS, no OAuth). Files live in the 'jarvis-files' bucket of Ahmed's Supabase.

Env: SUPABASE_URL, SUPABASE_SECRET (the service_role key).
(Reading Ahmed's Google Drive uploads still goes through the drive_* tools.)
    )annotationsNSTORAGE_BUCKETzjarvis-filesc                 `    t         j                  j                  dd      j                  d      S )NSUPABASE_URL /)osenvirongetrstrip     J/Users/ahmed/devFolder/Ultron/claude-voice/jarvis-tools-service/storage.py_baser      s"    ::>>."-44S99r   c                 B    t         j                  j                  dd      S )NSUPABASE_SECRETr   )r	   r
   r   r   r   r   _keyr      s    ::>>+R00r   c                 @    t        t               xr
 t                     S N)boolr   r   r   r   r   
configuredr      s    "DF##r   c                \    dt                t               d}| r|j                  |        |S )NzBearer )Authorizationapikey)r   update)extrahs     r   _headersr   #   s*    #DF8,?A	Hr   c           
        t         j                  j                  t                d| ||       }t	        |      j                         D ]  \  }}|j                  ||        	 t         j                  j                  |d      5 }|j                         cd d d        S # 1 sw Y   y xY w# t         j                  j                  $ rA}t        d|j                   d|j                         d d j                  dd	             d }~ww xY w)
Nz/storage/v1)datamethod   )timeoutzHTTP z:    utf-8ignore)urllibrequestRequestr   r   items
add_headerurlopenreaderror	HTTPErrorRuntimeErrorcodedecode)	r!   pathbodyheadersreqkvres	            r   _dor;   *   s    
..
 
 EG9Kv!>T'- ! /C!'')1q! *J^^##C#4668 544<<!! JU166("ffhtn33GXFGI J 	JJs6   $!B+ B	B+ B($B+ (B+ +D	<DD	c            
     ,   	 t        ddt        j                  t        t        dd      j	                         ddi       y # t
        $ rJ} dt        |       j                         vr%dt        |       j                         vrY d } ~ y Y d } ~ y Y d } ~ y d } ~ ww xY w)	NPOSTz/bucketF)idnamepublicContent-Typeapplication/jsonexist	duplicate)r;   jsondumpsBUCKETencode	Exceptionstrlower)r:   s    r   _ensure_bucketrL   8   sy    FIJJffFGNNP/0	2  #a&,,.([A-N .O(s   =A   	B	6BBc           
        t        |       j                         j                  d      } | syt                t	        |t               r|j                  d      n|}t        j                  |       d   xs d}	 t        ddt         dt        j                  j                  | d       ||d	d
       d|  dt        |       dS # t        $ r}dt        |      d d  cY d }~S d }~ww xY w)Nr   z'storage_write failed: need a file name.r%   r   z
text/plainr=   /object/safetrue)rA   zx-upsertzSaved z to shared storage (z bytes).zstorage_write failed:    )rJ   striplstriprL   
isinstancerH   	mimetypes
guess_typer;   rG   r'   parsequotelenrI   )r?   contentr4   mimer:   s        r   writer]   B   s    t9??##C(D8&0#&>7>>'"GD%a(8LD7Fhvha(:(:4c(:(J'KLd!v6	8v1#d)HEE 7'At~667s   6AC 	C&C!C&!C&c           
     n   t        |       j                         j                  d      } 	 t        ddt         dt
        j                  j                  | d             }|j                  dd      }|  d|d d  t        |      dkD  rd	z   S d
z   S # t        $ r}dt        |      d d  cY d }~S d }~ww xY w)Nr   GETrN   rO   r%   r&   z:
iX  u    …[truncated]r   zstorage_read failed: rR   )rJ   rS   rT   r;   rG   r'   rX   rY   r2   rZ   rI   )r?   r    txtr:   s       r   r-   r-   Q   s    t9??##C(D65HVHAfll.@.@C.@.P-QRSkk'8,s3u:,'C4+<XXUWXX 6&s1vds|n556s$   A!B B 	B4B/)B4/B4c                    	 t        ddt         t        j                  dddddd      j	                         d	d
i      } t        j
                  |       }|sy|D cg c]B  }|j                  d      r/d|d    d|j                  d      xs i j                  dd       dD }}t        |       ddj                  |      z   S c c}w # t        $ r}dt        |      d d  cY d }~S d }~ww xY w)Nr=   z/object/list/r   d   r?   asc)columnorder)prefixlimitsortByrA   rB   zShared storage is empty.z- z (metadatasize?z bytes)z file(s) in shared storage:

zstorage_list failed: rR   )r;   rG   rE   rF   rH   loadsr   rZ   joinrI   rJ   )r    r*   ilinesr:   s        r   
list_filesrq   [   s   66]6(3::c4:U)KM NNTfh"$679 

4 -  2Q155= ai[ !eeJ'-22263?@I 	 2 e*:;dii>NNN2  6&s1vds|n556s7   AC C AC$!C C 	C/C*$C/*C/c           
        t        |       j                         j                  d      } 	 t        ddt         dt
        j                  j                  | d              d|  dS # t        $ r}dt        |      d d  cY d }~S d }~ww xY w)	Nr   DELETErN   rO   zDeleted z from shared storage.zstorage_delete failed: rR   )	rJ   rS   rT   r;   rG   r'   rX   rY   rI   )r?   r:   s     r   deletert   l   s    t9??##C(D8H&,,*<*<T*<*L)MNO$455 8(Q778s   :A% %	B	.B>B	B	)returnrJ   )ru   r   r   )r   dict | Noneru   dict)NN)
r!   rJ   r3   rJ   r4   zbytes | Noner5   rv   ru   bytes)ru   None)r?   rJ   r[   rJ   ru   rJ   )r?   rJ   ru   rJ   )__doc__
__future__r   rE   rV   r	   urllib.errorr'   urllib.parseurllib.requestr
   r   rG   r   r   r   r   r;   rL   r]   r-   rq   rt   r   r   r   <module>r      s   	 #   	   	(.	9:1$ 6:#JJ(-J766"8r   