§
    øžyjX  ã                  ó&  — U 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ddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZ dd	lmZ dad
ed<   dZd
ed<   d,d„Zd,d„Zd-d„Zd.d„Zd.d„Zd.d„Zd/d„Zd0d„Z d1d „Z!d0d!„Z"d2d#„Z#d.d$„Z$d3d%„Z%d1d&„Z&d'd(œd4d+„Z'dS )5uê  
``hermes photon ...`` CLI subcommands â€” registered by the plugin via
``ctx.register_cli_command()``.

Subcommands:

    setup              full first-time setup (device login + project + user + sidecar)
    status             show login + project + sidecar dep state
    install-sidecar    npm install inside plugins/platforms/photon/sidecar/
    telemetry          show or toggle Spectrum SDK telemetry (on/off)

The device-code login runs automatically as the first step of ``setup``;
there is no standalone ``login`` verb (matching how every other Hermes
gateway channel onboards through a single setup surface).

Photon uses the spectrum-ts gRPC stream for inbound â€” there is no webhook
to register, so there are no webhook subcommands.
é    )ÚannotationsN)ÚPath)ÚColorsÚcoloré   )Úauth)Ú_NPM_ERROR_LOG_MAX_CHARSÚsidecar_deps_installed)Úresolve_sidecar_dirzPath | NoneÚ_SIDECAR_DIRÚ_NPM_ERROR_LOGÚreturnr   c                 ó:   — t           €t          ¦   «         a t           S )zBSidecar runtime dir, resolved once on first use (never at import).)r   r   © ó    úB/home/ragecks/.hermes/hermes-agent/plugins/platforms/photon/cli.pyÚ_sidecar_dirr   0   s   € õ ÐÝ*Ñ,Ô,ˆÝÐr   c                 ó@   — t           �t           S t          ¦   «         dz  S )zEPath of the persisted npm-failure log (derived from the sidecar dir).Nz.photon-npm-error.log)r   r   r   r   r   Ú_npm_error_logr   8   s   € åÐ!ÝÐÝ‰>Œ>Ð3Ñ3Ð3r   Úparserúargparse.ArgumentParserÚNonec                óž  — |                       dd¬¦  «        }|                     dd¬¦  «        }|                     ddd	¬
¦  «         |                     ddd¬
¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     ddd¬¦  «         |                     ddd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «        }|                     dddd ¬!¦  «         |                      t          ¬"¦  «         dS )#z(Wire up `hermes photon ...` subcommands.Úphoton_commandF)ÚdestÚrequiredÚsetupz:First-time setup (device login + project + user + sidecar))Úhelpz--project-nameNz&Project name (default: 'Hermes Agent'))Údefaultr   z--phonez+Your E.164 phone number (e.g. +15551234567)z--first-name)r   z--last-namez--emailz--no-browserÚ
store_truez@Don't try to open a browser for device login; print the URL only)Úactionr   z--skip-sidecar-installz/Skip `npm install` inside the sidecar directoryÚstatusz(Show login + project + sidecar dep stateúinstall-sidecarz,Run npm install inside the sidecar directoryÚ	telemetryz.Show or toggle Spectrum SDK telemetry (on/off)Ústateú?)ÚonÚoffz9Turn telemetry on or off (omit to show the current state))ÚnargsÚchoicesr   )Úfunc)Úadd_subparsersÚ
add_parserÚadd_argumentÚset_defaultsÚdispatch)r   ÚsubsÚp_setupÚp_telemetrys       r   Úregister_clir4   B   s»  € à× Ò Ð&6ÀÐ ÑGÔG€Dà�oŠoØØIð ñ ô €Gð ×ÒÐ)°4ØFð ñ Hô Hð Hà×Ò˜¨DØKð ñ Mô Mð Mà×Ò˜°ÐÑ6Ô6Ð6Ø×Ò˜°ÐÑ5Ô5Ð5Ø×Ò˜¨DÐÑ1Ô1Ð1Ø×Ò˜°Ø`ð ñ bô bð bà×ÒÐ1¸,ØOð ñ Qô Qð Qð 	‡O‚O�HÐ#M€OÑNÔNÐNØ‡O‚OÐ%Ð,Z€OÑ[Ô[Ð[à—/’/ØØ=ð "ñ ô €Kð ×ÒØ�s MØHð ñ ô ð ð
 ×Ò�XÐÑ&Ô&Ð&Ð&Ð&r   Úargsúargparse.NamespaceÚintc                ó.  — t          | dd ¦  «        }|€t          | ¦  «        S |dk    rt          | ¦  «        S |dk    rt          | ¦  «        S |dk    rt          | ¦  «        S |dk    rt	          | ¦  «        S t          d|› �t          j        ¬¦  «         dS )	Nr   r   r"   r#   r$   zunknown subcommand: ©Úfileé   )ÚgetattrÚ_cmd_statusÚ
_cmd_setupÚ_cmd_install_sidecarÚ_cmd_telemetryÚprintÚsysÚstderr)r5   Úsubs     r   r0   r0   h   s«   € Ý
�$Ð(¨$Ñ
/Ô
/€CØ
€{å˜4Ñ Ô Ð Ø
ˆg‚~€~Ý˜$ÑÔÐØ
ˆh‚€Ý˜4Ñ Ô Ð Ø
ÐÒÐÝ# DÑ)Ô)Ð)Ø
ˆkÒÐÝ˜dÑ#Ô#Ð#Ý	Ð
& Ð
&Ð
&­S¬ZÐ8Ñ8Ô8Ð8Øˆ1r   c                óþ   — d„ }	 t          j        | j         |¬¦  «        }n6# t          $ r)}t	          d|› �t
          j        ¬¦  «         Y d}~dS d}~ww xY w|}t	          dt          j        ¦   «         › �¦  «         dS )	u  Run the RFC 8628 device-code login flow and persist the token.

    Internal helper â€” invoked as the first step of ``setup``. There is
    no standalone ``hermes photon login`` command; Photon onboards
    through the single ``setup`` surface like every other channel.
    c                ó  — | j         p| j        }t          ¦   «          t          d¦  «         t          d|› �¦  «         t          d| j        › �¦  «         t          d¦  «         t          d¦  «         t          ¦   «          d S )Nu“   â”Œâ”€ Photon device login â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u   â”‚  Open this URL:  u   â”‚  Enter the code: u0   â”‚  (waiting for approval â€” Ctrl-C to cancel)õ½   â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€)Úverification_uri_completeÚverification_urirA   Ú	user_code)ÚcodeÚtargets     r   Ú_print_codez&_run_device_login.<locals>._print_codeƒ   s�   € ØÔ/ÐH°4Ô3HˆÝ‰ŒˆÝð  dñ  	eô  	eð  	eÝÐ. fÐ.Ð.Ñ/Ô/Ð/ÝÐ6 d¤nÐ6Ð6Ñ7Ô7Ð7ÝÐ@ÑAÔAÐAÝð  Nñ  	Oô  	Oð  	OÝ‰Œˆˆˆr   )Úopen_browserÚon_user_codezlogin failed: r9   Nr   u!   âœ“ logged in â€” token saved to r   )Úphoton_authÚlogin_device_flowÚ
no_browserÚ	ExceptionrA   rB   rC   Ú_auth_json_path)r5   rM   ÚtokenÚeÚ_s        r   Ú_run_device_loginrX   |   s²   € ðð ð ðÝÔ-Ø!œ_Ð,Ø$ð
ñ 
ô 
ˆˆøõ ð ð ð ÝÐ"˜qÐ"Ð"­¬Ð4Ñ4Ô4Ð4Øˆqˆqˆqˆqˆqøøøøðøøøð
 	€AÝ	Ð
M­kÔ.IÑ.KÔ.KÐ
MÐ
MÑNÔNÐNØˆ1s   …" ¢
A¬AÁAc                ó@  — t          j        ¦   «         }|rWt          d¦  «         t          j        |¦  «        rt          d¦  «         n$t          d¦  «         t          j        ¦   «          d }|sYt          d¦  «         t          | ¦  «        }|dk    r|S t          j        ¦   «         }|st          dt          j        ¬¦  «         dS nt          d	¦  «         | j        pt           j	        }t          j
        ¦   «         }	 |rt          d
¦  «         n•t          j        ||¦  «        }|r1|                     d¦  «        r|d         }t          d|› d�¦  «         nMt          d|› d�¦  «         t          j        ||¬¦  «        }|                     d¦  «        }t          d¦  «         n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w|st          dt          j        ¬¦  «         dS 	 t          d¦  «         |}t          j        ¦   «         \  }	}
d}d}|	r/|
r-	 t          j        |	|
¦  «         |
}d}n# t          $ r d}Y nw xY w|st          j        ||¦  «        }t          j        ||||¬¦  «         |rt          d|› d�¦  «         n"t          d|› d�¦  «         t          d¦  «         n6# t          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY w| j        p&t)          t+          dt,          j        ¦  «        ¦  «        }d }d }d }|st          d¦  «         næ| j        }| j        }	 t          j        ||||| j        |¬ ¦  «        \  }}ng# t8          $ r)}t          d!|› �t          j        ¬¦  «         Y d }~dS d }~wt          $ r)}t          d"|› �t          j        ¬¦  «         Y d }~dS d }~ww xY wt          |rd#nd$¦  «         |}|                     d¦  «        }t          j        |¦  «        }t=          |¦  «         |sd	 t          j        ||¦  «        }|r|                     d%¦  «        }n6# t          $ r)}t          d&|› d'�t          j        ¬¦  «         Y d }~nd }~ww xY w|rÞt          ¦   «          t          t+          d(t,          j         ¦  «        ¦  «         t          t+          d)t,          j         ¦  «        t+          tC          |¦  «        t,          j         t,          j"        ¦  «        z   ¦  «         t          t+          d*t,          j         ¦  «        ¦  «         t          t+          d+t,          j         ¦  «        ¦  «         nt          d,¦  «         |ra	 t          j#        |||rtC          |¦  «        nd |¬-¦  «         n6# t          $ r)}t          d.|› d'�t          j        ¬¦  «         Y d }~nd }~ww xY w| j$        rt          d/¦  «         n%t          d0¦  «         tK          ¦   «         }|dk    r|S 	 dd1l&m'}  |d2d3dd¬4¦  «         t          d5¦  «         n6# t          $ r)}t          d6|› d'�t          j        ¬¦  «         Y d }~nd }~ww xY wt          ¦   «          t          d7¦  «         t          d8¦  «         dS )9Nz'[1/5] Checking existing Photon token...u     âœ“ token is validuB     âœ— token is stale (dashboard rejected it) â€” re-authenticatingu=   [1/5] No valid Photon token found â€” running device login...r   z(login completed but token was not storedr9   r   z#[1/5] Reusing existing Photon tokenz'[2/5] Reusing configured Photon projectÚidz[2/5] Found existing project 'ú'z[2/5] Creating Photon project 'z'...)Únameu     âœ“ project createdzproject setup failed: z%could not resolve a Photon project idz*[3/5] Provisioning Spectrum credentials...Ú FT)Úspectrum_project_idÚproject_secretÚdashboard_project_idr\   u!     âœ“ Spectrum ready (project id u    ) â€” existing credentials validu   ) â€” new secret savedu�     âš  Project secret was regenerated. If the gateway is running, restart it so the sidecar picks up the new secret:
      hermes gateway restartzspectrum provisioning failed: z=[4/5] Your iMessage phone number (E.164, e.g. +15551234567): zL      Skipped user registration (no phone given). Re-run with --phone later.)Úphone_numberÚ
first_nameÚ	last_nameÚemailz      invalid phone number: z       user registration failed: u     âœ“ phone registeredu     âœ“ phone already registeredÚphoneNumberz*      (could not fetch the assigned line: ú)u�   â”Œâ”€ Your agent's iMessage number â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€u
   â”‚  ðŸ“± u<   â”‚  Text this number from your phone to talk to your agent.rG   uC         No iMessage line assigned yet â€” check the Photon dashboard.)ra   Úassigned_phone_numberÚuser_idr`   z.      (could not save Photon status metadata: z;[5/5] Skipping sidecar npm install (--skip-sidecar-install)z3[5/5] Installing Node sidecar deps (spectrum-ts)...)Úwrite_platform_config_fieldÚphotonÚenabled)Úrawu,     âœ“ photon platform enabled in config.yamlz*      (could not enable Photon in config: u   âœ“ Photon setup complete.z*  Start the gateway:  hermes gateway start)(rP   Úload_photon_tokenrA   Úcheck_photon_token_validÚclear_photon_tokenrX   rB   rC   Úproject_nameÚDEFAULT_PROJECT_NAMEÚload_dashboard_project_idÚfind_project_by_nameÚgetÚcreate_projectrS   Úload_project_credentialsÚ
list_usersÚregenerate_project_secretÚstore_project_credentialsÚphoneÚ_promptr   r   ÚCYANrb   rd   Úregister_user_if_absentrc   Ú
ValueErrorÚuser_assigned_lineÚ_autoconfigure_accessÚget_imessage_lineÚGREENÚstrÚBOLDÚstore_user_numbersÚskip_sidecar_installÚ_install_sidecarÚhermes_cli.configri   )r5   rU   Úrcr\   Údashboard_idÚexistingÚcreatedrV   Úspectrum_idÚexisting_idÚexisting_secretÚsecretÚreusedrz   Úagent_numberÚregistered_phoneÚregistered_user_idrb   rd   ÚuserÚlineri   s                         r   r>   r>   œ   sd  € åÔ)Ñ+Ô+€EØð õ 	Ð7Ñ8Ô8Ð8ÝÔ/°Ñ6Ô6ð 	ÝÐ(Ñ)Ô)Ð)Ð)åÐVÑWÔWÐWÝÔ*Ñ,Ô,Ð,ØˆEØð 
5ÝÐMÑNÔNÐNÝ˜tÑ$Ô$ˆØ�Š7ˆ7ØˆIÝÔ-Ñ/Ô/ˆØð 	ÝÐ<Å3Ä:ÐNÑNÔNÐNØ�1ð	õ 	Ð3Ñ4Ô4Ð4ð ÔÐ@¥Ô @€DÝÔ8Ñ:Ô:€LðØð 	/ÝÐ;Ñ<Ô<Ð<Ð<å"Ô7¸¸tÑDÔDˆHØð /˜HŸLšL¨Ñ.Ô.ð /Ø'¨œ~�ÝÐ>°tÐ>Ð>Ð>Ñ?Ô?Ð?Ð?åÐB¸ÐBÐBÐBÑCÔCÐCÝ%Ô4°UÀÐFÑFÔF�Ø&Ÿ{š{¨4Ñ0Ô0�ÝÐ-Ñ.Ô.Ð.øøÝð ð ð ÝÐ* qÐ*Ð*µ´Ð<Ñ<Ô<Ð<Øˆqˆqˆqˆqˆqøøøøðøøøð ð ÝÐ5½C¼JÐGÑGÔGÐGØˆqð"ÝÐ:Ñ;Ô;Ð;Ø"ˆÝ'2Ô'KÑ'MÔ'MÑ$ˆ�_ØˆØˆØð 	˜?ð 	ðÝÔ& {°OÑDÔDÐDØ(�Ø��øÝð ð ð Ø���ðøøøàð 	PÝ Ô:¸5À,ÑOÔOˆFÝÔ-Ø +Ø!Ø!-Øð		
ñ 	
ô 	
ð 	
ð ð 	ÝÐc°kÐcÐcÐcÑdÔdÐdÐdåÐY°kÐYÐYÐYÑZÔZÐZÝð/ñô ð øøõ
 ð ð ð ÝÐ2¨qÐ2Ð2½¼ÐDÑDÔDÐDØˆqˆqˆqˆqˆqøøøøðøøøð
 ŒJð �'ÝØKÝŒKñ	
ô 	
ñô €Eð €LØÐØÐØð  %ÝÐ\Ñ]Ô]Ð]Ð]ð ”_ˆ
Ø”
ˆð	Ý'Ô?Ø˜VØ"Ø%Øœ.Øðñ ô ‰MˆD�'�'øõ ð 	ð 	ð 	ÝÐ4°Ð4Ð4½3¼:ÐFÑFÔFÐFØ�1�1�1�1�1øøøøÝð 	ð 	ð 	ÝÐ8°QÐ8Ð8½s¼zÐJÑJÔJÐJØ�1�1�1�1�1øøøøð	øøøõ 	¨'ÐWÐ&Ð&Ð7WÑXÔXÐXØ ÐØ!ŸXšX d™^œ^Ðõ
 #Ô5°dÑ;Ô;ˆõ 	˜eÑ$Ô$Ð$ð ð Vð	VÝÔ0°¸ÑEÔEˆDØð 7Ø#Ÿxšx¨Ñ6Ô6�øøÝð 	Vð 	Vð 	VÝÐC¸qÐCÐCÐCÍ#Ì*ÐUÑUÔUÐUÐUÐUÐUÐUÐUøøøøð	Vøøøàð 
UÝ‰ŒˆÝ�eð  Xõ  Z`ô  Zfñ  gô  gñ  	hô  	hð  	hÝÝ�,¥¤Ñ-Ô-Ý•C˜Ñ%Ô%¥v¤|µV´[ÑAÔAñBñ	
ô 	
ð 	
õ 	�eÐRÕTZÔT`ÑaÔaÑbÔbÐbÝ�eð  Tõ  V\ô  Vbñ  cô  cñ  	dô  	dð  	dð  	dåÐSÑTÔTÐTØð 	Zð	ZÝÔ*Ø-Ø&2Ø3EÐO�Ð.Ñ/Ô/Ð/È4Ø%1ð	ñ ô ð ð øõ ð 	Zð 	Zð 	ZÝÐGÀ1ÐGÐGÐGÍcÌjÐYÑYÔYÐYÐYÐYÐYÐYÐYøøøøð	Zøøøð Ô ð ÝÐKÑLÔLÐLÐLåÐCÑDÔDÐDÝÑÔˆØ�Š7ˆ7ØˆIðRØAÐAÐAÐAÐAÐAØ#Ð# H¨i¸À4ÐHÑHÔHÐHÝÐ<Ñ=Ô=Ð=Ð=øÝð Rð Rð RÝÐ?¸1Ð?Ð?Ð?ÅcÄjÐQÑQÔQÐQÐQÐQÐQÐQÐQøøøøðRøøøõ 
�G„G€GÝ	Ð
&Ñ'Ô'Ð'Ý	Ð
6Ñ7Ô7Ð7Øˆ1sÂ   Ã>B'F& Æ&
GÆ0GÇGÇ</K  È,I ÉK  ÉIÉK  ÉIÉA*K  Ë 
K3Ë
K.Ë.K3Í"M. Í.
OÍ8NÎOÎ)OÏOÐ%,Q Ñ
RÑR Ò RÕ:)V$ Ö$
WÖ.W×WØ$X< Ø<
Y/ÙY*Ù*Y/rz   rƒ   c                ó@  — 	 ddl m}m} n# t          $ r Y dS w xY wdD ]\  }}	  ||¦  «        rt	          d|› d�¦  «         Œ% ||| ¦  «         t	          d|› d|› d	�¦  «         ŒH# t
          $ r+}t	          d
|› d|› �t          j        ¬¦  «         Y d}~Œxd}~ww xY wdS )až  Allowlist the operator and set their DM as the cron home channel.

    Writes ``PHOTON_ALLOWED_USERS`` (so the gateway authorizes the operator's
    own inbound messages instead of denying them) and ``PHOTON_HOME_CHANNEL``
    (the default space for cron delivery) to the operator's E.164 number. Each
    is only filled when unset, so a hand-tuned allowlist / home channel is
    never clobbered on a re-run.
    r   )Úget_env_valueÚsave_env_valueN))ÚPHOTON_ALLOWED_USERSzallowlisted your number)ÚPHOTON_HOME_CHANNELz$set your DM as the cron home channelz      u"    already set â€” leaving it as-is.u     âœ“ z (rf   z      could not set z: r9   )rˆ   r˜   r™   ÚImportErrorrA   rS   rB   rC   )rz   r˜   r™   ÚkeyÚlabelrV   s         r   r€   r€   c  s+  € ðØCÐCÐCÐCÐCÐCÐCÐCÐCøÝð ð ð Øˆˆðøøøðð Fð F‰
ˆˆUð	FØˆ}˜SÑ!Ô!ð ÝÐF˜sÐFÐFÐFÑGÔGÐGØØˆN˜3 Ñ&Ô&Ð&ÝÐ*˜5Ð*Ð* CÐ*Ð*Ð*Ñ+Ô+Ð+Ð+øÝð 	Fð 	Fð 	FÝÐ3¨Ð3Ð3°Ð3Ð3½#¼*ÐEÑEÔEÐEÐEÐEÐEÐEÐEøøøøð	FøøøðFð Fs)   ‚ ‹
˜¤A&Á"A&Á&
BÁ0!BÂBÚ_argsc                óZ  — t          ¦   «          t          j        t          ¦  «         t	          j        d¦  «        pt          j        d¦  «        }t          ¦   «         }t          d|pd› �¦  «         t          d|rdnd› �¦  «         t          dt          ¦   «         rd	nd
› d�¦  «         dS )NÚPHOTON_NODE_BINÚnodez  node binary         : u   âœ— missing (install Node 18+)z  sidecar deps        : u   âœ“ installedu'   âœ— run `hermes photon install-sidecar`z  telemetry           : r'   r(   z# (`hermes photon telemetry on|off`)r   )
Ú_refresh_status_numbersrP   Úprint_credential_summaryrA   ÚosÚgetenvÚshutilÚwhichr
   Ú_telemetry_enabled)rŸ   Únode_binÚsidecar_installeds      r   r=   r=   ~  sº   € ÝÑÔÐõ Ô(­Ñ/Ô/Ð/ÝŒyÐ*Ñ+Ô+ÐC­v¬|¸FÑ/CÔ/C€HÝ.Ñ0Ô0ÐÝ	Ð
S XÐ%QÐ1QÐ
SÐ
SÑTÔTÐTÝ	Ð
zÐ8IÐ%x _ _ÐOxÐ
zÐ
zÑ{Ô{Ð{Ý	Ð
qÕ-?Ñ-AÔ-AÐ%L T TÀuÐ
qÐ
qÐ
qÑrÔrÐrØˆ1r   c                 ó  — t          j        ¦   «         \  } }| r|rd S t          j        ¦   «         \  }}|r|sd S 	 t          j        ||¦  «         d S # t          $ r*}t          d|› d�t          j        ¬¦  «         Y d }~d S d }~ww xY w)Nz.      (could not refresh Photon user numbers: rf   r9   )rP   Úload_user_numbersrv   Úrefresh_user_numbersrS   rA   rB   rC   )rz   Úassignedr�   r_   rV   s        r   r£   r£   Œ  sÄ   € Ý!Ô3Ñ5Ô5�O€Eˆ8Øð �ð ØˆÝ"-Ô"FÑ"HÔ"HÑ€K�Øð ˜nð ØˆðVÝÔ(¨°nÑEÔEÐEÐEÐEøÝð Vð Vð VÝÐC¸qÐCÐCÐCÍ#Ì*ÐUÑUÔUÐUÐUÐUÐUÐUÐUÐUøøøøðVøøøs   ºA Á
BÁB Â Bc                ó   — t          ¦   «         S )N)r‡   )rŸ   s    r   r?   r?   ™  s   € ÝÑÔÐr   Úboolc                 óÄ   — 	 ddl m}   | d¦  «        }n$# t          $ r t          j        d¦  «        }Y nw xY w|pd                     ¦   «                              ¦   «         dv S )z¹Read PHOTON_TELEMETRY from the env / ~/.hermes/.env.

    Mirrors the sidecar's truthy set (index.mjs) so the state shown here
    always matches what the sidecar will actually do.
    r   )r˜   ÚPHOTON_TELEMETRYr]   )Ú1ÚtrueÚyesr'   )rˆ   r˜   rœ   r¥   r¦   ÚstripÚlower)r˜   rl   s     r   r©   r©   �  s‚   € ð,Ø3Ð3Ð3Ð3Ð3Ð3ØˆmÐ.Ñ/Ô/ˆˆøÝð ,ð ,ð ,ÝŒiÐ*Ñ+Ô+ˆˆˆð,øøøàˆI�2×ÒÑÔ×$Ò$Ñ&Ô&Ð*DÐDÐDs   ‚ ”5´5c                óz  — t          | dd ¦  «        }|€3t          dt          ¦   «         rdnd› �¦  «         t          d¦  «         dS 	 ddlm}  |d|dk    rd	nd
¦  «         n6# t
          $ r)}t          d|› �t          j        ¬¦  «         Y d }~dS d }~ww xY wt          d|› d�¦  «         t          d¦  «         dS )Nr%   zPhoton telemetry: r'   r(   zK  Toggle with `hermes photon telemetry on` / `hermes photon telemetry off`.r   )r™   r³   rµ   Úfalsez!could not save PHOTON_TELEMETRY: r9   r   u   âœ“ Spectrum telemetry turned z% (PHOTON_TELEMETRY in ~/.hermes/.env)zL  Restart the gateway for the sidecar to pick it up:  hermes gateway restart)r<   rA   r©   rˆ   r™   rS   rB   rC   )r5   r%   r™   rV   s       r   r@   r@   «  s  € Ý�D˜' 4Ñ(Ô(€EØ€}ÝÐLÕ+=Ñ+?Ô+?Ð#J 4 4ÀUÐLÐLÑMÔMÐMÝÐ[Ñ\Ô\Ð\ØˆqðØ4Ð4Ð4Ð4Ð4Ð4ØˆÐ)°U¸d²]°]¨6¨6ÈÑPÔPÐPÐPøÝð ð ð ÝÐ5°!Ð5Ð5½C¼JÐGÑGÔGÐGØˆqˆqˆqˆqˆqøøøøðøøøõ 
Ð
W¨5Ð
WÐ
WÐ
WÑXÔXÐXÝ	Ð
XÑYÔYÐYØˆ1s   ÁA# Á#
BÁ-BÂBc                 ó&  — t          j        d¦  «        pd} t          j        | ¦  «        st          dt          j        ¬¦  «         dS t          dt          ¦   «         › d| › d�¦  «         t          j        | dgt          t          ¦   «         ¦  «        d	t          j	        d
¬¦  «        }|j        r!t          |j        dt          j        ¬¦  «         |j
        dk    ryt          d| › d�¦  «         t          j        | dgt          t          ¦   «         ¦  «        d	t          j	        d
¬¦  «        }|j        r!t          |j        dt          j        ¬¦  «         |j
        dk    r{t          dt          j        ¬¦  «         |j        pd                     ¦   «         d t          …         }|r5	 t          ¦   «                              |d¬¦  «         nC# t          $ r Y n7w xY wn2	 t          ¦   «                              ¦   «          n# t          $ r Y nw xY w|j
        S )NÚnpmzInpm is not on PATH. Install Node.js 18+ (https://nodejs.org/) and re-run.r9   r   z  $ cd z && z ciÚciFT)ÚcwdÚcheckrC   Útextr]   )Úendr:   r   u&     npm ci failed â€” falling back to:  z installÚinstallznpm install failedzutf-8)Úencoding)r§   r¨   rA   rB   rC   r   Ú
subprocessÚrunrƒ   ÚPIPEÚ
returncoder·   r	   r   Ú
write_textÚOSErrorÚunlink)r¼   ÚprocÚerrors      r   r‡   r‡   ¼  s?  € Ý
Œ,�uÑ
Ô
Ð
& €CÝŒ<˜ÑÔð Ýðå”ð	
ñ 	
ô 	
ð 	
ð
 ˆqõ 
Ð
0•L‘N”NÐ
0Ð
0¨Ð
0Ð
0Ð
0Ñ1Ô1Ð1õ Œ>Ø	ˆdˆÝ•‘”ÑÔØÝŒØðñ ô €Dð „{ð 4ÝˆdŒk˜r­¬
Ð3Ñ3Ô3Ð3Ø„˜!ÒÐÝÐD°sÐDÐDÐDÑEÔEÐEÝŒ~Ø�)ÐÝ•L‘N”NÑ#Ô#ØÝ”?Øð
ñ 
ô 
ˆð Œ;ð 	8Ý�$”+ 2­C¬JÐ7Ñ7Ô7Ð7Ø„˜!ÒÐÝÐ"­¬Ð4Ñ4Ô4Ð4ð ”Ð" ×)Ò)Ñ+Ô+Ð,EÕ-EÐ,EÔFˆØð 	ðÝÑ Ô ×+Ò+¨E¸GÐ+ÑDÔDÐDÐDøÝð ð ð Ø�ðøøøð	ð	ÝÑÔ×#Ò#Ñ%Ô%Ð%Ð%øÝð 	ð 	ð 	ØˆDð	øøøàŒ?Ðs$   Æ%#G	 Ç	
GÇGÇ G< Ç<
H	ÈH	c            
     ó\   — t          j        dddddddd¬¦  «        } t          | ¦  «         dS )zCRun Photon first-time setup from the `hermes gateway setup` wizard.r   NF)r   rp   rz   rb   rc   rd   rR   r†   )ÚargparseÚ	Namespacer>   )r5   s    r   Úgateway_setuprÐ     sG   € åÔØØØØØØØØ"ð	ñ 	ô 	€Dõ ˆtÑÔÐÐÐr   F)r�   Úpromptr�   c               ó"  — t           j                             ¦   «         sdS 	 |r&t          j        | ¦  «                             ¦   «         S t          | ¦  «                             ¦   «         S # t          t          f$ r t          ¦   «          Y dS w xY w)Nr]   )	rB   ÚstdinÚisattyÚgetpassr·   ÚinputÚKeyboardInterruptÚEOFErrorrA   )rÑ   r�   s     r   r{   r{     sŽ   € ÝŒ9×ÒÑÔð ØˆrðØð 	3Ý”? 6Ñ*Ô*×0Ò0Ñ2Ô2Ð2Ý�V‰}Œ}×"Ò"Ñ$Ô$Ð$øÝ�xÐ(ð ð ð Ý‰ŒˆØˆrˆrðøøøs   ¢'A+ Á
 A+ Á+BÂB)r   r   )r   r   r   r   )r5   r6   r   r7   )rz   rƒ   r   r   )rŸ   r6   r   r7   )r   r   )r   r±   )r   r7   )rÑ   rƒ   r�   r±   r   rƒ   )(Ú__doc__Ú
__future__r   rÎ   rÕ   r¥   r§   rÄ   rB   Úpathlibr   Úhermes_cli.colorsr   r   r]   r   rP   Úadapterr	   r
   Úsidecar_pathsr   r   Ú__annotations__r   r   r   r4   r0   rX   r>   r€   r=   r£   r?   r©   r@   r‡   rÐ   r{   r   r   r   ú<module>rà      sF  ððð ð ð$ #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à !Ð !Ð !Ð !Ð !Ð !Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ EØ .Ð .Ð .Ð .Ð .Ð .ð !€Ð  Ð  Ð  Ñ  ð #€Ð "Ð "Ð "Ñ "ðð ð ð ð4ð 4ð 4ð 4ð 'ð  'ð  'ð  'ðLð ð ð ð(ð ð ð ð@Dð Dð Dð DðNFð Fð Fð Fð6ð ð ð ð
Vð 
Vð 
Vð 
Vðð ð ð ðEð Eð Eð Eðð ð ð ð"8ð 8ð 8ð 8ðJð ð ð ð$ ,1ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r   