+
    lHàj\  ã                   ó”  € R t ^RIHt ]! 4       t]P                  t]P
                  t]! R4      ]R R l4       4       t]! R4      ]R R l4       4       t]! R4      ]R	 R
 l4       4       t]! R4      ]R R l4       4       t]! R4      ]R R l4       4       t]! R4      ]R R l4       4       t]! R4      ]R R l4       4       tR R ltR# )u
  Credential-vault JSON-RPC handlers â€” the Desktop's door to the local vault.

The Desktop's Settings â†’ Credential Vault panel manages the encrypted,
model-blind vault (``agent/vault_store.py``) over the same localhost WS
JSON-RPC channel every other Settings surface uses. Contracts:

- ``vault.list``   â†’ metadata only ({id, kind, label, origin, created_at,
  and for logins identifier/identifier_type â€” identifiers are visible
  metadata by design}); passwords NEVER appear in any response.
- ``vault.add``    â†’ validates via ``VaultStore.add_item``; the secret
  payload arrives over the local RPC channel, goes straight into the
  encrypted store, and is never logged. Error strings are defensively
  scrubbed with ``scrub_secret_from_text`` before they leave the handler.
- ``vault.remove`` â†’ {removed: bool}.
- ``vault.sources`` / ``vault.source.set`` â†’ external password-manager status and enable toggle.
- ``vault.unlock`` / ``vault.lock`` â†’ per-session unlock of a manager from Settings; the master
  password is consumed by the manager CLI through its non-interactive channel and never stored
  or logged.

Every handler honours ``params.profile`` (app-global remote mode serves several profiles from one
backend): the requested profile's HERMES_HOME and secret scope are bound around the body, so the
vault file, manager config and manager tokens all resolve to that profile.

Handlers are rebound onto server.py's globals at install time (see
method_ctx.py) and may reference server module globals (``_ok``, ``_err``).
)ÚHandlerRegistryz
vault.listc                ó0   € V ^8„  d   QhR\         R\         /# ©é   ÚparamsÚreturn©Údict)Úformats   "Ú>/home/ubuntu/.hermes/hermes-agent/tui_gateway/methods_vault.pyÚ__annotate__r   ,   ó   € ÷ 'ñ '”4ð 'œDñ 'ó    c                óP  a€  ^ RI Hp . pV! 4        FV  oSP                  '       d   SP                  4       '       g   K-  VP	                  V3R lSP                  4        4       4       KX  	  \        V RV/4      #   \         d!   p\        T R\        T4      4      u Rp?# Rp?ii ; i)z¯Metadata-only listing across every enabled backend (local + unlocked password managers).
Each item carries ``backend``; locked managers contribute nothing (see vault.sources).©Úenabled_backendsc              3   ód   <"  € T F%  p/ VP                  4       CR SP                  /Cx € K'  	  R# 5i)ÚbackendN)Úto_dictÚname)Ú.0Úmetar   s   & €r   Ú	<genexpr>Ú_.<locals>.<genexpr>6   s*   øé € ÐfÑQeÈÐD˜DŸL™L›NÐD¨I°w·|±|ÖDÓQeùs   ƒ-0Úitemséç  N)
Úagent.vault_backendsr   Úneeds_unlockÚis_unlockedÚextendÚ
list_itemsÚ_okÚ	ExceptionÚ_errÚstr)Úridr   r   r   Úer   s   &&   @r   Ú_r'   *   s�   ø€ ð

'Ý9àˆÙ'Ö)ˆGØ×#×#Ð#¨G×,?Ñ,?×,AÒ,AÙØ�L‰LÔfÐQX×QcÑQcÔQeÓfÖfñ *ô �3˜ %Ð(Ó)Ð)øÜô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús"   ƒ9A: ½<A: Á:B%ÂB ÂB%Â B%zvault.sourcesc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   >   r   r   c                ó¼  € ^ RI Hp ^ RIHpHp V! 4        Uu/ uF  qUP
                  VbK  	  ppRRRRRRR	R
RRRR/.pV! 4        F‚  pVP                  VP
                  4      p	TP                  RVP
                  RVP                  RV	RJR	RR\        T	;'       d    V	P                  4       4      RV! VP
                  4      /4       K„  	  \        V RV/4      # u upi )z_Status of every login source: {name, display_name, enabled, needs_unlock, unlocked, installed}.r   )Úexternal_backend_classesÚis_installedr   ÚlocalÚdisplay_namezHermes vaultÚenabledTr   FÚunlockedÚ	installedNÚsources)r   r   Úagent.vault_backends.baser*   r+   r   ÚgetÚappendr-   Úboolr   r!   )
r%   r   r   r*   r+   Úbr.   ÚrowsÚclsÚlives
   &&        r   r'   r'   <   sã   € õ 6ßPá"2Ô"4Ó5Ñ"4˜Q�v‰v�qŠyÑ"4€GÐ5Ø�W˜n¨n¸iÈÈ~Ð_dØ˜˜{¨Dð2ð 3€Dá'Ö)ˆØ�{‰{˜3Ÿ8™8Ó$ˆØ�‰�V˜SŸX™X ~°s×7GÑ7GÈÐTXÐ`dÐTdØ# T¨:´t¸D×<WÐ<WÀT×EUÑEUÓEWÓ7XØ ¡,¨s¯x©xÓ"8ð:ö 	;ñ *ô
 ˆs�Y Ð%Ó&Ð&ùò 6s   ˜Czvault.source.setc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   P   s   € ÷ 8ñ 8”4ð 8œDñ 8r   c                óÚ  € ^ RI Hp ^ RIHp ^ RIHpHpHp \        VP                  R4      ;'       g    R4      pYr! 4        Uu0 uF  qˆP                  kK  	  up9  d   \        V RRV 24      # \        VP                  R4      4      p	V! 4       p
V! V! V
R	4      V4      pV	'       d   VP                  RR
4       MRVR&   V	'       g	   V! V4       V! V
4       \        V RVRV	/4      # u upi )z`Enable/disable an external manager: writes ``vault.<name>.enabled`` and locks it when disabling.)r*   ©Úlock)Ú_ensure_dictÚload_configÚsave_configr   Ú r   zunknown vault source: r.   ÚvaultNF)r2   r*   Úagent.vault_backends.unlockr=   Úhermes_cli.configr>   r?   r@   r$   r3   r   r#   r5   Úpopr!   )r%   r   r*   r=   r>   r?   r@   r   r8   r.   ÚcfgÚsections   &&          r   r'   r'   N   sØ   € õ CÝ0ßHÑHäˆv�z‰z˜&Ó!×'Ð' RÓ(€DØÐ(@Ô(BÓCÑ(B —H”HÑ(BÑCÔCÜ�C˜Ð!7¸°vÐ>Ó?Ð?Ü�6—:‘:˜iÓ(Ó)€GÙ
‹-€CÙ™<¨¨WÓ5°tÓ<€GßØ�‰�I˜tÕ$à"ˆ�	ÑßÙˆTŒ
Ù�ÔÜˆs�V˜T 9¨gÐ6Ó7Ð7ùò Ds   ÁC(zvault.unlockc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   h   s   € ÷ 6ñ 6”4ð 6œDñ 6r   c           	     óú  a€ ^ RI Hp \        VP                  R4      ;'       g    R4      o\        VP                  R4      ;'       g    R4      p\	        V3R lV! 4        4       R4      pVf   \        V RS R24      # V'       g   \        V RR	4      #  VP                  V4        ?\        T RSRR/4      #   \         d2   p\        T R\        T4      P                  TR
4      4      u Rp??# Rp?ii ; i  ?i ; i)zfUnlock a manager with the master password typed in the Settings dialog (consumed by the CLI on stdin).r   r   rA   Úpasswordc              3   ót   <"  € T F-  qP                   S8X  g   K  VP                  '       g   K)  Vx € K/  	  R # 5i)N)r   r   )r   r6   r   s   & €r   r   r   n   s%   øé € ÐWÑ1˜!·V±V¸t±^”AÈÏÍ—A’AÓ1ùs   ƒ8š8®
8Nr   z# is not an enabled password managerzmaster password is requiredz
[REDACTED]r/   T)
r   r   r$   r3   Únextr#   Úunlockr"   Úreplacer!   )r%   r   r   rJ   r   r&   r   s   &&    @r   r'   r'   f   së   ø€ õ 6äˆv�z‰z˜&Ó!×'Ð' RÓ(€DÜ�6—:‘:˜jÓ)×/Ð/¨RÓ0€HÜÔWÑ/Ô1ÓWÐY]Ó^€GØ‚Ü�C˜ $ Ð'JÐKÓLÐLßÜ�C˜Ð<Ó=Ð=ðØ�‰�xÕ ð Üˆs�V˜T :¨tÐ4Ó5Ð5øô	 ô GÜ�C˜œs 1›vŸ~™~¨h¸ÓEÓFÔFáûðGûñ ús0   ÂB8 Â8C4Ã%C/Ã(C4Ã)C7 Ã/C4Ã4C7 Ã7C:z
vault.lockc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   ~   s   € ÷ &ñ &”4ð &œDñ &r   c                ó‚   € ^ RI Hp VP                  R4      pT! V'       d   \        V4      MR4       \	        V RR/4      # )zIForget a manager's session token (or every one when ``name`` is omitted).r<   r   NÚlockedT)rC   r=   r3   r$   r!   )r%   r   r=   r   s   &&  r   r'   r'   |   s7   € õ 1à�:‰:�fÓ€DÙ—dŒˆTŒ Ô%Üˆs�X˜tÐ$Ó%Ð%r   z	vault.addc                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   ‰   s   € ÷ Gñ G”4ð GœDñ Gr   c           
     ó   € ^ RI HpHpHp VP	                  R4      p\        V\        4      '       d	   V'       g   \        V RR4      #  V! 4       P                  \        VP	                  R4      ;'       g    R4      \        VP	                  R4      ;'       g    R4      VP	                  R4      '       d   \        VP	                  R4      4      MR	VR
7      p\        V RVP                  /4      #   T d(   p\        T RT! \        T4      T4      4      u R	p?# R	p?i\         d(   p\        T RT! \        T4      T4      4      u R	p?# R	p?ii ; i)u  Add a vault item. ``secret`` values go straight into the encrypted store.

Params: ``kind`` (login|payment|address), ``label``, ``origin?``,
``secret`` (dict). Result: ``{id}`` â€” metadata only. Exception text is
scrubbed of secret values before it can reach a response or a log line.
)Ú
VaultErrorÚget_vault_storeÚscrub_secret_from_textÚsecretr   zsecret payload is requiredÚkindrA   ÚlabelÚoriginN)rX   rY   rZ   rW   Úid)Úagent.vault_storerT   rU   rV   r3   Ú
isinstancer	   r#   Úadd_itemr$   r!   r[   r"   )r%   r   rT   rU   rV   rW   r   r&   s   &&      r   r'   r'   ‡   s  € ÷ñ ð �Z‰Z˜Ó!€FÜ�fœd×#Ò#¯6Ü�C˜Ð;Ó<Ð<ðGÙÓ ×)Ñ)Ü�V—Z‘Z Ó'×-Ð-¨2Ó.Ü�f—j‘j Ó)×/Ð/¨RÓ0Ø17·±¸H×1EÒ1E”C˜Ÿ
™
 8Ó,Ô-È4Øð	 *ó 
ˆô �3˜˜tŸw™w˜Ó(Ð(øØô Gä�C˜Ñ5´c¸!³f¸fÓEÓFÕFûÜô GÜ�C˜Ñ5´c¸!³f¸fÓEÓFÕFûðGúsH   Á,C/ Á5"C/ ÂC/ Â59C/ Ã/EÃ6DÄEÄEÄ%EÄ&EÅEÅEzvault.removec                ó0   € V ^8„  d   QhR\         R\         /# r   r   )r
   s   "r   r   r   ª   s   € ÷ 
'ñ 
'”4ð 
'œDñ 
'r   c                ó"  €  ^ RI Hp \        VP                  R4      ;'       g    R4      pV'       g   \	        V RR4      # \        V RV! 4       P                  V4      /4      #   \         d!   p\	        T R\        T4      4      u Rp?# Rp?ii ; i)z7Remove a vault item by id. Result: ``{removed: bool}``.)rU   r[   rA   r   zid is requiredÚremovedN)r\   rU   r$   r3   r#   r!   Úremove_itemr"   )r%   r   rU   Úitem_idr&   s   &&   r   r'   r'   ¨   s{   € ð'Ý5ä�f—j‘j Ó&×,Ð,¨"Ó-ˆßÜ˜˜TÐ#3Ó4Ð4Ü�3˜¡OÓ$5×$AÑ$AÀ'Ó$JÐKÓLÐLøÜô 'Ü�C˜œs 1›vÓ&Õ&ûð'ús-   ‚"A# ¥A# ´A# Á!A# Á#BÁ.B	ÂBÂ	Bc                ó   € V ^8„  d   QhRR/# )r   r   N© )r
   s   "r   r   r   ·   s   € ÷ ñ ˜ñ r   c                ó0   € \         P                  V 4       R# )zCBind this module's handlers onto ``server``'s globals and registry.N)Ú	_registryÚinstall)Úservers   &r   Úregisterrj   ·   s   € ä×Ñ�fÖr   N)	Ú__doc__Ú
method_ctxr   rg   ÚmethodÚprofile_scopedÚ_profile_scopedr'   rj   re   r   r   Ú<module>rp      s  ðñõ6 (áÓ€	Ø	×	Ñ	€ð ×*Ñ*€ñ ˆÓØô'ó ó ð'ñ  ˆÓØô'ó ó ð'ñ  ÐÓØô8ó ó ð8ñ, ˆÓØô6ó ó ð6ñ( ˆÓØô&ó ó ð&ñ ˆÓØôGó ó ðGñ> ˆÓØô
'ó ó ð
'÷r   