
    `gjA                    v   d 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
mZ ddlmZ ddlmZ dd	Zdd
ZddZddZddZddZddd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd dZddZd!dZddZedk(  rD ej:                  d      Z ee       ej?                         Z  ejB                   ee              yy)"u  CLI commands for the google_meet plugin.

Wires ``hermes meet <subcommand>``:
  setup       — preflight playwright, chromium, auth file, print fixes
  auth        — open a browser to sign into Google, save storage state
  join <url>  — join a Meet URL synchronously (also callable from the agent)
  status      — print current bot state
  transcript  — print the transcript
  stop        — leave the current meeting
    )annotationsN)Path)Optional)get_hermes_home)process_manager)_is_safe_meet_urlc                 :    t        t                     dz  dz  dz  S )N	workspacemeetingsz	auth.json)r   r        J/root/.hermes/venv/lib/python3.12/site-packages/plugins/google_meet/cli.py_auth_state_pathr      s    !"[0:=KKr   c                  	 | j                  d      }|j                  dd       |j                  dd      }|j                  dd	d
       |j                  ddd	d       |j                  dd       |j                  dd      }|j                  dd       |j                  dd       |j                  ddd       |j                  dd	d       |j                  ddd d!"       |j                  d#dd$       |j                  d%d&       |j                  d'd(      }|j                  d)t        d*       |j                  d+d,      }|j                  d-d.       |j                  d#d       |j                  d/d0       |j                  d1d2      }	 d3d4lm}  ||       | j                  t        6       y# t        $ r!		fd5}|j                  |6       Y d		<d		ww xY w)7zpBuild the ``hermes meet`` argparse tree.

    Called by :func:`_register_cli_commands` at plugin load time.
    meet_command)destsetupz%Preflight: playwright, chromium, auth)helpinstallz@Install prerequisites (pip deps, Chromium, platform audio tools)z
--realtime
store_truezAlso install realtime audio tools (pulseaudio-utils on Linux, BlackHole+ffmpeg on macOS). Uses sudo/brew, prompts before invoking either.)actionr   z--yes-yzXAnswer yes to all prompts (use with care; will run sudo apt-get or brew without asking).authz(Sign in to Google and save session statejoinzJoin a Meet URLurlzhttps://meet.google.com/...z--guest-namezHermes Agent)defaultz
--durationNze.g. 30m, 2h, 90s)r   r   z--headedzshow browserz--mode)
transcriberealtimer   zItranscribe (default, listen-only) or realtime (speak via OpenAI Realtime))choicesr   r   z--nodez;remote node name, or 'auto' to use the sole registered nodestatuszPrint current Meet bot state
transcriptzPrint the scraped transcriptz--last)typer   sayz(Speak text in an active realtime meetingtextzwhat to saystopzLeave the current meetingnodezCManage remote meet node hosts (run/list/approve/remove/status/ping)r   )register_clic                $    t        d d       y)Nz&hermes meet node: module unavailable ()   )print)argses    r   _node_unavailablez'register_cli.<locals>._node_unavailable_   s    :1#Q?@r   )func)	add_subparsers
add_parseradd_argumentintplugins.google_meet.node.clir'   	Exceptionset_defaultsr   )
	subparsersubsinst_pjoin_ptr_psay_pnode_p_register_node_clir.   r-   s
            @r   r'   r'   "   s%   
 ###8DOOG"IOJ__O  F \ Y   lg  
 	OOF!KOL__V*;_<F
$AB
?
d9LM

<nM
4lX   $J  
 	OOH#AOB??<.L?MDhS$7OOE(ROSE	vM2	x.OOF!<O= __R  F
4S6" -  4	 	!2334s   G 	G-G((G-c                   t        | dd       }|st        d       y|dk(  r
t               S |dk(  r5t        t	        t        | dd            t	        t        | dd            	      S |d
k(  r
t               S |dk(  rOt        | j                  | j                  | j                  | j                  t        | dd      t        | dd             S |dk(  r
t               S |dk(  rt        | j                        S |dk(  r"t        | j                  t        | dd             S |dk(  r
t!               S |dk(  r+t        | dd       }||t"        u rt        d       y ||       S t        d|        y)Nr   zDusage: hermes meet {setup,auth,join,status,transcript,say,stop,node}   r   r   r   Fyes)r   
assume_yesr   r   moder   r&   )r   
guest_namedurationheadedrC   r&   r    r!   lastr#   )r$   r&   r%   r/   z=usage: hermes meet node {run,list,approve,remove,status,ping}zunknown subcommand: )getattrr+   
_cmd_setup_cmd_installbool	_cmd_auth	_cmd_joinr   rD   rE   rF   _cmd_status_cmd_transcriptrH   _cmd_sayr$   	_cmd_stopr   )r,   subfns      r   r   r   k   sa   
$
-CTU
g~|
i'$
E:;GD%78
 	
 f}{
f}]];;v|4vt,
 	
 h}
lDII..
e|TYYWT64-HII
f}{
f} T64(:|+QR$x	 
&'r   c                    dd l } t        d       t        d       | j                         }|dv }t        d| d|rdnd d	       	 dd l}d
}d}t        d|        d}d}|rT	 ddlm}  |       5 }		 |	j                  j                  }
|
r"t        |
      j                         r	d
}d|
 d}nd}d d d        t        d|        t               }|j                         }t        d|rd| dndz          t                |xr |xr |}|rt        d       nt        d       |rdS dS # t        $ r d}d}Y w xY w# t        $ r}d| }Y d }~d }~ww xY w# 1 sw Y   xY w# t        $ r}d| }Y d }~d }~ww xY w)Nr   zgoogle_meet preflightz--------------------->   LinuxDarwinz  platform       : z  [okunsupported]T	installedFu-   NOT installed — run: pip install playwrightz  playwright     : unknownsync_playwrightzok (r)   u<   not installed — run: python -m playwright install chromiumzprobe failed: z  chromium       : z  google auth    : u#   not saved — run: hermes meet authzMready. Join a meeting:  hermes meet join https://meet.google.com/abc-defg-hiju&   not ready yet — fix the items above.r*   )platformr+   system
playwrightImportErrorplaywright.sync_apir^   chromiumexecutable_pathr   existsr5   r   is_file)_pr`   	system_okra   pw_okpw_msgchromium_okchromium_msgr^   pexer-   	auth_pathauth_okall_oks                  r   rJ   rJ      s   	
!"	
!"YY[F--I	xs94-*PPQ
RSA 
x
()KL	0; " 8a8**44CtCy//1&*)-cU!}D %8 
~
./ "I!G	")T)A/T	V
 
G050[FD	

 	671AW  A@A* ! 8%3A3#7L88 8  	0+A3/L	0sf   D' #E! 0E2<D:.E! 'D76D7:	EEEEEEE! !	E9*E44E9c                R   ddl }ddl}ddl}|j                         }|dvrt	        d| d       yd8fd}t	        d       t	        d	       d
dg}t	        ddj                  |              	 ddlm}  |dg|d      }	|	j                  dk7  rt	        d       y	 t	        d       	 |j                  t        j                  dd
ddgd      }	|	j                  dk7  rt	        d       | rt	        d       |dk(  r|j                  d      r|j                  d      rt	        d       n |d       st	        d!       ng d"}t	        d#dj                  |              |j                  |d      }	|	j                  dk7  r?t	        d$       n2|d%k(  r,d}	 |j                  d&d'gd()      }d*|v }t        |j                  d+            }g }|s|j!                  d,       |s|j!                  d+       |st	        d-       n|j                  d.      s!t	        d/d0j                  |      z   d1z          nw |d2dj                  |       d3      st	        d!       nPd.dg|}t	        d#dj                  |              |j                  |d      }	|	j                  dk7  rt	        d4       t	        d5       nt	        d6       t	        d7       y# t        $ r}
t	        d|
        Y d}
~
yd}
~
ww xY w# t        $ r}
t	        d|
        Y d}
~
yd}
~
ww xY w# t        $ r Y pw xY w)9a  Install the plugin's prerequisites.

    Always: pip install playwright + websockets, then
    ``python -m playwright install chromium``.

    With ``--realtime``: also install the platform audio bridge deps.
      Linux : ``sudo apt-get install -y pulseaudio-utils``
      macOS : ``brew install blackhole-2ch ffmpeg``  (+ remind the user
              to select BlackHole as the default input device manually)

    Prompts before every package-manager invocation unless ``--yes``.
    Refuses to run on Windows.
    r   N>   rV   rW   zgoogle_meet install: z$ is not supported (linux/macos only)r*   c                    ry	 t        |  d      j                         j                         }|dv S # t        $ r Y yw xY w)NTz [y/N] F>   yrA   )inputstriplowerEOFError)promptansrB   s     r   _confirmz_cmd_install.<locals>._confirm   sR    	6('*+11399;C l""  		s   *4 	A A zgoogle_meet installz-------------------ra   
websocketsz
[1/3] pip install:  )_pip_installz	--upgradeF)capture_outputz  pip install failedz  pip install failed: z,
[2/3] python -m playwright install chromiumz-mr   rd   )checkz6  playwright install failed (may already be installed)z  playwright install failed: z
[3/3] realtime audio depsrV   paplaypactlz%  pulseaudio-utils already installed.zP  install pulseaudio-utils? this runs `sudo apt-get install -y pulseaudio-utils`z)  skipped (you can run it manually later))sudozapt-getr   r   zpulseaudio-utilsz  $ u:     apt install failed — install pulseaudio-utils manuallyrW   system_profilerSPAudioDataTypeT)r$   	BlackHoleffmpegzblackhole-2chz)  BlackHole and ffmpeg already installed.brewz  missing: z, zM
  install Homebrew first (https://brew.sh) or install the packages manually.z  install via brew: ?u/     brew install failed — install them manuallyu   
  NOTE: macOS does not auto-route audio. Open
    System Settings → Sound → Input
  and select 'BlackHole 2ch' before starting a realtime meeting.
  hermes will not switch your default input for you.z=
[3/3] skipped (pass --realtime to install audio tooling too)z%
done. verify with: hermes meet setup)rz   strreturnrL   )r_   shutil
subprocessr`   r+   r   hermes_cli.tools_configr   
returncoder5   runsys
executablewhichcheck_outputrL   append)r   rB   rh   _shutil_spr`   r|   pip_pkgsr   resr-   cmdhave_bhouthave_ffmpegneedss    `              r   rK   rK      s1    YY[F((%fX-QRS# 

 	
  l+H	!#((8"4!5
67	8K3(3EJ>>Q()  

9:	gg^^T<JG  
 >>QJK +,W}}X&7==+A=>f EFRCD#01''#U'3C~~*Z[xG&&(9;L'MTX&Y%, w}}X67KE_-X&AB]]6*!DIIe$44 8c c
  "6sxx6Gq IJEF!95u5CD#01''#U'3C~~*OPG 	NO	
23S  &qc*+  -aS124  sC   0-K +A K5 L 	K2K--K25	L>LL	L&%L&c                    	 ddl m}  t	               }|j
                  j                  dd       t        d       t        d|        	  |        5 }|j                  j                  d	
      }|j                         }|j                         }|j                  dd       	 t        d       |j                  t        |             |j!                          ddd       t        d       y# t        $ r t        d       Y yw xY w# t        $ r Y dw xY w# 1 sw Y   >xY w# t"        $ r}t        d|        Y d}~yd}~ww xY w)zAOpen a headed Chromium, let the user sign in, save storage_state.r   r]   zcplaywright is not installed. run:
  pip install playwright && python -m playwright install chromiumr*   T)parentsexist_okuI   opening Chromium — sign in to Google, then return here and press Enter.zsaving storage state to: F)headlesszhttps://accounts.google.com/domcontentloaded)
wait_untilz'press Enter after you've signed in ... )pathNzauth failed: z.saved. you can now run: hermes meet join <url>)rc   r^   rb   r+   r   parentmkdirrd   launchnew_contextnew_pagegotorv   ry   storage_stater   closer5   )r^   r   pwbrowsercontextpager-   s          r   rM   rM   O  sA   7 DKKdT2	
UV	%dV
,- 
	"kk((%(8G))+G##%DII4ASIT?@ !!s4y!1MMO
	 

:;9  P	
 (  
	 
	  aS!"sf   C+ 	D  AD!D,+DD  +DD	DDDDDD   	E)D<<Er   )rC   r&   c          	        t        |       st        d|         y|r	 ddlm} ddlm}  |       }	|	j                  |dk7  r|nd       }
|
t        d	|       y ||
d
   |
d         }	 |j                  | ||||      }t        t        j                  d|
j                  d      i|d             |j                  d      rdS dS t               }t        j                  | ||||j!                         rt#        |      nd |      }t        t        j                  |d             |j                  d      rdS dS # t        $ r}t        d|        Y d }~yd }~ww xY w# t        $ r}t        d|        Y d }~yd }~ww xY w)Nz%refusing: not a meet.google.com URL: r@   r   NodeRegistry
NodeClientnode module unavailable: r*   autono registered node matches r   tokenr   r   )r   rD   rE   rF   rC   zremote start_bot failed: r&   nameindentrX   )r   rF   rD   rE   
auth_staterC   )r   r+   !plugins.google_meet.node.registryr   plugins.google_meet.node.clientr   rb   resolve	start_botr5   jsondumpsgetr   pmstartrg   r   )r   rD   rE   rF   rC   r&   r   r   r-   regentryclientr   r   s                 r   rN   rN   r  s    S!5cU;<	FB nDFND==/x89eE'NC	""JD # C 	djj&%))F"3;s;AFGGGDMq(q(D
(( $3t9DC 
$**S
#$1$1$=  	-aS12	  	-aS12	s/   D> +E" >	EEE"	F+E>>Fc                   | xs dj                         st        d       y|r	 ddlm} ddlm}  |       }|j                  |d	k7  r|nd       }|t        d
|       y ||d   |d         }	 |j                  |       }t        t        j                  d|j                  d      i|d             |j                  d      rdS dS t        j                  |       }t        t        j                  |d             |j                  d      rdS dS # t        $ r}t        d|        Y d }~yd }~ww xY w# t        $ r}t        d|        Y d }~yd }~ww xY w)N zrefusing: empty textr@   r   r   r   r   r*   r   r   r   r   r   zremote say failed: r&   r   r   rX   )rw   r+   r   r   r   r   rb   r   r#   r5   r   r   r   r   enqueue_say)	r$   r&   r   r   r-   r   r   r   r   s	            r   rQ   rQ     sF   JB$%	FB nDFND==/x89eE'NC	**T"C 	djj&%))F"3;s;AFGGGDMq(q(
..
C	$**S
#$1$1$'  	-aS12	  	's+,	s/   D 1D8 	D5D00D58	EEEc                     t        j                         } t        t        j                  | d             | j                  d      rdS dS )Nr@   r   rX   r   r*   )r   r    r+   r   r   r   r   s    r   rO   rO     s5    
))+C	$**S
#$1$1$r   c                    t        j                  |       }|j                  d      s!t        t	        j
                  |d             y|j                  dg       D ]  }t        |        y)NrG   rX   r@   r   r*   linesr   )r   r!   r   r+   r   r   )rH   r   lns      r   rP   rP     sU    
--T
"C774=djjQ'(gggr" b	r   c                     t        j                  d      } t        t        j                  | d             | j                  d      rdS dS )Nzhermes meet stop)reasonr@   r   rX   r   r*   )r   r%   r+   r   r   r   r   s    r   rR   rR     s9    
''+
,C	$**S
#$1$1$r   __main__zhermes meet)prog)r   r   )r7   zargparse.ArgumentParserr   None)r,   zargparse.Namespacer   r3   )r   r3   )r   rL   rB   rL   r   r3   )r   r   rD   r   rE   Optional[str]rF   rL   rC   r   r&   r   r   r3   )N)r$   r   r&   r   r   r3   )rH   zOptional[int]r   r3   )"__doc__
__future__r   argparser   r   pathlibr   typingr   hermes_constantsr   plugins.google_meetr   r   plugins.google_meet.meet_botr   r   r'   r   rJ   rK   rM   rN   rQ   rO   rP   rR   __name__ArgumentParserparser
parse_argsnsexitr   r   r   <module>r      s   	 #   
   , 5 :LB.R(^9xvr R /%	/% /% 	/%
 /% /% /% 	/%d%<%% z$X$$-8F				BCHH\"	 r   