
    "/i                     L   d 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ddlZddlm	Z	 ddl
Z
ddlZddlZ e
j                  e      ZddlmZ ddlmZ ddlZddlZ	 ddlZ	 ddlmZ dd	lmZ 	 ddl Z dZ!d Z"dZ#da$da%dZ&dZ'dZ(dZ)g dZ*g dZ+d[de,de,de,fdZ-de,fdZ.dddd dd!d"d#idgd$d%d&d'd d(d!d)d#id(gd$d%d*d+d d,d!d-d#id,gd$d%d.d/d d!d0d#d1d2d#d3d4gd$d%d5d6d d7d8d#d7d9d#d:d;d<gd$d%d=d>d d7d?d#d7d@d#d7dAd#d7dBd#dCd;d<gd$d%dDdEd dFd!dGd#idFgd$d%dHdId d!g dJdKdLd!dMd#dNdOdFgd$d%dPdQd i dRd%dSdTd i dRd%g
igZ/dU Z0 G dV dW      Z1edXk(  rY	 ejd                  dYk(  r! ejf                   ejh                                 e1       Z5 ejl                  e5jo                                yy# e$ r  ed        ej6                  d       Y ww xY w# e$ r  ed
        ej6                  d       Y w xY w# e$ r dZ! ed       Y w xY w# e8$ r  edZ       Y yw xY w)\a<  
Gemini Live Session - Revenue First Mode
========================================
Direct desktop voice bridge to Gemini 3 Flash.
Identity: Antigravity (Genesis System Core).

Features:
- Real-time Audio Streaming (In/Out)
- Barge-in (via model VAD)
- Tools: Google Search, Browser Navigation
- "System Ready" Chime
    N)Path)AutoBrowseSkill)registryz6Error: pyaudio not installed. Run: pip install pyaudio   )genai)typesz@Error: google-genai not installed. Run: pip install google-genaiTFz6Warning: pyttsx3 not installed. System chime disabled.c                     	 ddl m} m}  |       }|j                  d      rt        j                  d       yt        t              j                  j                  j                  dz  }|j                         rt        j                  d       t        |d      5 }|D ]  }|j                         }|r|j                  d	      r'd
|v s,|j                  d
d      \  }}|j                         }|t        j                  vsd|j                         t        j                  |<   d|j!                         v sd|j!                         v rt        j                  d| d       t        j                  d|         	 ddd       yt        j#                  d       y# 1 sw Y   yxY w# t$        $ r t        j#                  d       t        t              j                  j                  j                  dz  }|j                         rt        |d      5 }|D ]  }|j                         }|r|j                  d	      r'd
|v s,|j                  d
d      \  }}|j                         t        j                  vsb|j                         t        j                  |j                         <    	 ddd       Y y# 1 sw Y   Y yxY wY yt&        $ r5}t        j)                  dt+        |      j,                          Y d}~yd}~ww xY w)a  
    UVS-H05: Secure credential loading.

    Priority:
    1. System keyring (Windows Credential Manager, etc.)
    2. Environment variables
    3. .env file (fallback only, for backward compatibility)

    SECURITY: Does NOT print credential values in logs.
    r   )get_gemini_api_keycheck_credential_statusgemini_configuredz)Credentials loaded securely (keyring/env)Nz.envz=Loading credentials from .env (consider migrating to keyring)r#=r   KEYSECRETzLoaded credential: z=****zLoaded config: z2No credentials found in keyring, env, or .env filezBSecure credential manager not available, using legacy .env loadingzError loading credentials: ) core.security.credential_managerr
   r   getloggerdebugr   __file__parentexistsopenstrip
startswithsplitosenvironupperwarningImportError	Exceptionerrortype__name__)	r
   r   statusenv_pathflinekeyvaluees	            7/mnt/e/genesis-system/core/voice/gemini_live_session.pyload_env_filer.   6   sn   1G`(*::)*LLDE >((//66???LLXZh$ F FD::<D4??3#7 d{%)ZZQ%7
U!iikbjj0.3kkmBJJsO$		3x399;7N &/B3%u-M N &se-D EFF F" NNOP#F F&  D[\>((//66???h$ D DD::<D4??3#7 d{%)ZZQ%7
U99;bjj86;kkmBJJsyy{3DD D D   G2473C3C2DEFFGs   5F& A"F& .F	7FA9F;F& F& F#F& #F& &A+K>.J2 5J261J2(K>2J<	7K><K>K>	+K99K>zmodels/gemini-3-flashD  >  i]  i   a  
IDENTITY: I AM ANTIGRAVITY (Genesis System Core).
PROTOCOL: UNIFIED VOICE-VISION MENTORSHIP (Phase E: Mentorship Integration).

THINK-ACT-OBSERVE LOOP:
1. **THINK**: Analyze vision (16 FPS). Reasoning about business strategy.
2. **ACT**: 
   - **MENTOR NARRATION**: Explain *The Why* before *The How*. (e.g., "We are using a sub-account structure to separate your client data for better security...").
   - **EXECUTE**: Use skills or cursor tools.
3. **OBSERVE**: Verify outcome and update progress.

STRATEGIC MENTORSHIP RULES:
1. **PROACTIVE PAUSING**: If a configuration task is complex, use `pause_for_founder_question` to ask if they follow your logic.
2. **FOUNDER FIRST**: The founder owns the vision; you own the execution.
3. **SHARED CURSOR**: Use the Sparkle Cursor to guide attention.
4. **MUTUAL AUTONOMY**: Yield immediately if the user interacts.
5. **HANDOVER**: Sensitive actions require verbal "Yes".
z;C:\Program Files (x86)\Google\Chrome\Application\chrome.exe)zwww.google.comz
google.comzapp.gohighlevel.comzgohighlevel.comzdocs.google.comzdrive.google.com)file
javascriptdatavbscriptaboutbase_urlqueryreturnc                 2   ddl m}m}m}  ||       }|j                  j                         dvr:t        j                  d|j                          t        d|j                         t        D ]:  }|| j                         v st        j                  d|        t        d|        |j                  j                         t        vr:t        j                  d|j                          t        d	|j                         |r ||      }|  d
| S | S )a  
    UVS-H04: Validate and build safe URLs for subprocess execution.

    Args:
        base_url: Base URL (must be https://)
        query: Optional query string to encode safely

    Returns:
        Safe URL string

    Raises:
        ValueError: If URL is unsafe
    r   )urlparse
quote_plusurljoin)httpshttpz&[SECURITY] Blocked unsafe URL scheme: zURL scheme must be https, got: z#[SECURITY] Blocked URL containing: zURL contains blocked pattern: z&[SECURITY] URL host not in allowlist: zURL host not allowed: z?q=)urllib.parser:   r;   r<   schemelowerr   r    
ValueErrorBLOCKED_URL_SCHEMESnetlocALLOWED_URL_HOSTS)r6   r7   r:   r;   r<   parsedblocked
safe_querys           r-   validate_and_build_urlrI      s    ;: hF }}$55?OP:6==/JKK ' Ihnn&&NN@	JK=gYGHHI }}$55?OP1&--ABB &
3zl++O    c                     ddl m} t        d|         	 t        d|       }t	        j
                  t        |g       dd|  diS # t        $ r)}t        j                  d|        d	d
| icY d}~S d}~ww xY w)z
    Search Google for the query (Forced Chrome).

    UVS-H04: URL injection prevention via:
    - URL scheme validation (https only)
    - Host allowlist (google.com)
    - Query encoding (quote_plus)
    r   )r;   z[Tool] Searching Google: zhttps://www.google.com/searchresultzOpened Google Search for: z
 in Chromez"[SECURITY] Google search blocked: r#   zSearch blocked for security: N)
r?   r;   printrI   
subprocessPopenCHROME_PATHrB   r   r    )r7   r;   urlr,   s       r-   google_searchrR      s     (	%eW
-.
>$%DeL 	+s+,6ugZHII >;A3?@8<==>s   .A 	A7A2,A72A7function_declarationsrR   zSearch Google for information.OBJECTSTRINGzThe search query.)r$   description)r$   
propertiesrequired)namerV   
parametersnavigate_browserz+Navigate the web browser to a specific URL.rQ   zThe URL to visit.pause_for_founder_questionz|Stop current execution and wait for the founder to ask a question or provide feedback. Use this for complex strategic steps.reasonzNThe strategic reason for pausing (e.g., 'Do you have the DNS records ready?').auto_browsezExecute a complex browser task using the native January 2026 Auto-Browse tool. Use this for navigating GHL, clicking buttons, and investigating the UI.zPThe high-level instruction (e.g., 'Go to Agency Settings and find the API key').BOOLEANzLSet to true ONLY if the founder has verbally confirmed this specific action.)instruction	confirmedr`   move_cursorzkMove the Shared Cursor (Sparkle Icon) to a specific coordinate on the screen to guide the user's attention.INTEGERzX coordinate in pixels.zY coordinate in pixels.)xyrd   re   zoom_viewportziZoom in on a specific area of the screen for detailed inspection of small elements (e.g., GHL menu text).z'Top-left X coordinate of the zoom area.z'Top-left Y coordinate of the zoom area.z%Width of the zoom area (default 400).z&Height of the zoom area (default 400).)rd   re   widthheightanchor_elementzLock the Sparkle Cursor to a specific DOM element (e.g., a 'Save' button). The cursor will follow the element during scrolling.selectorz)CSS selector of the element to anchor to.gesture_cursorz]Perform a visual gesture with the Sparkle Cursor to highlight an element (e.g., 'circle' it).circle	underlinepointzType of gesture.)r$   enumrV   z)CSS selector of the element to highlight.)r$   rj   r$   
clear_zoomz7Clear any active zoom and return to full viewport view.)r$   rW   visual_resetzClear ALL visual indicators (Sparkle, Progress, Zoom) and reset to a clean state. Use this when a strategic section is finished.c                  ~    t        t              } t        j                         }|r| d   d   j	                  |       | S )z8Build the final toolset including registered GHL skills.r   rS   )listTOOLSghl_registryget_tool_definitionsextend)
base_tools	ghl_toolss     r-   get_dynamic_toolsr{   V  s:    eJ113I1-.55i@rJ   c                       e Zd ZdZd Zed        Zej                  d        Zed        Zej                  d        ZdZ	d Z
d	 Zd
 Zd Zd Zd Zd ZdefdZd Zd Zy)GeminiLiveSessionz
    Gemini Live Voice Session.

    VERIFICATION_STAMP (UVS-H08, UVS-H09)
    - UVS-H08: Thread safety for async callbacks with RLock
    - UVS-H09: Single stream start with is_active check
    c                    dd l }t                t        j                  j	                  d      | _        | j
                  s t        d       t        j                  d       t        j                  | j
                        | _        t        j                         | _        d | _        d | _        |j#                         | _        d| _        d | _        t+        t,        d      rt-        j.                         nd | _        d| _        d| _        t7               | _        | j:                  | j8                  j<                  _        d| _         d | _!        d | _"        |jG                         | _$        d | _%        d | _&        y )Nr   GEMINI_API_KEYz3Error: GEMINI_API_KEY environment variable not set.r   )api_keyFLock)'	threadingr.   r   r   r   r   rM   sysexitr   ClientclientpyaudioPyAudioaudioinput_streamoutput_streamRLock_state_lock_is_running_sessionhasattrasyncior   _session_locklast_audio_timestop_playbackr   auto_browse_skill_handle_user_activity
controlleron_user_activityrequires_handoverpending_actionloopEvent_conductor_stop_flag_conductor_thread_context_queue)selfr   s     r-   __init__zGeminiLiveSession.__init__h  s   zz~~&67||GHHHQKll4<<8__&
 ! %??, /6w/GW\\^T "!0!2=A=W=W)):!&"	 %.OO$5!!% #rJ   c                 ^    | j                   5  | j                  cd d d        S # 1 sw Y   y xY wNr   r   r   s    r-   
is_runningzGeminiLiveSession.is_running  s)     	$##	$ 	$ 	$   #,c                 T    | j                   5  || _        d d d        y # 1 sw Y   y xY wr   r   r   r+   s     r-   r   zGeminiLiveSession.is_running  s(     	%$D	% 	% 	%   'c                 ^    | j                   5  | j                  cd d d        S # 1 sw Y   y xY wr   r   r   r   s    r-   sessionzGeminiLiveSession.session  s'     	!==	! 	! 	!r   c                 T    | j                   5  || _        d d d        y # 1 sw Y   y xY wr   r   r   s     r-   r   zGeminiLiveSession.session  s'     	"!DM	" 	" 	"r     c                 F   ddl }| j                  5  | j                  sdt        j                  fcddd       S 	 ddd       	  |j
                  |d      }|| j                  kD  r"| j                  st        d| d       d| _        | j                  j                  | j                  j                  |       dt        j                  fS # 1 sw Y   xY w# t        $ r Y )t        $ r8}t        j!                  dt#        |      j$                   d|        Y d}~dd}~ww xY w)	z
        Threaded callback for non-blocking audio capture + Local VAD.

        UVS-H08: Thread-safe access to shared state.
        r   N   z# [VAD] Interruption Detected (RMS: z) -> Muting OutputTzAudio callback error: : )audioopr   r   r   
paContinuermsVAD_THRESHOLDr   rM   r   call_soon_threadsafeaudio_queue
put_nowaitAttributeErrorr"   r   r   r$   r%   )r   in_dataframe_count	time_infor&   r   r   r,   s           r-   _input_callbackz!GeminiLiveSession._input_callback  s    	  	2##g001	2 	2#	2	K'++gq)C T'''))?uDVWX%)"II**4+;+;+F+FP g(())-	2 	2   	 	KLL1$q'2B2B1C2aSIJJ	Ks*   C	A4C 	C	D  D (.DD c                   K   t        d       d| _        | j                  j                  j	                          d{    | j
                  5  | j                  }ddd       r?	 |j                  t        j                  dj                         d             d{    yy7 g# 1 sw Y   MxY w7 # t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)	zh
        Callback when user takes over the mouse.

        UVS-H08: Thread-safe session access.
        z:
[MUTUAL AUTONOMY] User interference detected. Yielding...TNz`[SYSTEM] User has taken control of the mouse. Yield immediately and narrate your acknowledgment.
text/plainr3   	mime_typemediaz+Failed to send user activity notification: )rM   r   r   r   stop_all_actionsr   r   send_realtime_inputr   Blobencoder"   r   r   )r   r   r,   s      r-   r   z'GeminiLiveSession._handle_user_activity  s      	KL!$$//@@BBB  	$mmG	$ P11**  G  G  I". 2     	C	$ 	$
  PJ1#NOOPsc   :C"B$C"B&
C"%8B4 B2B4 "C"&B/+C"2B4 4	C=CC"CC"c                    ddl }t        t              j                  j                  j                  dz  dz  }d}| j                  j                         s| j                  r	 |j                         r7|j                         j                  }||kD  rt        |d      5 }t        j                  |      }ddd       dj                  d      |j                  d      |j                  d	d
       |j                          d}| j                  rX| j                  rL	 | j                  j!                  | j                  j"                  |       t$        j'                  d|d           d|j                  d       d|j                  d       }	t-        d|	j/                                 |}| j                  j1                  d       | j                  j                         s| j                  ryyyy# 1 sw Y   >xY w# t(        $ r"}t$        j+                  d|        Y d}~d}~ww xY w# t(        $ r}
t-        d|
        Y d}
~
d}
~
ww xY w)z
        Polls .tisktask/context.json for updates (Conductor Protocol).

        UVS-H23: Added stop flag check for proper thread lifecycle management.
        UVS-H24: Implements actual context injection via queue.
        r   Nz	.tisktaskzcontext.jsonr   conductor_contextcurrent_taskactive_pipelineprioritynormal)r$   r   r   r   	timestampzConductor context queued: z Failed to queue context update: z$
[CONDUCTOR UPDATE]: Current Focus: . Pipeline: zConductor Sync: zConductor Sync Error: r   )timer   r   r   r   is_setr   r   statst_mtimer   jsonloadr   r   r   r   r   r   r   r"   r    rM   r   wait)r   r   context_path
last_mtimemtimer(   r3   context_update	queue_errupdater,   s              r-   _monitor_conductor_contextz,GeminiLiveSession._monitor_conductor_context  s    	H~,,33::[H>Y
 ++224!4&&((--/88Ez)!,4 0#'99Q<D0
 %8,0HH^,D/3xx8I/J(,X(F)2*  ..499_ $		 > >$($7$7$B$B$2!" !'/I.YgJhIi-j k
 $IR`IaHbbnosowow  yJ  pK  oL  "M 00@AB%*
 %%**1-I ++22444
0 0* $- _ &1QR[Q\/] ^ ^_  4.qc2334s]   #=H-  G26A%H- AG? 'AH- 2G<7H- ?	H*H% H- %H**H- -	I6I		Ic           
        K   t        d       t        d       t        j                         | _        t	        j
                         | _        t	        j                         | _        t	        j                         | _	        ddl
}d| _        | j                  j                          |j                  | j                  dd      | _        | j                   j#                          t        d       d}d}ddl}t'        t(        j*                  j-                  d	d
            } |j$                         }| |j$                         |z
  }||kD  rt/        d| d      	 | j                  j1                         }|d   }	t        d|	        d|	v sd|	v sd|	v r|d   }|	j3                  d      d   j5                         }
d|	v rd}
t        d       t7        | j                  j9                               D ]Z  }	 | j                  j;                  |      }|d   dkD  r4|
|d   v r-d|d   vr&|	dd |d   dd v r|}t        d|d    d| d        n\ nt        d       |d   }d}|Pt        d        |jF                  d        | j                  jI                          t        j                         | _        ||t        d!|        |t        d"| d#       nt        d$       	 t        d%       d&a%| j                  jM                  t        jN                  d'd&d|tP        | jR                  (      | _*        t        d)       	 t        d/| d0       | j                  jM                  t        jN                  d'd&d|1      | _+        t        d2       | jT                  j[                         s| jT                  j]                          d| _        t        d7       t        d8       t        d9       t        d:       t        d;       	 ddl/}|ja                  d<d=       |ja                  d>d=       tf        r6	 ti        jj                         }|jm                  d@       |jo                          dBgtp        ts               dC}d}	 	 t        dD|d'z    d0       | jt                  jv                  jx                  j{                  t|        |E      4 d{   }t        dF       || _?        d| _        d}| j                  | j                  j                  j                  _D        | j                  j                  j                  j#                          d{    t	        j                  | j                               }t	        j                  | j                               }t	        j                  | j                               }|||h}	 t	        j                  |t        j                  G       d{   \  }}|D ]"  }|j                         s|j                          	 |D ]  }|j                          	 | d{     	 ddd      d{    dM| _        | j                  j                  j                  r7| j                  j                  j                  j                          d{    	 +# t<        t>        f$ r&}t@        jC                  d| d|        Y d}~d}~ww xY w# tD        $ r}t        d|        Y d}~d}~ww xY w# tD        $ r}t        d*|        	 t        d+       d,a%| j                  jM                  t        jN                  d'd,ddtP        | jR                  (      | _*        t        d-       n!# tD        $ r}t        d.|        |d}~ww xY wY d}~^d}~ww xY w# tD        $ r}t        d3|        	 t        d4       d,| _,        | j                  jM                  t        jN                  d'd,d|1      | _+        t        d5       n!# tD        $ r}t        d6|        |d}~ww xY wY d}~d}~ww xY w# tb        td        f$ r#}t@        jC                  d?|        Y d}~Bd}~ww xY w# td        t<        f$ r#}t@        jC                  dA|        Y d}~;d}~ww xY w7 7 d7 7 # t        j                  $ r Y w xY w# D ]7  }|j                          	 | d{  7    # t        j                  $ r Y 5w xY w w xY w7 # 1 d{  7  sw Y   xY w# tD        $ r}t        dH|        | j                  j                  j                  r7| j                  j                  j                  j                          d{  7   |d'z  }t        dIdJ|z        }t        dK| dL       t	        jF                  |       d{  7   Y d}~d}~ww xY w7 G# dM| _        | j                  j                  j                  r8| j                  j                  j                  j                          d{  7   w w xY ww)Nz Start the audio stream pipeline.z*
Loading .env from: E:\genesis-system\.envzEBoth GOOGLE_API_KEY and GEMINI_API_KEY are set. Using GOOGLE_API_KEY.r   NTGeminiConductor)targetdaemonrY   z.Scanning for Active Headset (Smart Pairing)...GENESIS_DEVICE_TIMEOUT60z)Audio device enumeration timed out after zQs. Please check your audio device settings or set GENESIS_DEVICE_TIMEOUT env var.rY   zDetected System Default: KMQuantumz
Hands-Freeindex(z-  > Valid Headset Detected. Pairing Output...maxOutputChannelsStereo
   z  Found Paired HFP OUT: z (Index )z"Device enumeration error at index r   z6  > Standard Mic Detected (Non-HFP). Using OS Default.zDevice Scan Error: z'Waiting for Headset... (Retrying in 3s)   zTargeting Input Index: zTargeting Output Index: z (HFP Speaker)zLWarning: Matching HFP Speaker not found. Using System Default (Stereo Risk).z&Attempting 16kHz Capture (HFP Mode)...r0   r   )formatchannelsrateinputinput_device_indexframes_per_bufferstream_callbackz!  [SUCCESS] 16kHz Capture Active.z  [FAIL] 16kHz: z)Attempting 44.1kHz Capture (A2DP Mode)...r/   z#  [SUCCESS] 44.1kHz Capture Active.z  [FAIL] 44.1kHz: zOpening Output Stream (Index z)...)r   r   r   outputoutput_device_indexz   [SUCCESS] 16kHz Output Active.z  [FAIL] 16kHz Output: z%Attempting 44.1kHz Output Fallback...z"  [SUCCESS] 44.1kHz Output Active.zOutput Stream Failed: z2==================================================z- GEMINI LIVE VOICE BRIDGE: ANTIGRAVITY SYNCEDz% Identity: Antigravity (Genesis Core)z. Status: LISTENING (Say 'Antigravity' to wake)z8==================================================      iX     i   zSystem beep unavailable: zSystem ReadyzTTS unavailable: AUDIO)response_modalitiessystem_instructiontoolsz#Connecting to Gemini Live (Attempt )modelconfigz$ [HEARTBEAT] Connection established.)return_whenz
Session Error:    r   zReconnecting in z seconds...F)QrM   r   r   r   r   get_running_loopr   Queuer   r   r   r   r   clearThreadr   r   startr   floatr   r   r   TimeoutErrorget_default_input_device_infor   r   rangeget_device_countget_device_info_by_indexOSErrorIOErrorr   r   r"   sleep	terminateAUDIO_SAMPLE_RATE_CAPTUREr   paInt16
CHUNK_SIZEr   r   r   AUDIO_SAMPLE_RATE_PLAYBACK	is_activestart_streamwinsoundBeepr!   RuntimeErrorTTS_AVAILABLEpyttsx3initsay
runAndWaitSYSTEM_INSTRUCTIONr{   r   aioliveconnectMODEL_IDr   _on_vision_framer   r   visionon_framecreate_task_send_audio_receive_responses_process_context_updatesr   FIRST_EXCEPTION	exceptioncancelCancelledError_initializedstopmin)r   r   input_indexoutput_indexr   DEVICE_WAIT_TIMEOUTdevice_start_timeelapsed
default_indefault_nametarget_name_partiinfor,   e2r  enginer   retry_countr   	send_taskreceive_taskcontext_taskpending_tasksdonependingtaskdelays                               r-   r  zGeminiLiveSession.start  s	     	=>UV__&
,,.	"==? &mmo 	!!'')!*!1!122" "2 "

 	$$& 	>?#BJJNN3KT$RS%DIIK!diik$55G,,"?@S?T Ue f %1!ZZEEG
)&1 1,@A<'9+DXdHd",W"5K'3'9'9#'>q'A'G'G'I$#|3+7(IK #4::#>#>#@A X
X#'::#F#Fq#ID#$781<#3tF|#CX\]cXdHd(4Sb(9T&\#2=N(N78(-0HfV^_`^aab.c(d(-X RS",W"5K#'L
 "?@

1

$$&$__.
i !l ",[M:;#-l^>JKab 	:;(-% $

#.", $ 4 4 !0 !D 56,	1,tDE!%$0 "1 "D 45&   **,**, 	f=>56>? 	:MM#s#MM#s# 6 

>*!!#
 %,9"4&(
 4J;K!O;LDQR;;??//77"! 8  $% $% @A#*DL&*DO"#K IMH]H]D**55<<E00;;BBHHJJJ !( 3 3D4D4D4F GI#*#6#6t7N7N7P#QL#*#6#6t7T7T7V#WL%.l$KM%.5ll)(/(?(?/ )g
 %) 7D#~~/&*nn&6 67
 %, %D KKM%&*

%?$% $%` #())44AA00;;BBGGIIIk  !(1 X"LL+MaSPRSTRU)VWWX  1+A3/001@  	$QC()AB,1)$(JJOO"??'+&0$($8$8 %4 %! ;< +B401 =	>  	,QC01=>27/%)ZZ__"??(4 &5 &" :; /t45 <	H \* 	:LL4QC899	: !'* 604556$% K) !+#*#9#9 % $%	 %, %D KKM%&*

#*#9#9 % $%	%?$% $% $% $%L  +)!-.))44AA00;;BBGGIIIq B[ 01({;<mmE***+ J #())44AA00;;BBGGIII Bs  EiB[ 0AZ![ Ai2-i A[> <A^! 	A2i<(`9 $i+5a.  i7Ad# b#d# A<db&A2d6(c	b)c	<c	d$b/)b,*b/.d1d# <d
=d# Aig i![0[[ [[ 	[;"[60i6[;;i>	^^A]21^2	^;^^^i^i!	`6*`19A`
	`1
	`(`##`((`1+i1`66i9a+a& i&a++i.b =bib  i#d# &d)c	,b//cdcd	d c,%c(&c,+d,d?dddd
d# d dd d# #	g,AgfA gggg# gg#  i#Ai<h?=iic                   K   g }d| _         t        | d      r| j                  j                          t        | d      ri| j                  r]	 | j                  j                  d       | j                  j                         r&t        j                  d       |j                  d       | j                  j                  j                  r7	 | j                  j                  j                  j                          d
{    | j                   r5	 | j                   j#                          | j                   j%                          | j*                  r5	 | j*                  j#                          | j*                  j%                          | j,                  r	 | j,                  j/                          |r#t        j3                  dt5        |       d       y
t        j3                  d       y
# t        $ r7}|j                  d|        t        j                  d	|        Y d
}~vd
}~ww xY w7 ,# t        $ r7}|j                  d|        t        j                  d|        Y d
}~ed
}~ww xY w# t&        t(        f$ r7}|j                  d|        t        j                  d|        Y d
}~md
}~ww xY w# t&        t(        f$ r7}|j                  d|        t        j                  d|        Y d
}~ud
}~ww xY w# t&        t0        f$ r7}|j                  d|        t        j                  d|        Y d
}~d
}~ww xY ww)z
        Unified cleanup for streams, workers, and audio.

        UVS-H11: Typed exceptions with logging, UVS-H23: Conductor thread cleanup,
        UVS-H30: Cleanup error aggregation.
        Fr   r   g      @timeoutz%Conductor thread did not stop in timez%conductor: timeout waiting for threadzconductor: z Conductor thread cleanup error: Nzvision: zVision cleanup error: zinput_stream: zInput stream cleanup error: zoutput_stream: zOutput stream cleanup error: zaudio: zAudio cleanup error: zSession closed with z cleanup errorszSession closed cleanly)r   r   r   setr   joinis_aliver   r    appendr"   r   r   r-  r#  r.  r   stop_streamcloser  r  r   r   r  r  r9  len)r   cleanup_errorsr,   s      r-   _cleanupzGeminiLiveSession._cleanup  s      4/0%%))+4,-$2H2HG&&++C+8))224NN#JK"))*QR
 !!,,99=,,77>>CCEEE
 C!!--/!!'')
 D""..0""((*
 ::<

$$&
 KK.s>/B.C?STKK01K  G%%A3&78!A!EFFG F =%%n5!7s;<<= W% C%%qc&:;!=aSABBC W% D%%s&;<!>qcBCCD \* <%%sm4!6qc:;;<s   AMAG" ' M1H( 9H%:H( >M4I+ ?M4J4  MK= ';M"	H"+,HMH""M%H( (	I(1,I#M#I((M+J1:,J,&M,J11M4K:,K5/M5K::M=M,L>8M>MMc                   K   	 ddl }	 |j                  dd      }|j                  d       |j                  d       |j	                  t
               d}t        }t        d       | j                  rZ	 | j                  j                          d{   }t!        j                          | j"                  z
  d	k  rUt        |k7  r(t        j                  d
| dt         d       d}t        }t        t
        k7  r%t%        j&                  |ddt        t
        |      \  }}t%        j(                  |dd      }|r|j+                  |       t%        j,                  |d      }|dkD  r#dt/        |dz        z  }t        d|ddd       | j0                  j3                  t5        j6                  |d             d{    | j                  rZ|r|jC                          yy# t        t        |j                  f$ r%}t        j                  d|        d}Y d}~d}~ww xY w7 7 k# t8        $ rr}t;        |      j=                         }	d|	v sd|	v sd|	v rt        d|        d| _        |t        d|        t?        j@                  d       d{  7   Y d}~d}~ww xY w# t8        $ r}t        d |        Y d}~yd}~ww xY ww)!zSend audio from queue.r   Nzdebug_input.wavwbr   r   zDebug audio file unavailable: z+Audio Input Loop Started (Callback Mode)...g?zAudio rate changed: z -> z, resetting resample stateg       @d   r   r   zMic Level: z<20 T)endflushz	audio/pcmr   r   1011deadlineclosedz%Fatal Connection Error in Send Loop: FzError reading/sending audio: g?zSend audio loop error: )"waver   setnchannelssetsampwidthsetframerateAUDIO_SAMPLE_RATE_SENDr  r  Errorr   r   r  rM   r   r   r   r   r   r   ratecvmulwriteframesr   intr   r   r   r   r"   strrA   r   r  rM  )
r   rZ  
debug_filer,   resample_statelast_capture_rater3   r   barserr_strs
             r-   r&  zGeminiLiveSession._send_audioF  s    C	1"!YY'8$?
''*''*''(>? "N 9?@//*-!%!1!1!5!5!77D yy{T%9%99C?  14EE';<M;NdSlRm  nH  &I  J)-,E) 14JJ/6~~dAqJce{  ~L  0M,n #;;tQ4D ":#9#9$#? "++dA.CSy"S#)%55d3Z8bM,,::#jjdkJ ;   ? //Z :++-zq Wdjj1 "=aSAB!
" 88 ! 	-!!fllnG(J',AXQXEX!FqcJK+0 9!=>!--,,,	-  	1+A3/00	1s   K	J% A	G   J% 3H' H"(H' 9J% :C?H' 9H%:H' >J% J% K	 H:HJ% HJ% "H' %H' '	J"0A"JJJJ% J""J% %	K.K<K	KK	c           	        K   | j                   r	 	 t        j                  | j                  j	                         d       d{   }| j                  5  | j                  }| j                  }ddd       rrd|j	                  dd       d|j	                  dd       d	|j	                  d
d       d}	 |j                  t        j                  |j                  d      d             d{    t        j                  d|j	                  d              | j                   ryy7 # t        j
                  $ r Y Aw xY w# 1 sw Y   xY w7 c# t        $ r"}t        j!                  d|        Y d}~`d}~ww xY w# t        $ r@}t        j                  d|        t        j"                  d       d{  7   Y d}~d}~ww xY ww)z
        Process conductor context updates and inject into session.

        UVS-H24: Implements actual context injection via session.send_realtime_input.
        g      ?rF  Nz&[SYSTEM CONTEXT UPDATE] Current Task: r   Noner   r   z. Priority: r   r   .zutf-8r   r   r   zContext injected: zFailed to inject context: zContext processor error: g      ?)r   r   wait_forr   r   r  r   r   r   r   r   r   r   r   r   r"   r    r  )r   contextr   runningmessagesend_errr,   s          r-   r(  z*GeminiLiveSession._process_context_updates  s     oo#)$+$4$4++//1 #% G %% /"mmG"..G/ w))0^V)L(M N%%,[[1BF%K$L M%%,[[X%F$GqJ 	P%99"'**%,^^G%<*6# :    '9'++n:U9V%WX? oo ++ / / % P)CH:'NOOP )8<=mmC((()s   G2D. D,D. 	F E.AF 79E 0E1+E G*G,D. .EF GEF EF E 	FE<7F <FF 	G0G=G >GGGGframe_bytesc                   K   | j                   5  | j                  }| j                  }ddd       r4r1	 |j                  t	        j
                  |d             d{    yyy# 1 sw Y   @xY w7 # t        $ ru}t        |      j                         }d|v sd|v sd|v rF| j                   5  d| _        ddd       n# 1 sw Y   nxY wt        j                  d|        Y d}~yY d}~yd}~ww xY ww)	z~
        Callback for VisionWorker frames.

        UVS-H17: Atomic session access pattern to handle race conditions.
        Nz
image/jpegr   r   rW  rY  disconnectedz*Session disconnected during vision frame: )r   r   r   r   r   r   r"   rd  rA   r   r    )r   rr  r   ro  r,   ri  s         r-   r"  z"GeminiLiveSession._on_vision_frame  s       	'mmG&&G	' w
U11**+N 2    7		' 	'  Ua&,,.W$G(;~QX?X)) -(,- - -NN%OPQs#STT @YUsn   C6A'C6*A5 A3 A5 $C6'A0,C63A5 5	C3>1C./C 7	C. C		C.$
C6.C33C6c           
        K   d}| j                   r	 | j                  j                         2 3 d{   }|j                  rt	        d|j                          	 |j
                  s;|j
                  j                  r]| j                  rd| _        t	        d       |j
                  j                  j                  D ]  }|j                  r	 |j                  j                  }t        j                  |ddt        d|      \  }}d}t        d	t        |      |      D ]L  }| j                  r n>||||z    }t!        j                          | _        | j$                  j'                  |       N t!        j                          | _        |j*                  rt	        d|j*                          |j,                  s| j/                  |j,                         d{     |j
                  j0                  sǐyy7 # t(        $ r}t	        d
|        Y d}~d}~ww xY w7 J6 n8# t(        $ r,}t	        d|        t3        j4                          Y d}~yd}~ww xY w| j                   rWtw)zReceive audio and tool calls.NzTool Call Received: Fz  [VAD] New Turn - Unmuted Outputr   r   r0   i  r   zResample/Playback Error: z	[Gemini] zReceive Error: )r   r   receive	tool_callrM   server_content
model_turnr   partsinline_datar3   r   r`  AUDIO_SAMPLE_RATE_RECEIVEr  rN  r   r   r   writer"   textfunction_call_handle_function_callturn_complete	traceback	print_exc)	r   output_resample_stateresponsepartr3   SUB_BUFFER_SIZEr8  chunkr,   s	            r-   r'  z$GeminiLiveSession._receive_responses  sG     $oo9&*ll&:&:&< 3! 3!()) 4X5G5G4HIJ ..
 $22== $ 2 26;!3!&'I!J)1)@)@)K)K)Q)Q Y#'#3#3%O/3/?/?/D/DFMnnUY[\^_az  }B  DY  GZ(C.C ;>16q#d)_1U )LA/3/A/A05481_;L4MECG99;D,@,0,>,>,D,DU,K)L @Dyy{(< $(99$)Idii[*A$B $(#5#5*.*D*DTEWEW*X$X$X9Y> $22@@ k 3!N ,5 %O(-0I!.M(N(N%O %Y_ '=j  s+,##%o oos   I*H# H!G8H!2H# (A%H# B7G;0H# 6H# HH# 4H# 6I*8H!;	HHH# HH# !H# "I*#	I,"II*II*c           
      D  K   g }t        |d      r|j                  n|gD ]0  }|j                  }|j                  }i }|dk(  r:| j                  j                  dt        |j                  d             d{   }n|dk(  r:| j                  j                  dt        |j                  d             d{   }nd|dk(  r|j                  dd	      |j                  d
d      }g d}|sEt        fd|D              r1t        d        t        d       d| _        ||d| _        ddd}nd| _        | j                  j                          d{    | j                  j                         d{   }n|dk(  rk| j                  j                          d{    | j                  j!                  |j                  d      |j                  d             d{    ddd}n2|dk(  r| j                  j                          d{    | j                  j#                  |j                  d      |j                  d      |j                  dd      |j                  dd             d{    ddd}n|dk(  r| j                  j                          d{    d d!lm}	m}
 	  |	|j                  d"d	            }t+        j,                  |      }| j                  j.                  j1                  d#| d$       d{    ddd%}n|d*k(  r| j                  j                          d{    d d!lm}	m}
 d d+lm}m} 	 |j                  d,d	      } ||g d-d.        |	|j                  d"d	            }t+        j,                  |      }t+        j,                  |      }| j                  j.                  j1                  d/| d0| d$       d{    ddd1}n8|d4k(  r)| j                  j=                          d{    ddd5}n
|d6k(  r)| j                  j?                          d{    ddd7}n|d8k(  r/|j                  d9d:      }t        d;|        d| _         d|d<d=}n|jC                  d>      r|jE                  d>d	      }tG        jH                  |      |j                  d
d      }rKt        d?      rtK        tM        d?d            s#t2        j5                  d@| dA       d'dB| dCi}nt        dD      s"t2        j5                  d@| dE       d'dB| dFi}ng dG}t        fdH|D              }|s+|r)t        dI|        d| _        ||d| _        ddJ| dKd}nd| _        | j                  j                          d{    	  jN                  | j                  j.                  fi | d{   }tQ        |tR              s)t2        j5                  dL| dMtU        |              d|dN}nd'dS| i}nd'dT| i}|j]                  t_        j`                  ||jb                  |U             3 t        dV       | jd                  jg                  t_        jh                  |W      X       d{    y7 "7 7 J7 *7 7 7 7 97 7 # |
$ r*}t2        j5                  d&|        d'd(| d)}Y d}~d}~ww xY w7 7 # |
|f$ r*}t2        j5                  d2|        d'd3| d)}Y d}~d}~ww xY w7 7 7 7 Y# tV        $ r-}t2        jY                  dL| dO|        d'dP| i}Y d}~?d}~wtZ        $ r-}t2        jY                  dL| dQ|        d'dR| i}Y d}~sd}~ww xY w7 	w)Yz#Execute local tools (Non-Blocking).function_callsrR   Nr7   r[   rQ   r^   r`   rT  ra   F)savedeletecommitbuybillingpublishcreatec              3   B   K   | ]  }|j                         v   y wr   )rA   ).0kwr`   s     r-   	<genexpr>z:GeminiLiveSession._handle_function_call.<locals>.<genexpr>&  s     (`r{/@/@/B)B(`s   z&[HANDOVER] Sensitive action detected: z. [PROTOCOL] Pausing for verbal verification...T)rY   argspausedz`This action involves sensitive modifications. Please verbally say 'YES' or 'CONFIRM' to proceed.)r&   r]   rb   rd   re   success)r&   cursor_movedrf   rg   i  rh   )r&   zoom_activeri   r   )sanitize_selectorSelectorValidationErrorrj   zwindow.anchorGenesisCursor(r   )r&   anchoredz+[SECURITY] Blocked unsafe anchor selector: r#   zInvalid selector: )r&   rp  rk   )validate_enumValidationErrorr$   rl   gesture_typezwindow.gestureGenesisCursor(z, )r&   gesture_activez([SECURITY] Blocked unsafe gesture args: zInvalid input: rq   )r&   zoom_clearedrr   )r&   visual_reset_completer\   r]   zStrategic checkpoint.z[MENTORSHIP] Pausing: zIThe agent is now listening for your questions. Say 'Continue' when ready.)r&   r]   r`   ghl_executez[SECURITY] GHL skill 'z' missing execute() methodzInvalid skill interface: z has no execute() methodrV   z' missing description attributez has no description)r  r  r   modifyr  r  c              3   V   K   | ]   }|j                   j                         v  " y wr   )rV   rA   )r  r  skills     r-   r  z:GeminiLiveSession._handle_function_call.<locals>.<genexpr>r  s%     *hr21B1B1H1H1J+J*hs   &)z)[HANDOVER] Sensitive GHL skill detected: zExecuting 'z0' requires founder confirmation. Please confirm.zGHL skill 'z' returned non-dict: )r&   r3   z' signature error: zSkill interface error: z' execution error: zSkill execution failed: zGHL Skill not found: zUnknown tool: )rY   idr  z[Tool] Sending response...)function_responses)r   )5r   r  rY   r  r   run_in_executorrR   r   r[   anyrM   r   r   r   
initializeauto_executerb   set_zoom core.security.selector_sanitizerr  r  r   dumpsr   evaluater   r    core.security.input_validatorr  r  rq   rr   r   r   replacerv   	get_skillcallablegetattrr  
isinstancedictr$   	TypeErrorr#   r"   rK  r   FunctionResponser  r   sendLiveClientToolResponse)r   callr  fcrY   r  rL   ra   sensitive_keywordsr  r  rj   safe_selectorr,   r  r  r  	safe_typer]   
skill_nameis_sensitiveteexec_errr`   r  s                          @@r-   r  z'GeminiLiveSession._handle_function_call  s    )07G)H$%%tf 	B77D77DF&#yy88}dhhW^N_``++#yy88?OQUQYQYZ_Q`aa&"hh}b9 HH[%8	%h" S(`M_(`%`B;-PQJK-1D*37*FD'(0  =_  `F .3D*00;;===#'#9#9#F#F{#SSF&,,77999,,88#QTVVV$-tD(,,77999,,55dhhsmTXXc]TXT\T\]dfiTjlpltltu}  @C  mD  E  E  E$-dC)),,77999gV0*b1IJH$(JJx$8M00;;DDGbcpbqqrEsttt(1tDF )),,77999gX
S#'88FB#7L!,0PR`a0*b1IJH $

< 8I$(JJx$8M00;;DDGcdmcnnpq~p  @A  FB  C  C  C(1TJF %,,77999$-tD',,99;;;$-M55(,CD.vh78%)"$,  P[  \( "\\&"5
$..z: HH[%8	"5)4HWUT]_cEd<e)?
|Ke'fg")-FzlRj+k!l$UM:)?
|Kj'kl")-FzlRe+f!g .i*'**hUg*h'h(\!$Mj\"Z[59D2;?2ND/08kR\Q]  ^N  EO  &PF5:D2"&"8"8"C"C"EEEZ/<u}}T=S=S=^=^/gbf/g)g'1&$'?$*NN[Labfgmbnao3p$q8A6-RF &)>zl'KLF!^D6#:;%%&&uu#s	D 	*,ll..#5   
 	
 	
y a b  >S9V : E : u. VNN%PQRPS#TU(/>PQRPS<TUFV : C/A SNN%MaS#QR(/oaS<QRFS : <D F)g
 $- S &{:,FYZ\Y]-^ _*15LRD3Q)R#, Z &{:,FYZbYc-d e*15MhZ3X)YZ$	
s  A4^ 8Z9>^ 7Z8B^ Z "^ 9Z#:(^ "Z&#A^ $Z)%-^ Z,A#^ 6Z/7-^ $Z2%^ 2AZ8Z5	Z8$^ 9[*:^ B[0[-	[0($^ \$-^ :\';E)^ $\*%^ **\0\-=\0B^ ^^ ^  ^ #^ &^ )^ ,^ /^ 2^ 5Z88['= ["^ "[''^ -[00\!7 \^ \!!^ '^ *^ -\00	^9"]!^ !^-"^^ ^^ N)r%   
__module____qualname____doc__r   propertyr   setterr   r   r   r   r   r  rP  r&  r(  bytesr"  r'  r   rJ   r-   r}   r}   _  s    !#H $ $ % % ! ! ^^" "
 M*BP40.dzJx82tE1N*)XU% U2=~K
rJ   r}   __main__win32z
Exiting...r   )9r  r   r   r   r   r  
webbrowserr   pathlibr   loggingr   rN   	getLoggerr%   r   skills.auto_browse_skillr   core.skills.ghl_baser   rv   skills.ghl.extract_api_keyskillsskills.ghl.create_subaccountr   r!   rM   r   googler   google.genair   r  r  r.   r!  r  r^  r|  r  r  rP   rE   rC   rd  rI   rR   ru   r{   r}   platformset_event_loop_policyWindowsSelectorEventLoopPolicyr   runr  KeyboardInterruptr  rJ   r-   <module>r     s     	 
       			8	$ 4 9 ! #
"
DM
<G@ # "  ! 
 , M  J (S ( ( (V> >6 	 '?$(CV!W# ")	
 +L$ATU# "'
 5  ^$ 8  EU  #V# "*

 &  y$08  J\  (].7  IW  &X# "/ &  M$&/@YZ&/@YZ# "%c
 (  K$&/@ij&/@ij*3Dk!l+4Em"n	# "%c
	 )  a$"XFq$r# ",
 )~$)1;[l~ -5Fq$r# "( 4 %X'/rB '  b'/rBIi"
km	^}
 }
@ z<<7")G))*P'*P*P*RS#%GMMO$ w#  	
BCCHHQK  	
LMCHHQK  DM	
BCDj#  nsI   F1 G *G= AH 1GGG:9G:=HHH#"H#