+
    „WÝjtÎ  ã                  óÈ  a € 0 t $ R t^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
Ht ^ RIHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHtHtHtHtH t  ^ RI!H"t"H#t#H$t$H%t%H&t&H't'H(t(H)t)H*t*H+t+H,t,H-t-H.t.H/t/H0t0H1t1H2t2 ^ RI3H4t4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t<H=t= ^ RI>H?t?H@t@HAtA ^ RIBHCtCHDtDHEtE ^ RIFHGtGHHtHHItIHJtJHKtK ^ RILHMtMHNtNHOtOHPtPHQtQHRtR ]P¦                  ! ]T4      tURtVRtWRtX]P²                  ! ^R7      R R l4       tZ ! R R][4      t\ ! R R]\4      t]R t^R t_R R lt`R R  lta]b3R! R" lltcR# R$ ltdR% R& lteR' R( ltfR) R* ltgR+ R, lthR- R. ltiR/RR0R1/R2 R3 lltjR4 R5 ltkR6 R7 ltlR8 R9 ltmR:R1/R; R< lltn0 RámtoRâtpR= R> ltqR? R@ ltrRA RB ltsRC RD lttRE RF ltuRG RH ltvRI RJ ltwRK RL ltxRM RN ltyRO RP ltzRQ RR lt{RS RT lt|RUR1/RV RW llt}]Pü                  ! ]fRXRY4      t]Pü                  ! ]fRXRZ4      t€R[ R\ lt�R] R^ lt‚R_RãR`RRaRbRcRRdR/Re Rf lltƒ]„! RgRh04      t…Ri Rj lt†Rk Rl lt‡RäRm Rn lltˆR`R/Ro Rp llt‰Rq Rr ltŠ/ t‹Rs]ŒRt&   ]	EP                  ! 4       tŽRu Rv lt�RwRãR`R/Rx Ry llt�Rz R{ lt‘R| R} lt’R~ R lt“R€ R� lt”R‚ Rƒ lt•RäR„ R… llt–R† R‡ lt—Rˆ R‰ lt˜RŠ R‹ lt™RŒ R� ltš]„! 0 Råm4      t›RŽ R� ltœR� R‘ lt�R’ R“ ltžR” R• ltŸRæR—R–R˜RR™]„! 4       /Rš R› lllt ]Pü                  ! ]gRœR�R–Rž7      t¡]Pü                  ! ]gRŸR R¡Rž7      t¢]Pü                  ! ]hRœR�4      t£]Pü                  ! ]hRŸR 4      t¤R¢ R£ lt¥R¤ R¥ lt¦R¦R/R§ R¨ llt§R© Rª lt¨R« R¬ lt©R­ R® ltªRçR¯R1/R° R± lllt«R² R³ lt¬R´ t­Rµ t®R¶ t¯/ R·R¸ bR¹Rº bR»R¼ bR½R¾ bR¿]®bRÀRÁ bRÂRÃ bRÄRÅ bRÆRÇ bRÈRÉ bRÊRË bRÌRÍ bRbRÎ bRÏRÐ bRÑRÒ bRÓRÔ bRÕRÖ bR×RØ RÙ]¯RÚRÛ RÜRÝ RRÞ /Ct°Rß Rà lt±R# )èul  ``hermes plugins`` CLI subcommand â€” install, update, remove, and list plugins.

Facade: shared primitives (errors, console/config helpers, manifest reading, discovery, enable/disable
selection) and the dispatch table live here; each verb family lives in a ``plugins_cmd_<topic>.py``
sibling (install, update, remove, git, capabilities, toggle, listing, catalog).)ÚannotationsN)ÚPath)ÚAnyÚNoReturnÚOptional)Úget_hermes_homeÚhermes_home_key)Úcfg_get)Ú_child_dict)Úmasked_secret_prompt)Úrmtree_readonly)Ú_declared_capabilities_for_keyÚ$_declared_capabilities_from_manifestÚ_resolve_tool_override_grantÚ_run_capability_consentÚcmd_capabilities)Ú_EXACT_COMMIT_REÚ_canonical_sourceÚ_checkout_exact_revisionÚ_clone_plugin_repoÚ_git_head_revisionÚ_git_or_raiseÚ_git_pull_plugin_dirÚ_git_resolve_commitÚ_normalize_exact_revisionÚ_pin_annotationÚ_read_install_metadataÚ_run_plugin_gitÚ_safe_git_errorÚ_scrub_cloned_originÚ_update_install_recordÚ_write_install_metadataÚpinned_revision)
Ú_check_manifest_versionÚ_consent_python_depsÚ_display_after_installÚ_install_plugin_coreÚ_install_plugin_python_depsÚ_prompt_plugin_env_varsÚ_python_dependency_summaryÚ_read_manifest_for_installÚcmd_installÚdashboard_install_plugin)Ú_filter_plugin_entriesÚcmd_listÚcmd_show)Ú_remove_plugin_coreÚ
cmd_removeÚdashboard_remove_user_plugin)Ú_discover_context_enginesÚ_persist_plugin_selectionÚ_provider_categoriesÚ_run_composite_fallbackÚ
cmd_toggle)Ú_clear_plugin_bytecodeÚ	cmd_adoptÚcmd_check_updatesÚcmd_trust_update_urlÚ
cmd_updateÚdashboard_update_user_plugini,  i  zIOn a slow connection, raise plugins.clone_timeout_seconds in config.yaml.)Úmaxsizec               ó   € V ^8„  d   QhRR/# ©é   ÚreturnúOptional[str]© )Úformats   "ÚJC:\Users\johnn\AppData\Local\hermes\hermes-agent\hermes_cli\plugins_cmd.pyÚ__annotate__rG   @   s   € ÷ Jñ J ñ Jó    c                 óN  € \         P                  ! R4      p V '       d   V # \        P                  R8X  dÕ   \        P                  P                  RR4      \        P                  P                  RR4      .p\        P                  P                  RR4      pV'       d0   VP                  \        P                  P                  VR	4      4       V UUu. uF.  pR F%  p\        P                  P                  VR
VR4      NK'  	  K0  	  pppM. ROp\        R V 4       R4      # u uppi )zEResolve a git binary for subprocess use when ``PATH`` may be minimal.ÚgitÚntÚProgramFileszC:\Program FileszProgramFiles(x86)zC:\Program Files (x86)ÚLOCALAPPDATAÚ ÚProgramsÚGitzgit.exec              3  ó†   "  € T F7  q'       g   K  \         P                  P                  V4      '       g   K3  Vx € K9  	  R # 5i©N)ÚosÚpathÚisfile)Ú.0Úcs   & rF   Ú	<genexpr>Ú*_resolve_git_executable.<locals>.<genexpr>P   s%   é € ÐB™J�q«!”´·±·±¸q×0A—’›Jùs   ‚	A�"A·
AN)ÚcmdÚbin)z/usr/bin/gitz/usr/local/bin/gitz/bin/git)
ÚshutilÚwhichrS   ÚnameÚenvironÚgetÚappendrT   ÚjoinÚnext)ÚfoundÚrootsÚlocalÚrÚsubÚ
candidatess         rF   Ú_resolve_git_executablerj   ?   sÚ   € ô �LŠL˜Ó€EßØˆÜ	‡w�w�$„ä�J‰J�N‰N˜>Ð+>Ó?Ü�J‰J�N‰NÐ.Ð0IÓJð
ˆô —
‘
—‘˜~¨rÓ2ˆßØ�L‰LœŸ™Ÿ™ e¨ZÓ8Ô9ÙFKÔfÁeÀÓWeÐPS”b—g‘g—l‘l 1 e¨S°)Ö<ÑWeÑ<Áeˆ
Ñfˆ
âGˆ
ÜÑB™JÓBÀDÓIÐIùó gs   Ã4D!c                  ó>   a € ] tR t^StRtRtRR/R V 3R llltRtV ;t# )ÚPluginOperationErrora  Recoverable plugin install/update failure (CLI exits; HTTP maps to 4xx).

``failure_class`` names the raise site for the extension-install metric (a closed name from
``shared_metrics_contract.EXTENSION_PLUGIN_FAILURE_CLASSES``); untagged sites read ``other``.
ÚotherÚfailure_classNc               ó   € V ^8„  d   QhRR/# )rA   rn   rC   rD   )rE   s   "rF   rG   Ú!PluginOperationError.__annotate__\   s   € ÷ /ñ /¨]ñ /rH   c               	ó<   <€ \         SV `  ! V!   Ve	   Wn        R # R # rR   )ÚsuperÚ__init__rn   )Úselfrn   ÚargsÚ	__class__s   &$*€rF   rs   ÚPluginOperationError.__init__\   s!   ø€ Ü‰Ò˜$ÒØÒ$Ø!.Öñ %rH   ©rn   ©	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rn   rs   Ú__static_attributes__Ú__classcell__©rv   s   @rF   rl   rl   S   s%   ø† ñð €Mð/¸T÷ /÷ /ð /rH   rl   c                  ó:   a € ] tR t^btRtRtRR V 3R llltRtV ;t# )ÚPluginScanBlockedz6Plugin failed the security scan and was not installed.Úscan_blockedc               ó   € V ^8„  d   QhRR/# )rA   ÚmessageÚstrrD   )rE   s   "rF   rG   ÚPluginScanBlocked.__annotate__g   s   € ÷ 'ñ ' ñ 'rH   c                	ó2   <€ \         SV `  V4       W n        R # rR   )rr   rs   Úscan_result)rt   r†   rŠ   rv   s   &&&€rF   rs   ÚPluginScanBlocked.__init__g   s   ø€ Ü‰Ñ˜Ô!Ø&ÖrH   ©rŠ   rR   ry   r�   s   @rF   rƒ   rƒ   b   s   ø† Ù@à"€M÷'÷ 'ð 'rH   rƒ   c                 ó   € ^ RI Hp  V ! 4       # )z/A fresh Rich console (rich is imported lazily).©ÚConsole)Úrich.consoler�   rŽ   s    rF   Ú_consoler‘   l   s   € å$Ù‹9ÐrH   c                ó\   € ^ RI Hp V! R/ VB pV  F  w  rEVP                  WER7       K  	  V# )zMA Rich ``Table(**kwargs)`` with ``(header, style)`` *columns* added in order.)ÚTable)ÚstylerD   )Ú
rich.tabler“   Ú
add_column)ÚcolumnsÚkwargsr“   ÚtableÚheaderr”   s   &,    rF   Ú_tabler›   r   s2   € å Ù‰O�F‰O€EÛ ‰ˆØ×Ñ˜ÐÖ-ñ !à€LrH   c               ó   € V ^8„  d   QhRR/# ©rA   rB   ÚboolrD   )rE   s   "rF   rG   rG   {   s   € ÷ 6ñ 6�ñ 6rH   c                 óŠ   € \         P                  P                  4       ;'       d    \         P                  P                  4       # rR   )ÚsysÚstdinÚisattyÚstdoutrD   rH   rF   Ú_is_ttyr¤   {   s*   € Ü�9‰9×ÑÓ×5Ð5¤#§*¡*×"3Ñ"3Ó"5Ð5rH   c               ó    € V ^8„  d   QhRRRR/# )rA   r†   r‡   rB   r   rD   )rE   s   "rF   rG   rG      s   € ÷ ñ ˜Cð  Hñ rH   c                óT   € V P                  V4       \        P                  ! ^4       R# )zPrint *message* and exit 1.N)Úprintr    Úexit)Úconsoler†   s   &&rF   Ú_failrª      s   € à‡M�M�'ÔÜ‡H‚HˆQ†KrH   c               ó    € V ^8„  d   QhRRRR/# )rA   Úpromptr‡   rB   rž   rD   )rE   s   "rF   rG   rG   …   s   € ÷ "ñ "�Sð "¨4ñ "rH   c                ó†   €  V! V 4      P                  4       P                  4       pTR9   #   \        \        3 d     R# i ; i)z-One y/N question; EOF / Ctrl-C count as "no".F>   ÚyÚyes)ÚstripÚlowerÚEOFErrorÚKeyboardInterrupt)r¬   ÚreaderÚanswers   && rF   Ú_ask_yesr¶   …   sI   € ðÙ˜“×%Ñ%Ó'×-Ñ-Ó/ˆð �\Ñ!Ð!øô Ô'Ð(ô Úðús   ‚$+ «A ¿A c               ó$   € V ^8„  d   QhRRRRRR/# )rA   Úkeysr‡   Údefaultr   rB   rD   )rE   s   "rF   rG   rG   Ž   s!   € ÷ ñ ˜ð  sð ¨sñ rH   c                ó^   €  ^ RI Hp \        V! 4       .VO5RV / #   \         d    T u # i ; i)zORead ``keys`` from config.yaml; *default* on a missing key or any load failure.©Úload_configr¹   )Úhermes_cli.configr¼   r	   Ú	Exception)r¹   r¸   r¼   s   $* rF   Ú_config_valuer¿   Ž   s5   € ðÝ1Ü‘{“}Ð= tÒ=°WÑ=Ð=øÜô ØŠðús   ‚ œ,«,c               ó   € V ^8„  d   QhRR/# )rA   rB   ÚintrD   )rE   s   "rF   rG   rG   —   s   € ÷ 
ñ 
 ñ 
rH   c                 ó&  € \        RR\        R7      p \        V \        4      '       g   \        V \        4      '       d   V ^8  d!   \
        P                  R\        4       \        # V \        8”  d!   \
        P                  R\        4       \        # V # )zIDeadline for plugin clone and pinned fetch, scoped to the active profile.ÚpluginsÚclone_timeout_seconds©r¹   zCplugins.clone_timeout_seconds must be a positive integer; using %ssz3plugins.clone_timeout_seconds exceeds %ss; clamping)r¿   Ú_DEFAULT_CLONE_TIMEOUT_SECONDSÚ
isinstancerž   rÁ   ÚloggerÚwarningÚ_MAX_CLONE_TIMEOUT_SECONDS)Úvalues    rF   Ú_clone_timeout_secondsrÌ   —   sm   € ä˜)Ð%<ÔFdÔe€EÜ�%œ×Ò¤j°¼×&<Ò&<ÀÈÄ	Ü�‰Ð\Ü5ô	7ä-Ð-ØÔ)Ô)Ü�‰ÐLÔNhÔiÜ)Ð)Ø€LrH   c               ó    € V ^8„  d   QhRRRR/# )rA   r¸   r‡   rB   ÚsetrD   )rE   s   "rF   rG   rG   ¤   s   € ÷ <ñ <˜Cð < Cñ <rH   c                 ón   € \        V R. / p\        V\        4      '       d   \        V4      # \        4       # )zEA list-valued config key as a set (empty on any failure or non-list).r¹   )r¿   rÇ   ÚlistrÎ   )r¸   rË   s   * rF   Ú_config_name_setrÑ   ¤   s.   € ä˜4Ð,¨Ñ,€EÜ# E¬4×0Ò0Œ3ˆu‹:Ð;´c³eÐ;rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r¸   r‡   r¹   rB   rD   )rE   s   "rF   rG   rG   ª   s!   € ÷ <ñ <�sð < Sð <¨Sñ <rH   c                ó,   € \        VRV / ;'       g    T # )zDA string config key; empty/missing/failed reads coerce to *default*.r¹   )r¿   )r¹   r¸   s   $*rF   Ú_config_strrÔ   ª   s   € ä˜$Ð0¨Ñ0×;Ð;°GÐ;rH   c               ó(   € V ^8„  d   QhRRRRRRRR/# )rA   Úsectionr‡   ÚkeyrË   r   rB   ÚNonerD   )rE   s   "rF   rG   rG   ¯   s(   € ÷ ñ  ð ¨3ð °sð ¸tñ rH   c                ó\   € ^ RI HpHp V! 4       pW%P                  V / 4      V&   V! V4       R# )zOPersist ``config[section][key] = value`` to config.yaml (creating the section).©r¼   Úsave_configN)r½   r¼   rÛ   Ú
setdefault)rÖ   r×   rË   r¼   rÛ   Úconfigs   &&&   rF   Ú_write_config_valuerÞ   ¯   s)   € ç:Ù‹]€FØ*/×Ñ�g˜rÓ" 3Ñ'Ù�ÖrH   c               ó   € V ^8„  d   QhRR/# r�   rD   )rE   s   "rF   rG   rG   ·   s   € ÷ Kñ K $ñ KrH   c                 ó0   € \        \        RRRR7      4      # )zaInstall/update-time security scanning; on by default, off via ``plugins.scan_on_install: false``.rÃ   Úscan_on_installTrÅ   )rž   r¿   rD   rH   rF   Ú_scan_on_install_enabledrâ   ·   s   € ä”˜iÐ):ÀDÔIÓJÐJrH   Úscan_decision_cbÚreviewed_pinFc               ó(   € V ^8„  d   QhRRRRRRRR/# )rA   Ú
plugin_dirr   Ú
identifierr‡   Úforcerž   rä   rD   )rE   s   "rF   rG   rG   ¼   s)   € ÷ %ñ % $ð %°Cð %À4ð %Ø$(ñ%rH   c               óˆ  € \        4       '       g   R# ^ RIHpHpHp V! WR7      pV! W‚R7      w  ršV	f   V'       d   RRr©V	f   Ve    V! V4      '       d   Rp	Rp
V	RJd   \        R	V
 R
V! V4       R2VR7      h\        P                  RV P                  V
4       V#   \
         d    \        P                  R4        Lei ; i)uh  Scan *plugin_dir* and enforce the install policy.

Verdicts: safe â†’ proceed; caution â†’ needs confirmation (``force=True`` or a truthy
``scan_decision_cb(result)``); dangerous â†’ always blocked (:class:`PluginScanBlocked`).
*reviewed_pin* marks a tree checked out at a curated-catalog sha: that exact tree passed
the same scanner at admission with a human reading the caution findings, so caution is
accepted without a prompt (the Desktop has none). Dangerous still blocks â€” a signature
added after review is exactly the case the backstop exists for.
Returns the ScanResult, or None when scanning is disabled.
N)Úformat_scan_reportÚscan_pluginÚshould_allow_plugin_install)Úsource©rè   Tz.Caution verdict accepted: reviewed catalog pinz Caution verdict accepted by userz$plugin scan decision callback failedz&Security scan blocked plugin install: ú

z‘
Review the findings above. Install only plugins from sources you trust. (Scanning can be configured via plugins.scan_on_install in config.yaml.)rŒ   zplugin scan passed for %s: %s)râ   Útools.plugin_guardrê   rë   rì   r¾   rÈ   Ú	exceptionrƒ   Úinfor^   )ræ   rç   rè   rã   rä   rê   rë   rì   ÚresultÚallowedÚreasons   &&$$$      rF   Ú_scan_plugin_treerö   ¼   sÙ   € ô $×%Ò%Ùß_Ñ_Ù˜Ô7€FÙ1°&ÔF�O€GØ‚Ÿ<ØÐ P�à‚Ð+Ò7ð	EÙ ×'Ò'Ø�Ø;�ð �dÓÜØ4°V°H¸DÙ! &Ó)Ð*ð +7ð7ð
 ô ð 	 ô ‡K�KÐ/°·±À&ÔIØ€Møô ô 	EÜ×ÑÐCÖDð	Eús   Á	B ÁB Â CÃ Cc               ó$   € V ^8„  d   QhRRRRRR/# )rA   Úexcrƒ   Úmergedz	list[str]rB   r‡   rD   )rE   s   "rF   rG   rG   ä   s"   € ÷ 
ñ 
Ð0ð 
¸)ð 
Èñ 
rH   c                ó*  € \        V4      pV P                  e   V P                  P                  MRp\        V Uu0 uF!  qDP                  V9   g   K  VP                  kK#  	  up4      pV'       d   RRP                  V4       R2pMRpV  RV 2# u upi )zXScan-block text for a tree that also holds user files preserved from the installed copy.zGThese findings come from user files preserved from the installed copy: z, z+. Move or remove them and retry the update.zGThe scanned tree included user files preserved from the installed copy.rï   rD   )rÎ   rŠ   ÚfindingsÚsortedÚfilerb   )rø   rù   Ú	preservedrû   ÚfÚhitsÚnotes   &&     rF   Ú_preserved_files_noter  ä   s‹   € ä�F“€IØ+.¯?©?Ò+Fˆs�‰×'Ò'ÈB€HÜ¡8ÓC¡8˜a¯v©v¸Ñ/B”6�1—6”6¡8ÑCÓD€DßØYØ—9‘9˜T“?Ð#Ð#NðP‰ð YˆØˆU�$�t�fÐÐùò Ds   »BÁBc               ó$   € V ^8„  d   QhRRRRRR/# )rA   ræ   r   rç   r‡   rù   zOptional[list[str]]rD   )rE   s   "rF   rG   rG   ñ   s'   € ÷ jñ j $ð j°Cð jÐATñ jrH   c                ó–   €  \        W3/ VB #   \         d0   pT'       g   h \        \        YB4      TP                  R7      ThRp?ii ; i)zý:func:`_scan_plugin_tree` for a candidate that may hold carried user files (*merged*).

A block then names the findings that sit in those files, so user data does not read as a
malicious upstream revision; the original block stays chained as the cause.
rŒ   N)rö   rƒ   r  rŠ   )ræ   rç   rù   r˜   rø   s   &&&, rF   Ú_scan_merged_treer  ñ   sM   € ðjÜ  ÑB¸6ÑBÐBøÜô jßØÜÔ 5°cÓ BÐPS×P_ÑP_Ô`ÐfiÐiûðjús   ‚ ŽA™*AÁAc               ó   € V ^8„  d   QhRR/# )rA   rB   r   rD   )rE   s   "rF   rG   rG   ÿ   s   € ÷ ñ �dñ rH   c                 óN   € \        4       R,          p V P                  RRR7       V # )z9Return the user plugins directory, creating it if needed.rÃ   T)ÚparentsÚexist_ok)r   Úmkdir)rÃ   s    rF   Ú_plugins_dirr  ÿ   s$   € äÓ )Õ+€GØ‡M�M˜$¨€MÔ.Ø€NrH   Úallow_subdirc               ó(   € V ^8„  d   QhRRRRRRRR/# )rA   r^   r‡   Úplugins_dirr   r  rž   rB   rD   )rE   s   "rF   rG   rG     s)   € ÷ ñ  ð °$ð Èð ÐZ^ñ rH   c               ó¤  € V'       d   V '       d   V P                  R4      p V '       g   \        R4      hV R	9   d   \        RV  R24      hV'       d   R
MR F  pW09   g   K  \        RV  RV R24      h	  W,          P                  4       pVP                  4       pWE8X  d   \        RV  R24      hWTP                  9  d   \        RV  R24      hV# )u`  Validate a plugin name and return the safe target path inside *plugins_dir*.

Raises ``ValueError`` on traversal or a target outside the plugins directory. ``allow_subdir``
permits forward slashes so category keys like ``web/firecrawl`` can be looked up
(``..`` and backslashes stay rejected); install paths keep ``False`` â€” a clone lands top-level.
Ú/zPlugin name must not be empty.zInvalid plugin name 'z3': must not reference the plugins directory itself.z': must not contain 'z'.z,': resolves to the plugins directory itself.z*': resolves outside the plugins directory.>   Ú.ú..)Ú\r  )r  r  r  )r°   Ú
ValueErrorÚresolver  )r^   r  r  ÚbadÚtargetÚplugins_resolveds   &&$   rF   Ú_sanitize_plugin_namer    sÜ   € ÷ ŸØ�z‰z˜#‹ˆßÜÐ9Ó:Ð:Øˆ{ÔÜÐ0°°Ð6iÐjÓkÐkß+‰|Ð1BÒBˆØŽ;ÜÐ4°T°FÐ:OÐPSÈuÐTVÐWÓXÐXñ Cð Õ ×)Ñ)Ó+€FØ"×*Ñ*Ó,ÐØÔ!ÜÐ0°°Ð6bÐcÓdÐdØŸ~™~Ô-ÜÐ0°°Ð6`ÐaÓbÐbØ€MrH   c               ó    € V ^8„  d   QhRRRR/# )rA   rç   r‡   rB   ztuple[str, Optional[str]]rD   )rE   s   "rF   rG   rG   &  s   € ÷ $)ñ $) ð $)Ð)Bñ $)rH   c                ó.  € V P                  \        4      '       Ed®   V P                  R4      '       Ed   V \        R4      R pVP                  R^4      ^ ,          P                  R^4      ^ ,          P	                  R4      pVP                  R4      p\        V4      ^8¼  d­   \        VR,          4      '       d•   V^,          \        9   dƒ   V^,          P                  R4      pRpV^,          R8X  dI   \        V4      ^8¼  d9   RP                  R	 VR
,           4       4      P	                  R4      ;'       g    RpRV^ ,           RV R2V3# RV 9   d1   V P                  R4      w  rVpYWP	                  R4      ;'       g    R3# V P                  R4      w  rXpV'       d%   VR,           VP	                  R4      ;'       g    R3# V R3# V P                  R4      w  rp	V P	                  R4      P                  R4       U
u. uF  qª'       g   K  V
NK  	  pp
\        V4      ^8¼  d^   RP                  . VR,          OV	P                  R4      O4      P	                  R4      pRV^ ,           RV^,           R2T;'       g    R3# \        RV  R24      hu up
i )z¡Turn an identifier into a cloneable Git URL and optional subdirectory.

``http://`` and ``file://`` are accepted but trigger a security warning at install time.
zhttps://github.com/NÚ?Ú#r  :NrA   Nú.gitÚtreec              3  ó8   "  € T F  q'       g   K  Vx € K  	  R # 5irR   rD   )rV   Úps   & rF   rX   Ú#_resolve_git_url.<locals>.<genexpr>4  s   é € Ð%@±¨A»a§a¢a³ùs   ‚	�
:é   NNz.git/:rA   NNzInvalid plugin identifier: 'zi'. Use a Git URL or 'owner/repo' shorthand (optionally with a subdirectory: 'owner/repo/path/to/plugin').)Ú
startswithÚ_URL_SCHEMESÚlenÚsplitr°   ÚallÚ_GITHUB_BROWSER_SEGMENTSÚremovesuffixrb   Ú	partitionr  )rç   rT   ÚpartsÚrepoÚsubdirÚgit_urlÚ_ÚfragÚmarkerÚfragmentr!  s   &          rF   Ú_resolve_git_urlr4  &  s^  € ð
 ×Ñœ\×*Ó*Ø× Ñ Ð!6×7Ó7ØœcÐ"7Ó8Ð:Ð;ˆDØ—:‘:˜c 1Ó% aÕ(×.Ñ.¨s°AÓ6°qÕ9×?Ñ?ÀÓDˆDØ—J‘J˜s“OˆEÜ�5‹z˜QŒ¤3 u¨R¥y§>¢>°e¸AµhÔBZÔ6ZØ˜Q•x×,Ñ,¨VÓ4�Ø�Ø˜•8˜vÔ%¬#¨e«*¸¬/Ø ŸX™XÑ%@°°r¶Ó%@Ó@×FÑFÀsÓK×SÐSÈt�FØ,¨U°1­X¨J°a¸°v¸TÐBÀFÐJÐJð �*ÔØ)×3Ñ3°CÓ8ÑˆG˜ØŸZ™Z¨›_×4Ð4°Ð5Ð5à",×"6Ñ"6°wÓ"?Ñˆ˜ßØ˜VÕ# f§l¡l°3Ó&7×&?Ð&?¸4Ð@Ð@Ø˜4ÐÐð )×2Ñ2°3Ó7Ñ€J�8Ø"×(Ñ(¨Ó-×3Ñ3°CÔ8Ó>Ñ8�1»A�QˆQÑ8€EÐ>Ü
ˆ5ƒz�Q„Ø—‘Ð<˜E "�IÐ<¨¯©°sÓ(;Ð<Ó=×CÑCÀCÓHˆØ$ U¨1¥X J¨a°°aµ¨z¸Ð>ÀÇÀÈ4ÐPÐPÜ
Ø
& z lð 3(ð 	(ó)ð )ùò	 ?s   È 	JÈJc               ó$   € V ^8„  d   QhRRRRRR/# )rA   Ú
clone_rootr   r.  r‡   rB   rD   )rE   s   "rF   rG   rG   M  s!   € ÷ ñ  tð °Sð ¸Tñ rH   c                ó<  € V P                  4       p W,          P                  4       pW 8w  d"   WP                  9  d   \        RV R2RR7      hVP                  4       '       g   \        RV R2RR7      hVP	                  4       '       g   \        RV R2RR7      hV# )z°Resolve ``subdir`` inside ``clone_root``; ``..``, absolute paths and symlinks may not
escape the clone. Raises ``PluginOperationError`` if it escapes, is missing, or is a file.zPlugin subdirectory 'z' escapes the repository.Úinvalid_sourcerx   z#' does not exist in the repository.z' is not a directory.)r  r  rl   ÚexistsÚis_dir)r6  r.  Ú	candidates   && rF   Ú_resolve_subdir_withinr<  M  sµ   € ð ×#Ñ#Ó%€JØÕ$×-Ñ-Ó/€IØÔ :×5FÑ5FÔ#FÜ"Ð%:¸6¸(ÐB[Ð#\Ø1AôCð 	Cà×Ñ×ÒÜ"Ð%:¸6¸(ÐBeÐ#fØ1AôCð 	Cà×Ñ×ÒÜ"Ð%:¸6¸(ÐBWÐ#XØ1AôCð 	CàÐrH   c               ó    € V ^8„  d   QhRRRR/# )rA   Úurlr‡   rB   rD   )rE   s   "rF   rG   rG   ^  s   € ÷ ñ ˜Sð  Sñ rH   c                óâ   € V P                  R4      P                  R4      P                  R^4      R,          pRV9   d1   VP                  R^4      R,          P                  R^4      R,          pV# )zZRepo name from a Git URL (last path component; ssh-style ``git@host:repo`` splits on ':').r  r  Ú:éÿÿÿÿ)Úrstripr*  Úrsplit)r>  r^   s   & rF   Ú_repo_name_from_urlrD  ^  s_   € à�:‰:�c‹?×'Ñ'¨Ó/×6Ñ6°s¸AÓ>¸rÕB€DØ
ˆd„{Ø�{‰{˜3 Ó" 2Õ&×-Ñ-¨c°1Ó5°bÕ9ˆØ€KrH   c               ó    € V ^8„  d   QhRRRR/# )rA   ræ   r   rB   úOptional[Path]rD   )rE   s   "rF   rG   rG   f  s   € ÷ Xñ X dð X¨~ñ XrH   c                ót   € ^ RI Hp  V! V 4      #   \         d   p\        \	        T4      RR7      ThRp?ii ; i)zT``plugin.yaml`` (or ``plugin.yml``) under *plugin_dir*, or None when neither exists.)Únative_manifest_fileÚmanifest_invalidrx   N)Úpm.plugin_declarationsrH  r  rl   r‡   )ræ   rH  rø   s   &  rF   Ú_native_manifest_filerK  f  s=   € å;ðXÙ# JÓ/Ð/øÜô XÜ"¤3 s£8Ð;MÔNÐTWÐWûðXús   ˆ �7›2²7c               ó    € V ^8„  d   QhRRRR/# )rA   ræ   r   rB   rž   rD   )rE   s   "rF   rG   rG   p  s   € ÷ @ñ @ tð @°ñ @rH   c                ód   € V R,          pVP                  4       ;'       g    VP                  4       # )zUTrue when ``plugin.json`` exists (or is a symlink, even dangling) under *plugin_dir*.úplugin.json)r9  Ú
is_symlink)ræ   Úportable_files   & rF   Ú_has_portable_manifestrQ  p  s,   € à Õ.€MØ×ÑÓ!×?Ð? ]×%=Ñ%=Ó%?Ð?rH   c               ó   € V ^8„  d   QhRR/# )rA   Úmanifest_filer   rD   )rE   s   "rF   rG   rG   v  s   € ÷ /ñ / tñ /rH   c                ó   € ^ RI Hp V! V 4      # )zZ``yaml.safe_load`` of *manifest_file* (``{}`` when empty); raises on any read/parse error.)Úread_native_manifest)rJ  rU  )rS  rU  s   & rF   Ú_load_yaml_manifestrV  v  s   € å;á Ó.Ð.rH   c               ó    € V ^8„  d   QhRRRR/# )rA   ræ   r   rB   ÚdictrD   )rE   s   "rF   rG   rG   }  s   € ÷ ñ ˜tð ¨ñ rH   c                óJ  € \        V 4      pVf*   \        V 4      '       g   / #  ^ RIHp V! V 4      ^ ,          #  \        V4      #   \         d#   p\
        P                  RY4       / u Rp?# Rp?ii ; i  \         d#   p\
        P                  RY4       / u Rp?# Rp?ii ; i)z;Read a native or portable manifest, preferring native YAML.N©Úread_agent_plugin_manifestz$Failed to read plugin.json in %s: %sz$Failed to read plugin.yaml in %s: %s)rK  rQ  Úhermes_cli.agent_pluginsr[  r¾   rÈ   rÉ   rV  )ræ   rS  r[  Úes   &   rF   Ú_read_manifestr^  }  s•   € ä)¨*Ó5€MØÒÜ% j×1Ò1ØˆIð	ÝKÙ-¨jÓ9¸!Õ<Ð<ðÜ" =Ó1Ð1øô	 ô 	Ü�N‰NÐAÀ:ÔQØ�Iûð	ûô
 ô Ü�‰Ð=¸zÔMØ�	ûðús:   ¤A º
A5 ÁA2ÁA-Á'A2Á-A2Á5B"Â BÂB"ÂB"c               ó    € V ^8„  d   QhRRRR/# )rA   r  r   rB   rž   rD   )rE   s   "rF   rG   rG   �  s   € ÷ .ñ . 4ð .¨Dñ .rH   c                ó˜   € \        V 4      RJ;'       g7    V R,          P                  4       ;'       g    V R,          P                  4       # )zOTrue when *target* has a native/portable manifest or a package ``__init__.py``.NrN  z__init__.py)rK  r9  )r  s   &rF   Ú_looks_like_plugin_dirra  �  sL   € ô 	˜fÓ%¨TÐ1÷ 	-ð 	-Ø�]Õ"×*Ñ*Ó,÷	-ð 	-à�]Õ"×*Ñ*Ó,ð.rH   c               ó    € V ^8„  d   QhRRRR/# )rA   ræ   r   rB   rØ   rD   )rE   s   "rF   rG   rG   ˜  s   € ÷ `ñ ` Dð `°dñ `rH   c                ót  € V P                  R4       Fh  pVP                  pW,          pVP                  4       '       d   K/   \        P                  ! W$4       VP                  RV RVP                   R24       Kj  	  R#   \         d-   pTP                  RTP                   RT 24        Rp?K   Rp?ii ; i)z�Copy ``*.example`` files to their real names (``config.yaml.example`` -> ``config.yaml``),
never overwriting an existing file so reinstall keeps user config.z	*.examplez[dim]  Created z from ú[/dim]z)[yellow]Warning:[/yellow] Failed to copy z: N)ÚglobÚstemr9  r\   Úcopy2r§   r^   ÚOSError)ræ   r©   Úexample_fileÚ	real_nameÚ	real_pathr]  s   &&    rF   Ú_copy_example_filesrl  ˜  s«   € ð #Ÿ™¨Ö4ˆØ ×%Ñ%ˆ	ØÕ*ˆ	Ø×Ñ×ÒÙð	`Ü�LŠL˜Ô1Ø�M‰M˜O¨I¨;°f¸\×=NÑ=NÐ<OÈvÐVÖWó 5øô ô 	`Ø�M‰MÐEÀl×FWÑFWÐEXÐXZÐ[\ÐZ]Ð^×_Ò_ûð	`ús   Á8B Â B7Â!B2Â2B7c               ó    € V ^8„  d   QhRRRR/# )rA   ÚmanifestrX  rB   z
list[dict]rD   )rE   s   "rF   rG   rG   §  s   € ÷ Bñ B ð B¨*ñ BrH   c                óœ  € V P                  R4      ;'       g    .  Uu. uFf  p\        V\        4      '       g2   \        V\        4      '       g   K1  VP                  R4      '       g   KJ  \        V\        4      '       d   RV/MTNKh  	  ppV'       g   . # ^ RIHp V Uu. uF  qC! VR,          4      '       d   K  VNK  	  up# u upi u upi )z²``requires_env`` entries (plain names or ``{name, description, url, secret}`` dicts,
normalised to dicts; nameless entries dropped) whose variable is unset in ``~/.hermes/.env``.Úrequires_envr^   )Úget_env_value)r`   rÇ   r‡   rX  r½   rq  )rn  ÚentryÚ	env_specsrq  Úss   &    rF   Ú_missing_env_specsru  §  s°   € ð
 —\‘\ .Ó1×7Ð7°RÐ7óá7ˆEÜ�eœS×!Ò!¤j°¼×&=ô 	=àBGÇ)Á)ÈF×BSô 	=œ: e¬S×1Ò1ˆ�‰°uÒ<Ù7ð ð ÷
 Øˆ	Ý/Ù ÓA‘y�!¨°a¸µi×(@�AˆA‘yÑAÐAùòùò Bs   ž.CÁCÁ* CÂ C	Â;C	c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r/  r‡   Ú	git_errorrB   rD   )rE   s   "rF   rG   rG   µ  s!   € ÷ 	5ñ 	5 Cð 	5°Cð 	5¸Cñ 	5rH   c                óF   € ^ RI Hp RV  RV! VP                  4       4       2# )zÖPlain-words clone failure: what to check (address, network, private repo), raw git text last.

The text reaches ``_fail`` -> Rich ``console.print``: escape the git output so ``[...]`` in it is
not parsed as markup.©Úescapez#Could not download the plugin from zÙ. Check the address (browse the catalog with `hermes plugins search`), check your internet connection, or, if the repository is private, sign in first with `gh auth login` (or set GITHUB_TOKEN in your .env).
Details: )Úrich.markuprz  r°   )r/  rw  rz  s   && rF   Ú_clone_failure_messager|  µ  s1   € õ
 #Ø1°'°ð ;ñ ˜yŸ™Ó0Ó1Ð2ð4ð 5rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r^   r‡   r  r   rB   rD   )rE   s   "rF   rG   rG   Á  s!   € ÷ 
ñ 
 Cð 
°dð 
Èñ 
rH   c                óè   €  \        WRR7      pXP                  4       '       g'   \	        V 4      pVf   \        V\        V RR7      4       V#   \         d   p\        TRT 24        Rp?L]Rp?ii ; i)z\The plugin path if it exists; else exit 1 (invalid name, or a listing of installed plugins).T©r  ú[red]Error:[/red] N)Údownloaded_only)r  r  rª   r9  Ú_resolved_user_plugin_dirÚ_unknown_plugin_message)r^   r  r©   r  r]  s   &&&  rF   Ú_require_installed_pluginr„  Á  sm   € ð1Ü& tÀtÔLˆð �=‰=�?Š?Ü*¨4Ó0ˆØŠ>Ü�'Ô2°4ÈÔNÔOØ€Møô ô 1ÜˆgÐ+¨A¨3Ð/×0Ñ0ûð1ús   ‚A ÁA1ÁA,Á,A1r�  c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r^   r‡   r�  rž   rB   rD   )rE   s   "rF   rG   rG   Î  s&   € ÷ 	Bñ 	B #ð 	B¸4ð 	BÈCñ 	BrH   c               óh   € V'       d   RMRp^ RI Hp V! V 4      ;p'       d	   RV  RV 2# RV  RV R2# )zV``No plugin named ...`` with the exact-name rule and the two commands that resolve it.z] This command only works on downloaded plugins; bundled ones can only be enabled or disabled.z1 Bundled plugins can only be enabled or disabled.)Úmoved_plugin_hintz[red]No plugin named 'z	'.[/red] zr'.[/red] Run `hermes plugins list` to see the exact names (nested plugins use their full key, e.g. web/firecrawl).z3 To add one: `hermes plugins install <owner/repo>`.)Úhermes_cli.left_core_migrationr‡  )r^   r�  Úscoper‡  Úmoveds   &$   rF   rƒ  rƒ  Î  s`   € ÷  ñ mØ%Xð 
å@Ù! $Ó'Ð'€uÖ'Ø'¨ v¨Y°u°gÐ>Ð>Ø$ T Fð +GØGLÀgð NAðAð BrH   rÃ   ÚdisabledÚenabledc               ó    € V ^8„  d   QhRRRR/# )rA   rŒ  rÎ   rB   rØ   rD   )rE   s   "rF   rG   rG   ß  s   € ÷ ñ ˜sð  tñ rH   c                ó    € ^ RI Hp V! 4        R# )zHFrozen old-updater import: never resurrect a raw plugin-selection write.)Ústop_for_relaunchN)Úhermes_cli._old_updaterr�  )rŒ  r�  s   & rF   Ú_save_enabled_setr‘  ß  s   € å9áÖrH   c               ó   € V ^8„  d   QhRR/# )rA   rB   r‡   rD   )rE   s   "rF   rG   rG   æ  s   € ÷ Cñ C 3ñ CrH   c                 óP   € ^ RI Hp  V ! \        4       R,          4      ;'       g    R# )é    ©Ú_digestzconfig.yamlÚmissing)Úhermes_cli.runtime_stater–  r   r•  s    rF   Ú_plugin_selection_versionr™  æ  s    € Ý0Ù”?Ó$ }Õ4Ó5×BÐB¸ÐBrH   Ú
extra_dirsr©   ÚactionÚenableÚexpected_configÚpluginc          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rA   rŒ  rÎ   r‹  r›  r‡   rž  rC   rB   rØ   rD   )rE   s   "rF   rG   rG   ë  s6   € ÷ !ñ !Øð!Øð!ØILð!àð!ð 
ñ!rH   c          	     óN  € ^ RI Hp ^ RIHpHp	Hp
  V
! W\        4       W%VR7       R#   T	 d?   pTe5   TP                  RT! \        T4      4       24       TP                  R4       h Rp?iT d3   pTe)   TP                  RT RT 24       TP                  R4       h Rp?ii ; i)	u  ONE admission authority for proposed enabled/disabled sets (C13):
the candidate union is resolved against the ACTIVE environment and
the config commits inside the same worker-owned PM transaction â€” a refusal or a config-write failure
publishes nothing: previous config bytes AND previous environment
stay exactly in place. Raises :class:`AdmissionRefused` (UI callers
catch and surface it â€” admission never auto-disables to fit); a resolver
conflict raises its :class:`DependencyConflict` subclass naming *plugin*.ry  )ÚAdmissionRefusedÚDependencyConflictÚadmit_plugin_set_change)Úactive_plugins_dirrš  r�  rž  Nu   [red]âœ—[/red] z@[dim]config.yaml and the active environment are unchanged.[/dim]z
 refused: z}[dim]config.yaml and the active environment are unchanged. Run `hermes pm install` to resolve dependencies, then retry.[/dim])	r{  rz  Úhermes_cli.plugins_admissionr¡  r¢  r£  r  r§   r‡   )rŒ  r‹  rš  r©   r›  r�  rž  rz  r¡  r¢  r£  rø   s   &&$$$$$     rF   Ú_admit_and_save_plugin_setsr¦  ë  sª   € õ #çjÑjðÙØ´,³.ÈZØ÷	
øð ô àÒØ�M‰M˜O©F´3°s³8Ó,<Ð+=Ð>Ô?Ø�M‰MÐ\Ô]ØûØô ØÒØ�M‰M˜O¨F¨8°:¸c¸UÐCÔDØ�M‰MðUôð 	ûðús&   ’( ¨B$¯9A(Á(B$Á1B$Á2-BÂB$Úbasiczdashboard_auth/basicc               ó    € V ^8„  d   QhRRRR/# )rA   ÚcfgrX  rB   rž   rD   )rE   s   "rF   rG   rG     s   € ÷ ñ °Dð ¸Tñ rH   c                ó&  € V P                  R4      p\        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d   \	        V4      \
        ,          '       g   R# \        \	        V4      \
        ,
          4      VR&   R# )a	  Drop the bundled basic dashboard-auth plugin from ``plugins.disabled`` in *cfg*.

``hermes setup`` / ``hermes plugins disable basic`` can park it there while
``dashboard.basic_auth`` is configured, and password auth then silently fails.
Returns True when modified.
rÃ   r‹  NFT)r`   rÇ   rX  rÐ   rÎ   Ú_BASIC_AUTH_PLUGIN_KEYSrü   )r©  Úplugins_cfgr‹  s   &  rF   Ú*ensure_basic_auth_plugin_enabled_in_configr­    sj   € ð —'‘'˜)Ó$€KÜ.8¸Äd×.KÒ.Kˆ{�‰˜zÔ*ÐQU€HÜ�h¤×%Ò%¬c°(«mÔ>U×.UÔ.UÙÜ$¤S¨£]Ô5LÕ%LÓM€K�
ÑÙrH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   ÚnamesrÎ   r×   r‡   rB   rØ   rD   )rE   s   "rF   rG   rG   "  s!   € ÷ &ñ & ð &¨3ð &°4ñ &rH   c                óv   € V P                  V4       V P                  VP                  R4      R,          4       R# )z‹Drop *key* and its bare leaf (``web/exa`` -> ``exa``) from *names*, so a
stale legacy bare-name entry can't keep vetoing the canonical key.r  NrA  )Údiscardr'  )r¯  r×   s   &&rF   Ú_discard_key_and_leafr²  "  s)   € ð 
‡M�M�#ÔØ	‡M�M�#—)‘)˜C“. Õ$Ö%rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r×   r‡   ÚentrieszOptional[list]rB   rÎ   rD   )rE   s   "rF   rG   rG   )  s!   € ÷ ñ ˜ð  ~ð Àñ rH   c                óª   a € ^ RI Hp S S P                  R4      R,          0V! S 4      mpTP                  V 3R lVf   \	        4       MT 4       4       V# )ag  Every spelling a config list may hold for *key*: the key, its bare leaf and the manifest name.
The loader matches BOTH the canonical key (``web/firecrawl``) and the manifest name
(``web-firecrawl``), so a stale entry under any form vetoes an enable ("explicit disable wins").
Pass *entries* to reuse one :func:`_discover_all_plugins` scan across several keys.)Úlegacy_plugin_keysr  c              3  óT   <"  € T F  q^,          S8X  g   K  V^ ,          x € K  	  R# 5i)é   NrD   )rV   r]  r×   s   & €rF   rX   Ú"_plugin_aliases.<locals>.<genexpr>0  s'   øé € ÐhÑ W˜!Ð^_Õ\`ÐdgÑ\g”��1—’Ó Wùs   ƒ(—(rA  )rˆ  r¶  r'  ÚupdateÚ_discover_all_plugins)r×   r´  r¶  r¯  s   f&  rF   Ú_plugin_aliasesr¼  )  sP   ø€ õ
 BØ�#—)‘)˜C“. Õ$Ð?Ñ'9¸#Ó'>Ð?€EØ	‡L�LÔh¸7º?Ô 5Ô 7ÐPWÐ WÓhÔhØ€LrH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r×   r‡   rœ  rž   rB   rD   )rE   s   "rF   rG   rG   4  s!   € ÷ ñ �sð  tð ¸dñ rH   c               ó¨   € \        4       \        4       rC\        V 4      pV'       d   W43MWC3w  rgW9   d   WW,          '       g   R# \        WWRR7       R# )aF  Transactionally persist canonical *key*, purging aliases from the opposing list.

False when the lists already say so (nothing written). PM owns the selection and dependency
publication together, so every CLI/dashboard activation surface goes through the same admission
transaction instead of writing ``config.yaml`` directly.F)rœ  Úaliasesr©   T)Ú_get_enabled_setÚ_get_disabled_setr¼  Ú_set_plugin_enabled)r×   rœ  r©   rŒ  r‹  r¿  r  rm   s   &$$     rF   Ú_activate_keyrÃ  4  sH   € ô )Ó*Ô,=Ó,?ˆXÜ˜cÓ"€Gß+1�WÑ'¸Ð7J�M€FØ
„}˜gŸoœoÙÜ˜°GÕMÙrH   c               ó    € V ^8„  d   QhRRRR/# )rA   r¿  rÎ   rB   údict[str, Any]rD   )rE   s   "rF   rG   rG   C  s   € ÷ ñ  3ð ¨>ñ rH   c                óø  € ^ RI HpHp V! 4       pRp/ pVP                  R4      p\	        V\
        4      '       dÈ   R
 Fe  pVP                  V4      p\	        V\        4      '       g   K,  V \        V4      ,          '       g   KF  \        \        V4      V ,
          4      Wg&   RpKg  	  VP                  R4      p	\	        V	\
        4      '       d6   V \        V	4      ,          '       d   V \        V	4      ,           F  p
Wš K  	  RpVP                  R4      p\	        V\
        4      '       dB   \        VP                  R4      ;'       g    R4      P                  4       V 9   d   RVR&   RR	R/rTV'       d	   V! V4       V# )a(  Drop every trace of a removed plugin (its :func:`_plugin_aliases`, taken BEFORE the tree went)
from config.yaml: allow/deny-list entries, ``plugins.entries.<id>`` grants and a ``memory.provider``
selection naming it. A later reinstall under the same name must start from the "Enable now?"
decision, not inherit a stale enable or grant (#54336); a dangling ``memory.provider`` would make
the next agent init re-clone the plugin from the catalog, silently undoing the uninstall.
Returns ``{"cleared_memory_provider": True}`` when the selection was reset.rÚ   FrÃ   Tr´  ÚmemoryÚproviderrN   Úcleared_memory_provider)rŒ  r‹  )r½   r¼   rÛ   r`   rÇ   rX  rÐ   rÎ   rü   r‡   r°   )r¿  r¼   rÛ   rÝ   Úchangedró   r¬  Úlist_keyr¯  r´  ÚaliasÚ
memory_cfgs   &           rF   Ú_forget_plugin_configrÎ  C  s5  € ÷ ;Ù‹]€FØ€GØ€FØ—*‘*˜YÓ'€KÜ�+œt×$Ò$Û/ˆHØ—O‘O HÓ-ˆEÜ˜%¤×&Ô&¨7´S¸³Z×+?Ö+?Ü(.¬s°5«z¸GÕ/CÓ(D�Ñ%Ø’ñ	 0ð
 —/‘/ )Ó,ˆÜ�gœt×$Ò$¨´3°w³<×)?Ô)?Ø ¤3 w£<×/Ð/�Ø’Nñ 0àˆGØ—‘˜HÓ%€JÜ�*œd×#Ò#¬¨J¯N©N¸:Ó,F×,LÐ,LÈ"Ó(M×(SÑ(SÓ(UÐY`Ô(`Ø!#ˆ
�:ÑØÐ!:¸DÐ A�ßÙ�FÔØ€MrH   zdict[str, threading.Lock]Ú_SELECTION_LOCKSc               ó   € V ^8„  d   QhRR/# )rA   rB   zthreading.LockrD   )rE   s   "rF   rG   rG   j  s   € ÷ Pñ P˜ñ PrH   c                 ó¾   € \         ;_uu_ 4        \        P                  \        4       \        P
                  ! 4       4      uuR R R 4       #   + '       g   i     R # ; irR   )Ú_SELECTION_LOCKS_GUARDrÏ  rÜ   r   Ú	threadingÚLockrD   rH   rF   Ú_selection_lockrÕ  j  s1   € ß	Ö	Ü×*Ñ*¬?Ó+<¼i¿nºnÓ>NÓO÷ 
 ×	×	Ó	ús   �1AÁA	r¿  c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r^   r‡   rœ  rž   rB   rØ   rD   )rE   s   "rF   rG   rG   o  s'   € ÷ eñ e˜cð e¨dð eÐQUñ erH   c               óì  € ^ RI Hp \        4       ;_uu_ 4        \        4       pV! \	        4       4      ;'       g    / pVP                  R4      ;'       g    / p\        VP                  R4      ;'       g    R4      p\        VP                  R4      ;'       g    R4      p	\        W‰WVR7       \        Y‰TV'       d   RMR RV  R	2YQ'       d   T MR
R7       R
R
R
4       R
#   + '       g   i     R
# ; i)zESubmit the command's delta with the version of the selection it read.)Úread_home_selectionrÃ   rŒ  r‹  ©rœ  ÚEnableÚDisablez 'Ú'N)r©   r›  r�  rž  rD   )	Úpm.plugins_staterØ  rÕ  r™  r   r`   rÎ   Ú_apply_activationr¦  )
r^   rœ  r¿  r©   rØ  r�  rÝ   rÃ   rŒ  r‹  s
   &$$$      rF   rÂ  rÂ  o  sÂ   € å4ä	×	Õ	Ü3Ó5ˆÙ$¤_Ó%6Ó7×=Ð=¸2ˆØ—*‘*˜YÓ'×-Ð-¨2ˆÜ�g—k‘k )Ó,×2Ð2°Ó3ˆÜ�w—{‘{ :Ó.×4Ð4°"Ó5ˆÜ˜'¨TÀ6ÕJÜ# G¸wß9?©XÀYÐ,OÈrÐRVÐQWÐWXÐ*YØ3BÖSYÉ4Ð_cõ	e÷ 
×	×	Ò	ús   ™<C"ÁC"Á6#C"Â>C"Ã"C3	c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
rA   rŒ  rÎ   r‹  r×   r‡   rœ  rž   rB   rØ   rD   )rE   s   "rF   rG   rG     s1   € ÷ /ñ /˜sð /¨cð /¸ð /ÐQUð /ÐZ^ñ /rH   c               óŒ   € V'       d   TMT p\        WR4       VP                  V4       V'       d   T MTP                  V4       R# )z`Add canonical *key* to the target list and purge it, its bare leaf and *aliases* from the other.N)r²  Údifference_updateÚadd)rŒ  r‹  r×   r¿  rœ  Úremoveds   &&&&$ rF   rÞ  rÞ    s3   € ç ‰h g€GÜ˜'Ô'Ø×Ñ˜gÔ&ß�W˜H×)Ñ)¨#Ö.rH   c               ó    € V ^8„  d   QhRRRR/# ©rA   r^   r‡   rB   rC   rD   )rE   s   "rF   rG   rG   ‡  s   € ÷ -ñ -˜cð - mñ -rH   c                ó>   € \        V 4      pV'       d
   V^ ,          # R# )z¯Canonical registry key for a manifest name / directory name / path key, or ``None``.
The single normalization point so enable/disable write the key ``PluginManager`` gates on.N)Ú_resolve_plugin_key_and_source)r^   Úresolveds   & rF   Ú_resolve_plugin_keyré  ‡  s   € ô .¨dÓ3€Hß"ˆ8�A�;Ð,¨Ð,rH   c               ó    € V ^8„  d   QhRRRR/# ©rA   r^   r‡   rB   rF  rD   )rE   s   "rF   rG   rG   Ž  s   € ÷ /ñ / ð /¨ñ /rH   c                óR  € ^ RI Hp  \        \        4       4      pT Uu. uFP  p\        4       T,          ;pP                  4       '       g   K,  T! T4      ;p'       g   K>  TR,          T 8X  g   KN  TNKR  	  pp\        T4      ^8X  d
   T^ ,          # R#   \         d     R# i ; iu upi )aE  Install dir whose installer-owned record names catalog entry *name* (``hermes-memory-wiki`` is
installed as ``plugins/memory-wiki``), else None (also when two dirs claim it). Read through
:func:`catalog_install_record` (``.install-metadata.json``), never the tree, so a URL-installed
repo cannot claim a catalog entry's name.)Úcatalog_install_recordNÚcatalog_name)Úhermes_cli.plugins_cmd_catalogrí  rÐ   r   rl   r  r:  r&  )r^   rí  r¸   r×   r  Úrecordr   s   &      rF   Ú_catalog_installed_dirrñ  Ž  sª   € õ
 FðÜÔ*Ó,Ó-ˆñ #ó _™d�s´³À#Õ1EÐ'E v×&MÑ&M×&OŒFÙ1°&Ó9Ð9�Ó9ô Ø?EÀnÕ?UÐY]Ñ?]÷ ˆF™d€Dð _ä˜$“i 1”nˆ4��7Ð.¨$Ð.øô	  ô Úðüò_s(   ˆB Ÿ)B$ÁB$ÁB$Á/B$ÂB!Â B!c               ó    € V ^8„  d   QhRRRR/# ©rA   r^   r‡   rB   zOptional[tuple]rD   )rE   s   "rF   rG   rG   �  s   € ÷ ñ ˜Sð  _ñ rH   c                ó~  a€ \        4       p^ RIHp V! V 4      ;'       g    T o\        V3R lV 4       R4      pVe   V# V Uu. uF*  q@V^,          P	                  R4      R,          8X  g   K(  VNK,  	  ppV'       d   \        V4      ^8X  d
   V^ ,          # R# \        V 4      o\        V3R lV 4       R4      # u upi )a‡  THE plugin name resolver for every verb (enable/disable/show/capabilities/remove/update, the
dashboard and the Desktop hub): the discovered ``(name, version, description, source, dir_path, key)``
entry for a canonical key or manifest name; else a bare leaf (``exa`` ->
``web/exa``) only when unique; else the catalog name the plugin was installed under.
Never guesses between two candidates.)Úlegacy_plugin_aliasc              3  óZ   <"  € T F   pSV^ ,          V^,          39   g   K  Vx € K"  	  R# 5i)r”  NrD   ©rV   rr  r  s   & €rF   rX   Ú%_find_plugin_entry.<locals>.<genexpr>¦  s'   øé € ÐO¡W˜E°¸5À½8ÀUÈ1ÅXÐ:NÑ0N—%’%£Wùs   ƒ+¡
+Nr  c              3  óš   <"  € T F@  pSf   K	  V^,          '       g   K  \        \        V^,          4      4      S8X  g   K<  Vx € KB  	  R # 5irR   )r   r‡   r÷  s   & €rF   rX   rø  ­  s<   øé € Ðq¡G˜5¨v”ÀeÈAÇhÁh”ÔSWÔX[Ð\aÐbcÕ\dÓXeÓSfÐjpÑSp—’£Gùs   ƒAŽAŸAÁ
ArA  )r»  rˆ  rõ  rc   r'  r&  rñ  )r^   r´  rõ  Úexactrr  Úleaf_matchesr  s   &     @rF   Ú_find_plugin_entryrü  �  s³   ø€ ô $Ó%€GÝBÙ  Ó&×.Ð.¨$€FÜÔO¡WÓOÐQUÓV€EØÒØˆÙ'.ÓR¡w˜e¸%À½(¿.¹.ÈÓ:MÈbÕ:QÑ2Q—E�E¡w€LÐRßÜ"% lÓ"3°qÔ"8ˆ|˜A�ÐB¸dÐBÜ# DÓ)€FÜÔq¡GÓqØóð ùò	 Ss   Á%B:Á.B:c               ó    € V ^8„  d   QhRRRR/# ró  rD   )rE   s   "rF   rG   rG   ±  s   € ÷ 3ñ 3¨ð 3°ñ 3rH   c                óP   € \        V 4      pV'       d   V^,          V^,          3# R# )z]Resolve *name* to ``(canonical_key, source)`` or ``None`` through :func:`_find_plugin_entry`.N)rü  )r^   rr  s   & rF   rç  rç  ±  s&   € ä˜tÓ$€Eß#(ˆE�!�H�e˜A•hÐÐ2¨dÐ2rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r^   r‡   Úallow_tool_overrideúOptional[bool]rB   rØ   rD   )rE   s   "rF   rG   rG   ·  s!   € ÷ )1ñ )1�Sð )1¨~ð )1Èñ )1rH   c           	     óx  a
aa€ ^ RI Ho
Ho \        4       oR V
VV3R llpV! V 4       \	        V 4      pVf   \        S\        V 4      4       Vw  rEV! V4       VR8w  d:   ^ RIHp  VP                  V\        VP                  R^4      R,          4      4       \        VR	SR
7      pV'       d&   ^ RIHp	 SP!                  RV R24       V	! SV4       MSP!                  RV R24       VR8w  d   \#        SWA4       V'       d   \%        VR	R7       R# R#   \         d   p\        SRT 24        Rp?L›Rp?ii ; i)a  Add a plugin to the enabled allow-list (and remove it from disabled).

Non-bundled plugins request consent for declared capabilities. The legacy
``allow_tool_override`` grant changes only with an explicit True/False flag;
None leaves it unchanged. Bundled plugins are trusted.
)ÚLEGACY_RELAY_PLUGIN_KEYSÚRELAY_PLUGINS_CONFIG_ENVc               ó    € V ^8„  d   QhRRRR/# )rA   rž  r‡   rB   rØ   rD   )rE   s   "rF   rG   Ú cmd_enable.<locals>.__annotate__Á  s   € ÷ Tñ T Sð T¨Tñ TrH   c                ó@   <€ V S9   d   \        SR V  RS R24       R# R# )z[red]Plugin 'z}' was removed.[/red] Relay lifecycle is owned by Hermes core; configure a standard user or system Relay plugins.toml, or use z$ for an explicit user-file override.N)rª   )rž  r  r  r©   s   &€€€rF   Ú_refuse_legacy_relayÚ(cmd_enable.<locals>._refuse_legacy_relayÁ  s8   ø€ ØÐ-Ô-Ü�'Ø ˜xð (bà+Ð,Ð,PðRöTñ .rH   NÚbundled©Úplugins_cmd_catalogr  r€  T©rœ  r©   )Úreport_activationu    [green]âœ“[/green] Plugin [bold]z[/bold] enabled.ú[dim]Plugin 'z' is already enabled.[/dim]rÙ  rA  )Úhermes_cli.relay_plugin_cutoverr  r  r‘   rç  rª   rƒ  Ú
hermes_clir  Úrefuse_if_installed_removedÚ_user_installed_plugin_dirrC  rl   rÃ  Úhermes_cli.plugins_activationr  r§   Ú_enable_consentÚ_toggle_plugin_toolset)r^   r   r  rè  r×   rí   Úcatalogrø   rÊ  r  r  r  r©   s   &&        @@@rF   Ú
cmd_enabler  ·  s)  ú€ ÷ cÜ‹j€G÷Tò Tñ ˜ÔÜ-¨dÓ3€HØÒÜˆgÔ.¨tÓ4Ô5Ø�K€CÙ˜ÔØ�Ôå=ð	7Ø×/Ñ/°Ô5OÐPS×PZÑPZÐ[^Ð`aÓPbÐceÕPfÓ5gÔhô ˜C¨°gÔ>€GßÝCØ�‰Ð8¸¸Ð=MÐNÔOÙ˜' 3Õ'à�‰˜ c UÐ*EÐFÔGØ�ÔÜ˜ Ô:ßÜ˜s¨4×0ñ øô $ô 	7Ü�'Ð/°¨uÐ5×6Ñ6ûð	7ús   Á'2D ÄD9Ä D4Ä4D9c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r×   r‡   r   r  rB   rØ   rD   )rE   s   "rF   rG   rG   ã  s&   € ÷ Hñ H #ð H¸Nð HÈtñ HrH   c                ól   € \        V4      pV'       d   \        WVRR7       Ve   \        WV4       R# R# )zXCapability consent and the legacy tool-override grant for a non-bundled plugin's enable.rœ  )ÚcontextN)r   r   r   )r©   r×   r   Údeclared_capss   &&& rF   r  r  ã  s5   € ô
 3°3Ó7€MßÜ ¨mÀXÕNð Ò&Ü$ WÐ3FÖGñ 'rH   c               ó    € V ^8„  d   QhRRRR/# )rA   r^   r‡   rB   rØ   rD   )rE   s   "rF   rG   rG   ñ  s   € ÷ Vñ V�cð V˜dñ VrH   c                óf  € \        4       p\        V 4      pVf   \        V\        V 4      4       \	        V4      p\        VRVR7      '       g   VP                  RV R24       R# \        VRVR7       ^ RIH	pH
p VP                  RV R	24       VP                  R
V! V! 4       V4       R24       R# )zBRemove a plugin from the enabled allow-list (and add to disabled).NFr  r  z' is already disabled.[/dim]©rœ  Útoolset_key)Úgateway_reload_hintÚreload_running_gatewayu"   [yellow]âŠ˜[/yellow] Plugin [bold]z[/bold] disabled.z[dim]rd  )r‘   ré  rª   rƒ  Ú_saved_list_toolset_keyrÃ  r§   r  r  r!  r"  )r^   r©   r×   r   r!  r"  s   &     rF   Úcmd_disabler$  ñ  s¢   € ä‹j€GÜ
˜dÓ
#€CØ
‚{ÜˆgÔ.¨tÓ4Ô5Ü)¨#Ó.€KÜ˜ U°G×<Ó<Ø�‰˜ c UÐ*FÐGÔHÙÜ˜3 u¸+ÕFßYØ‡M�MÐ6°s°eÐ;LÐMÔNØ‡M�M�EÑ-Ñ.DÓ.FÈÓLÐMÈVÐTÖUrH   c               ó    € V ^8„  d   QhRRRR/# )rA   Údr   Úprefixr‡   rD   )rE   s   "rF   rG   rG     s   € ÷ Sñ S˜4ð S¨ñ SrH   c                óÐ  € \        V 4      pVf4   \        V 4      '       g   R#  ^ RIHp V! V 4      ^ ,          pVR,          pM@ \        V4      p\        V\        4      '       g   / pVP                  RV P                  4      pV'       d   V RV P                   2MTpWTP                  RR4      VP                  RR4      V3#   \         d     R# i ; i  \         d    / p L•i ; i)z?Read a native or portable manifest and return display metadata.NrZ  r^   r  ÚversionrN   Údescription)
rK  rQ  r\  r[  r¾   rV  rÇ   rX  r`   r^   )r&  r'  rS  r[  rn  r^   r×   s   &&     rF   Ú_read_manifest_infor+    sÜ   € ä)¨!Ó,€MØÒÜ% a×(Ò(Ùð	ÝKÙ1°!Ó4°QÕ7ˆHØ˜FÕ#‰Dð
	Ü*¨=Ó9ˆHô ˜(¤D×)Ò)ØˆHØ�|‰|˜F A§F¡FÓ+ˆß"(ˆVˆH�A�a—f‘f�XÑ
¨d€CØ—‘˜i¨Ó,¨h¯l©l¸=È"Ó.MÈsÐRÐRøô ô 	Úð	ûô ô 	ØŠHð	ús#   ¤C ÁC ÃCÃCÃC%Ã$C%c               ó   € V ^8„  d   QhRR/# r�   rD   )rE   s   "rF   rG   rG     s   € ÷ ñ ¨ñ rH   c                ó®   €  \        V 4      pVP                  4       ;'       d!    \        V4      RJ ;'       d    \        V4      #   \         d     R# i ; i)zYTrue for an Agent Plugins v1 package (``plugin.json`` only; native ``plugin.yaml`` wins).NF)r   r:  rK  rQ  rh  )Údir_pathr&  s   & rF   Ú_is_portable_plugin_dirr/    sP   € ðÜ�‹NˆØ�x‰x‹z×\Ð\Ô3°AÓ6¸$Ð>×\Ð\ÔCYÐZ[ÓC\Ð\øÜô Úðús   ‚!A ¤A ¹A ÁAÁAc               ó    € V ^8„  d   QhRRRR/# )rA   rí   r‡   rB   rž   rD   )rE   s   "rF   rG   rG   (  s   € ÷ cñ c #ð c¨$ñ crH   c                ó.  € \        V 4      pVP                  4       '       g   R# VR8w  df   ^ RIHp \	        4       pVP
                  P                  R4      '       g   VP                  WDR,          39  d   R# VP                  V8X  d	   V! V4      # \        V4      pVf   R#  \        \        V4      P                  RR4      4      P                  4       P                  4       pTR8H  ;'       g    TR8H  ;'       d
    T\        9   #   \         d     R# i ; i)	a¸  True when a plugin is active without a ``plugins.enabled`` entry (portable ``plugin.json``
packages have no kind, so never). Bundled default-on kinds always; a user model provider only
where providers/ discovery loads it (``providers._scan_home_layer``): a
``plugins/model-providers/<name>/`` child whose kind is model-provider, or a flat
``plugins/<name>/`` child declaring exactly ``kind: model-provider``. Discovery imports any other
``model-providers/`` child too, but nothing calls its ``register(ctx)``, so it is not on.

Entry-point rows store ``module:attr`` in the path slot. That string is not a directory;
opening it as one is WinError 123 on Windows and aborts the whole plugin list.
Fr
  )Ú_declares_model_provider_kindúmodel-providersÚkindÚ
standaloneúmodel-provider)r0  r  )r   r:  Ú	providersr2  r  r^   r$  ÚparentrK  r‡   rV  r`   r°   r±   r¾   Ú_BUNDLED_DEFAULT_ON_KINDS)r.  rí   rT   r2  ÚrootrS  r4  s   &&     rF   Ú_default_onr;  (  sô   € ô �‹>€DØ�;‰;�=Š=ÙØ�ÔÝ;Ü‹~ˆØ�9‰9×Ñ 
×+Ò+¨t¯{©{À4ÐPaÕIaÐBbÔ/bÙØ�;‰;˜$ÔÙ0°Ó6Ð6Ü)¨$Ó/€MØÒÙðÜÔ& }Ó5×9Ñ9¸&À,ÓOÓP×VÑVÓX×^Ñ^Ó`ˆð Ð#Ñ#×bÐb¨°)Ñ(;×(aÐ(aÀÔHaÑ@aÐbøô ô Úðús   Â"A D ÄDÄDc               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )rA   Úbaser   rí   r‡   Ú
skip_namesrÎ   r'  ÚdepthrÁ   ÚseenrX  rB   rØ   rD   )rE   s   "rF   rG   rG   G  sH   € ÷ Dñ D�dð D Cð D°Sð DÀ#ð DÈcð DÐY]ð DÐbfñ DrH   c           	     óâ  € V P                  4       '       g   R#  \        V P                  4       4      pT FÑ  p TP                  4       '       d!   T^ 8X  d   T'       d   TP                  T9   d   K<  \        Yƒ4      p	T	fD   T^ 8X  d;   \        Y�\        4       T'       d   T RTP                   2MTP                  ^T4       KŽ  T	w  r«rÍYÕ9   d
   TR8X  d   K¢  TR8X  d    TR,          P                  4       '       d   RMTpY«YÎY�3Y]&   KÓ  	  R#   \         d"   p\        P                  RY4        Rp?R# Rp?ii ; i  \        \        3 d#   p\        P                  RY‡4        Rp?EK4  Rp?ii ; i)zFRecursive directory scan matching PluginManager._scan_directory_level.Nz+Skipping unreadable plugin directory %s: %sr  r
  Úuserr  rJ   )r:  rü   Úiterdirrh  rÈ   rÉ   r^   r+  rl   Ú_scan_levelrÎ   r9  )r=  rí   r>  r'  r?  r@  Úchildrenrø   r&  rò   r^   r)  r*  r×   Ú	src_labels   &&&&&&         rF   rD  rD  G  s6  € à�;‰;�=Š=ÙðÜ˜$Ÿ,™,›.Ó)ˆó ˆð	Ø—8‘8—:’: %¨1¤*·ÀÇÁÈ*Ô@TÙÜ& qÓ1ˆDð Š<Ø˜ŒzÜ˜A¤s£uÇf°°¸¸!¿&¹&¸Ñ.BÐRS×RXÑRXÐZ[Ð]aÔbÙØ*.Ñ'ˆ�{ØŒ;˜6 YÔ.ÙØ# vÔ-°1°vµ:×2EÑ2E×2GÒ2G‘EÈVˆ	Ø K¸AÐCˆ‹	ó% øô ô Ü�‰ÐDÀdÔPÝûðûô Ô-Ð.ô 	ô �N‰NÐHÈ!ÔQÞûð		ús:   šD ¹$D;ÁD;Á1D;ÄD8ÄD3Ä3D8Ä;E.ÅE)Å)E.c               ó   € V ^8„  d   QhRR/# )rA   rB   rÐ   rD   )rE   s   "rF   rG   rG   e  s   € ÷ ñ ˜tñ rH   c            
     ó€  € / p ^ RI HpHp V! 4       R0 Rm3\        4       R\	        4       33 F  w  r4p\        W4VR^ V 4       K  	  V! 4        FW  pV P                  VP                  VP                  VP                  VP                  RVP                  VP                  34       KY  	  \        V P                  4       4      # )u  ``(name, version, description, source, dir_path, key)`` for every plugin the loader sees,
in ``PluginManager.discover_and_load`` order: bundled, user, then entry points â€” which never
displace a directory plugin of the same key (see ``PluginManager._discover_and_load_inner``).)Údiscover_entrypoint_manifestsÚget_bundled_plugins_dirr
  rB  rN   Ú
entrypoint>   rÇ  Úcomputer_useÚcontext_enginer3  )Úhermes_cli.pluginsrI  rJ  r  rÎ   rD  rÜ   r^   r)  r*  rT   rÐ   Úvalues)r@  rI  rJ  r=  rí   ÚskipÚms          rF   r»  r»  e  s§   € ð €D÷ Zá	 Ó	" IÒ/nÐoÜ	‹˜¤£Ð'óÑˆ�dô 	�D $¨¨A¨tÖ4ñ	ñ +Ö,ˆØ�‰˜Ÿ™ §¡¨¯©°A·M±MÀ<ÐQR×QWÑQWÐYZ×Y_ÑY_Ð `Öañ -ä�—‘“ÓÐrH   c               ó   € V ^8„  d   QhRR/# )rA   rB   rÎ   rD   )rE   s   "rF   rG   rG   x  s   € ÷ ?ñ ? ñ ?rH   c                 óT   € \        4       3 U u0 uF  q '       g   K  V kK  	  up # u up i )z§Provider names switched on through ``<category>.provider`` config rather than
``plugins.enabled`` (the live memory provider), so status never calls them "not enabled".)Ú_get_current_memory_provider)Úns    rF   Ú_category_active_namesrV  x  s(   € ô 5Ó6Ñ8Ó>Ñ8�!»A�AˆAÑ8Ñ>Ð>ùÒ>s   Ž	%œ%rN   rí   r.  Úactivec               ó4   € V ^8„  d   QhRRRRRRRRRRRR	R
R/# )rA   r^   r‡   rŒ  rÎ   r‹  r×   rí   rW  zfrozenset | setrB   rD   )rE   s   "rF   rG   rG   ~  s@   € ÷ ñ ˜ð  sð °cð Àð ÐUXð Ø*9ðØLOñrH   c               ó–   € W0pWr,          '       d   R# Wq,          '       g   Wv,          '       d   R# Ve   \        WT4      '       d   R# R# )uX  User-facing activation state for a plugin name or key. Mirrors ``gate_manifest``: an explicit
disable wins, then the allow-list, then the activations that need no list entry â€” bundled
backends/platforms and model providers from any source (*source* + *dir_path*) and category-selected providers
(*active*, see :func:`_category_active_names`).r‹  rŒ  znot enabled)r;  )r^   rŒ  r‹  r×   rí   r.  rW  r¯  s   &&&&$$$ rF   Ú_plugin_statusrZ  ~  s=   € ð ˆK€EØ×ÔÙØ‡„˜%Ÿ.œ.ÙØÒ¤¨H× =Ò =ÙÙrH   rÇ  rÈ  rÅ   r  ÚengineÚ
compressorc               ó    € V ^8„  d   QhRRRR/# rå  rD   )rE   s   "rF   rG   rG   ˜  s   € ÷ !ñ ! #ð !¨-ñ !rH   c                óØ   a aa€  ^ RI Ho R T3R lloR TT 3R llpR TT 3R llpY3 F  p T! 4       ;p'       d   Tu # K  	  R#   \         d     R# i ; i  \         d     K=  i ; i)	z¯Toolset key a plugin registers its tools under, or None: from the live registry (plugin
already loaded), else from ``provides_tools`` in plugin.yaml looked up in the registry.)ÚregistryNc               ó   € V ^8„  d   QhRR/# r@   rD   )rE   s   "rF   rG   Ú-_get_plugin_toolset_key.<locals>.__annotate__   s   € ÷ iñ i mñ irH   c                ó4   <a€ \        VV3R  lV  4       R4      # )c              3  óš   <"  € T F@  pSP                  V4      ;o'       g   K  SP                  '       g   K2  SP                  x € KB  	  R # 5irR   )Ú	get_entryÚtoolset)rV   Útr]  r_  s   & €€rF   rX   ÚB_get_plugin_toolset_key.<locals>._first_toolset.<locals>.<genexpr>¡  s7   øé € Ða©
 1¸H×<NÑ<NÈqÓ<QÐ7Q°qÓ7Q”YÐWX×W`ÕW`”Y�Q—Y–Y«
ùs   ƒA£A·AN)rc   )Ú
tool_namesr]  r_  s   &@€rF   Ú_first_toolsetÚ/_get_plugin_toolset_key.<locals>._first_toolset   s   ù€ ÜÕa©
ÓaÐcgÓhÐhrH   c               ó   € V ^8„  d   QhRR/# r@   rD   )rE   s   "rF   rG   ra  £  s   € ÷ ñ  ñ rH   c                 óâ   <€ ^ RI Hp Hp V ! 4        V! 4       P                  P	                  4        F;  w  r#VP
                  P                  S8X  g
   VS8X  g   K)  S! VP                  4      u # 	  R# )r”  )Údiscover_pluginsÚget_plugin_managerN)rN  rm  rn  Ú_pluginsÚitemsrn  r^   Útools_registered)rm  rn  Ú_keyÚloadedri  r^   s       €€rF   Ú_from_loaded_pluginÚ4_get_plugin_toolset_key.<locals>._from_loaded_plugin£  sY   ø€ ßKÙÔÙ.Ó0×9Ñ9×?Ñ?ÖA‰LˆDØ�‰×#Ñ# tÔ+¨t°t®|Ù% f×&=Ñ&=Ó>Ò>ñ Bñ rH   c               ó   € V ^8„  d   QhRR/# r@   rD   )rE   s   "rF   rG   ra  «  s   € ÷ ñ  Mñ rH   c                 ó`   <a€ ^ RI Hp  \        VVV3R lV ! 4       \        4       3 4       R4      # )r”  )rJ  c              3  ó  <"  € T Fy  pVP                  4       '       g   K  VS,          P                  4       '       g   K:  S! \        VS,          4      P                  R 4      ;'       g    . 4      ;o'       g   Ku  Sx € K{  	  R# 5i)Úprovides_toolsN)r:  r^  r`   )rV   r=  ri  r^   re  s   & €€€rF   rX   ÚJ_get_plugin_toolset_key.<locals>._from_manifest_on_disk.<locals>.<genexpr>­  sk   øé € ð 
Ù K˜Ø�{‰{�}ô Ø"&¨¥+×!5Ñ!5×!7ô á*¬>¸$À½+Ó+F×+JÑ+JÐK[Ó+\×+bÐ+bÐ`bÓcÐc�Óc÷ ŠGÓ Kùs   ƒB B¿)BÁ)BÁ:
BN)rN  rJ  rc   r  )rJ  re  ri  r^   s    @€€rF   Ú_from_manifest_on_diskÚ7_get_plugin_toolset_key.<locals>._from_manifest_on_disk«  s/   ù€ Ý>Üö 
Ù!8Ó!:¼L»NÑ Kó
ð ó	ð 	rH   )Útools.registryr_  r¾   )r^   rt  r{  Úlookupre  ri  r_  s   f    @@rF   Ú_get_plugin_toolset_keyr  ˜  sƒ   ú€ ðÝ+÷ið i÷ñ ÷ñ ð 'Ó?ˆð	Ù ›(Ð"ˆwÖ"Ø’ñ #ñ @ñ øô9 ô Úðûô4 ô 	Úð	ús"   …A ¯AÁAÁAÁA)Á(A)c               ó    € V ^8„  d   QhRRRR/# rå  rD   )rE   s   "rF   rG   rG   ¼  s   € ÷ )ñ ) #ð )¨-ñ )rH   c                óF  a€ ^ RI Hp ^ RIHo V! 4       P	                  R4      p\        V\        4      '       d]   \        ;QJ d-    V3R lVP                  4        4       F  '       d   K   RM"	  RM! V3R lVP                  4        4       4      '       d   R# \        V 4      # )z«The plugin's toolset key, or None without loading any plugin when no platform has a SAVED
``platform_toolsets`` list (the only lists :func:`_toggle_plugin_toolset` edits).r»   ©Úparse_platform_toolsets_valueÚplatform_toolsetsc              3  ó8   <"  € T F  pS! V4      R J x € K  	  R # 5irR   rD   )rV   Úvrƒ  s   & €rF   rX   Ú*_saved_list_toolset_key.<locals>.<genexpr>Â  s   øé € Ð)kÑ\jÐWXÑ*GÈÓ*JÈdÕ*RÓ\jùs   ƒFTN)
r½   r¼   Úhermes_cli.toolset_validationrƒ  r`   rÇ   rX  r(  rO  r  )r^   r¼   Úsavedrƒ  s   &  @rF   r#  r#  ¼  sm   ø€ õ .ÝKÙ‹M×ÑÐ1Ó2€EÜ�eœT×"Ò"§c£cÔ)kÐ\a×\hÑ\hÔ\jÓ)k§c§c¢cÔ)kÐ\a×\hÑ\hÔ\jÓ)k×&kÒ&kÙÜ" 4Ó(Ð(rH   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	rA   r^   r‡   rœ  rž   r   rC   rB   rØ   rD   )rE   s   "rF   rG   rG   Ç  s)   € ÷ ñ  ð °ð ÀMð Ð]añ rH   c               ó|  € T;'       g    \        V 4      pV'       g   R# ^ RIHpHp ^ RIHp V! 4       p\        VR4      pRp\        VP                  4       4       FJ  w  ršV! V
4      pVf   K  WV9   8w  g   K  V'       d   VP                  MVP                  ! V4       W·V	&   RpKL  	  V'       d   V! V4       R# R# )aÎ  Add/remove a plugin's toolset in every SAVED ``platform_toolsets`` list (no-op when the plugin
provides no tools). Platforms with no saved list are left alone: a plugin toolset is already on
there by default, and seeding ``[<plugin_ts>]`` would replace the core composite and strip every
built-in tool. The key resolves only while the plugin is loaded, so enable calls this after the
plugin loads and disable resolves *toolset_key* before the disable is written.NrÚ   r‚  r„  FT)r#  r½   r¼   rÛ   rˆ  rƒ  r
   rÐ   rp  ra   Úremove)r^   rœ  r   r¼   rÛ   rƒ  rÝ   r„  rÊ  ÚplatformÚrawÚts_lists   &$$         rF   r  r  Ç  sª   € ð ×>Ð>Ô!8¸Ó!>€KßÙß:ÝKÙ‹]€FÜ# FÐ,?Ó@ÐØ€GÜÐ/×5Ñ5Ó7Ö8‰ˆñ 0°Ó4ˆØÔ 6¸WÑ.DÖ#Eß%ˆW�^Š^¨7¯>©>Ð9¸;ÔGØ*1˜hÑ'ØŠGñ 9÷ Ù�FÖñ rH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   r^   r‡   rŒ  rž   rB   rÅ  rD   )rE   s   "rF   rG   rG   á  s&   € ÷ "\ñ "\¨Sð "\¸dð "\À~ñ "\rH   c               óŠ  € \        V 4      pVf   RRRRV  R2/# ^ RIHp V'       d   RM
\        V4      p \	        W!R7      pT'       d.   T'       d&   ^ RIHp RRR	TR
R/T! T4      Cp\        TRR7       T# T'       d   \        TRTR7       RRR	TR
T'       * RT/#   T d    pRRR\        T4      R	TR
RRR/u Rp?# Rp?ii ; i)u€  Enable or disable a plugin in ``config.yaml`` (runtime allow/deny lists). *name* may be the
canonical key, the manifest name or a unique bare leaf; the canonical key is what gets written
(the loader never matches a bare leaf, and a stale key in ``disabled`` outranks a manifest-name
entry in ``enabled`` â€” so writing the raw identifier reported success while the plugin stayed off).NÚokFÚerrorzPlugin 'z' is not installed or bundled.)r¡  rÙ  r^   Ú	unchangedTÚrestart_required)Úactivate_plugin_nowr  )	ré  r¥  r¡  r#  rÃ  r‡   r  r–  r  )	r^   rŒ  r×   r¡  r   rÊ  rø   r–  ró   s	   &$       rF   Ú"dashboard_set_agent_plugin_enabledr—  á  sî   € ô
 ˜dÓ
#€CØ
‚{Ø�e˜W¨°°Ð6TÐ&UÐVÐVÝ=ç!‘$Ô'>¸sÓ'C€Kð	
Ü Ô4ˆ÷ —7õ 	FØ˜˜f c¨;¸ÐZÑATÐUXÓAYÐZˆô 	˜s¨4Õ0ØˆßÜ˜s¨5¸kÕJð �$˜  [°g´+Ð?QÐSZÐ[Ð[øð+ ô 
à�%Ø”S˜“XØ�CØ˜Ø ð
õ 	
ûð
ús   ¶B ÂCÂ#B=Â7CÂ=Cc               ó    € V ^8„  d   QhRRRR/# rë  rD   )rE   s   "rF   rG   rG     s   € ÷ Jñ J Sð J¨^ñ JrH   c                óš   €  \        V \        4       RR7      pTP                  4       '       d   T# \	        T 4      #   \         d     R# i ; i)z¢Resolved path under ``~/.hermes/plugins/<name>`` if it exists, else the user install
:func:`_find_plugin_entry` resolves *name* to (its manifest or catalog name).Tr  N)r  r  r  r:  r‚  )r^   r  s   & rF   r  r    sH   € ðÜ& t¬\«^È$ÔOˆð —]‘]—_’_ˆ6ÐIÔ*CÀDÓ*IÐIøô ô Úðús   ‚; »A
Á	A
c               ó    € V ^8„  d   QhRRRR/# rë  rD   )rE   s   "rF   rG   rG     s   € ÷ Cñ C Cð C¨Nñ CrH   c                óØ   € \        V 4      pV'       d9   V^,          R9   d+   V^,          '       d   \        \        V^,          4      4      MRpVe   VP                  4       '       d   V# R# )zaDir of the user install :func:`_find_plugin_entry` resolves *name* to (manifest or catalog name).N)rB  rJ   )rü  r   r‡   r:  )r^   rr  rd   s   &  rF   r‚  r‚    sQ   € ä˜tÓ$€Eß#(¨U°1­X¸Ô-HÈUÐSTÏXÌXŒD”�U˜1•X“ÔÐ[_€EØÒ%¨%¯,©,¯.ª.ˆ5ÐB¸dÐBrH   Úcic               ó$   € V ^8„  d   QhRRRRRR/# )rA   r  r‡   rœ  rž   rB   rØ   rD   )rE   s   "rF   rG   rG     s!   € ÷ ñ ˜cð °ð Àñ rH   c               ó¾   € ^ RI Hp V! V 4      p\        4       P                  VP	                  4       4       V'       d    VP
                  '       g   \        ^4      hR# R# )z?Validate one plugin through runtime discovery and registration.)Údoctor_pluginN)Úhermes_cli.plugin_devrŸ  r‘   r§   Úformat_textr’  Ú
SystemExit)r  rœ  rŸ  Úreports   &$  rF   Úcmd_plugin_doctorr¤    sD   € å3Ù˜6Ó"€FÜƒJ×Ñ�V×'Ñ'Ó)Ô*ß	�&—)—)�)Ü˜‹mÐñ �rrH   c               ó$   € V ^8„  d   QhRRRRRR/# )rA   Úyes_attrr‡   Úno_attrrB   r  rD   )rE   s   "rF   rG   rG      s&   € ÷ jñ j Cð j°#ð j¸.ñ jrH   c                óV   € \        WR4      '       d   R# \        WR4      '       d   R# R# )zQMap an argparse ``--x`` / ``--no-x`` pair to True / False / None (neither given).FTN)Úgetattr)ru   r¦  r§  s   &&&rF   Ú_tri_state_flagrª     s,   € ä˜4¨5×1Ò1ˆ4ÐiÄÈÐX]×A^ÒA^¸ÐiÐdhÐirH   c                 ó   € ^ RI Hp  V # )r”  r  )r  r  r  s    rF   Ú_catalogr¬  %  s   € Ý.ØÐrH   c                óB  € V P                   '       dL   \        V R R4      '       d   \        \        4       R4       \	        V P                   \        V RR4      R7       R# \        V RR4      '       d   \        \        4       R4       ^ RIHp V! \        V R R4      R7       R# )	r¯   FzM[red]Error:[/red] --yes only applies to `hermes plugins update` with no name.rè   rî   Nz^[red]Error:[/red] --force applies to one named plugin: `hermes plugins update <name> --force`.)Úcmd_update_all)r¯   )r^   r©  rª   r‘   r<   Ú!hermes_cli.plugins_cmd_update_allr®  )ru   r®  s   & rF   Ú_action_updater°  *  sq   € Ø‡y‡y€yÜ�4˜ ×&Ò&Ü”(“*ÐmÔnÜ�4—9‘9¤G¨D°'¸5Ó$AÕBÙÜˆt�W˜e×$Ò$ÜŒh‹jÐzÔ{Ý@Ù”w˜t U¨EÓ2×3rH   c                ó"   € ^ RI Hp V! V 4       R# )r”  )Úpack_commandN)Úhermes_cli.plugin_packsr²  )ru   r²  s   & rF   Ú_action_packr´  6  s   € Ý4Ù�ÖrH   Úinstallc                ó¾   € \        V P                  \        V R R4      \        V RR4      \        V RR4      \        V RR4      \        V RR4      \        V RR4      R	7      # )
rè   Frœ  Ú	no_enableÚrefNÚallow_removedÚno_depsÚyes_deps)rè   rœ  r¸  r¹  rº  r»  )r+   rç   r©  rª  ©ru   s   &rF   Ú<lambda>r½  =  sX   € œKØ�‰Ü�d˜G UÓ+Ü˜t X¨{Ó;Ü�D˜% Ó&Ü˜d O°UÓ;Ü˜˜i¨Ó/Ü˜˜z¨5Ó1õ3rH   Úsearchc                óx   € \        4       P                  \        V R R4      ;'       g    R\        V RR4      R7      # )ÚtermrN   ÚjsonF)Újson_output)r¬  Ú
cmd_searchr©  r¼  s   &rF   r½  r½  E  s6   € œ8›:×0Ñ0Ü��f˜bÓ!×'Ð' R´W¸TÀ6È5Ó5Qð 1ô SrH   Úbrowsec                ó4   € \        4       P                  R 4      # ©rN   )r¬  rÃ  r¼  s   &rF   r½  r½  G  s   € œ8›:×0Ñ0°Ô4rH   Úvalidatec           	     óz   € \        4       P                  V P                  \        V R R4      \        V RR4      R7      # )rÁ  FÚinstall_deps)Úas_jsonrÉ  )r¬  Úcmd_validaterT   r©  r¼  s   &rF   r½  r½  H  s6   € œX›Z×4Ñ4Ø�	‰	œ7 4¨°Ó7ÄgÈdÐTbÐdiÓFjð 5ô lrH   rº  Úadoptc                ó,   € \        V P                  4      # rR   )r9   r^   r¼  s   &rF   r½  r½  K  s   € œ) D§I¡IÔ.rH   ztrust-update-urlc                ó,   € \        V P                  4      # rR   )r;   r^   r¼  s   &rF   r½  r½  L  s   € Ô%9¸$¿)¹)Ô%DrH   zcheck-updatesc                ó   € \        V 4      # rR   ©r:   r¼  s   &rF   r½  r½  M  s
   € Ô"3°DÔ"9rH   Úcheckc                ó   € \        V 4      # rR   rÐ  r¼  s   &rF   r½  r½  N  s
   € Ô+¨DÔ1rH   rŒ  c                ó,   € \        V P                  4      # rR   ©r1   r^   r¼  s   &rF   r½  r½  O  s   € œ: d§i¡iÔ0rH   Úrmc                ó,   € \        V P                  4      # rR   rÔ  r¼  s   &rF   r½  r½  P  s   € ”z $§)¡)Ô,rH   Ú	uninstallc                ó,   € \        V P                  4      # rR   rÔ  r¼  s   &rF   r½  r½  Q  s   € œj¨¯©Ô3rH   c                óF   € \        V P                  \        V R R4      R7      # )r   Úno_allow_tool_override)r   )r  r^   rª  r¼  s   &rF   r½  r½  R  s   € œ:Ø�	‰	Ü+¨DÐ2GÐIaÓbõdrH   Údisablec                ó,   € \        V P                  4      # rR   )r$  r^   r¼  s   &rF   r½  r½  U  s   € œK¨¯	©	Ô2rH   Úcapabilitiesc                ó.   € \        \        V R R4      4      # )r^   N)r   r©  r¼  s   &rF   r½  r½  V  s   € Ô!1´'¸$ÀÈÓ2MÔ!NrH   rÐ   c                ó   € \        V 4      # rR   ©r.   r¼  s   &rF   r½  r½  W  s   € œ $œrH   Úlsc                ó   € \        V 4      # rR   rà  r¼  s   &rF   r½  r½  X  s   € ”x ”~rH   Údoctorc                óF   € \        V P                  \        V R R4      R7      # )rœ  F)rœ  )r¤  r  r©  r¼  s   &rF   r½  r½  Y  s   € Ô,¨T¯[©[¼WÀTÈ4ÐQVÓ=WÕXrH   ÚpackÚshowc                ó,   € \        V P                  4      # rR   )r/   r^   r¼  s   &rF   r½  r½  [  s   € œ $§)¡)Ô,rH   rò   c                óH   € \        4       P                  V P                  4      # rR   )r¬  Úcmd_infor^   r¼  s   &rF   r½  r½  \  s   € œ›×,Ñ,¨T¯Y©YÔ7rH   c                ó   € \        4       # rR   )r7   r¼  s   &rF   r½  r½  ]  s   € ”z”|rH   c               ó   € V ^8„  d   QhRR/# )rA   rB   rØ   rD   )rE   s   "rF   rG   rG   a  s   € ÷ ñ ˜Tñ rH   c                ó’   € \        V RR4      p\        P                  V4      pVf   \        \	        4       RV R24       V! V 4       R# )z$Dispatch hermes plugins subcommands.Úplugins_actionNz[red]Unknown plugins action: z[/red])r©  Ú_PLUGIN_ACTIONSr`   rª   r‘   )ru   r›  Úhandlers   &  rF   Úplugins_commandrð  a  sC   € ä�TÐ+¨TÓ2€FÜ×!Ñ! &Ó)€GØ‚ÜŒh‹jÐ9¸&¸ÀÐHÔIÙˆD†MrH   >
   ÚblobÚpullr  ÚwikiÚpullsÚcommitÚissuesÚactionsÚcommitsÚreleases)zhttps://zhttp://zgit@zssh://zfile://rD   rR   >   Úbackendr�  r6  rÆ  )r  )²Ú__conditional_annotations__r~   Ú
__future__r   Ú	functoolsÚloggingrS   r\   r    rÓ  Úpathlibr   Útypingr   r   r   Úhermes_constantsr   r   r½   r	   Úhermes_cli.plugin_capabilitiesr
   Úhermes_cli.secret_promptr   Úutilsr   Ú#hermes_cli.plugins_cmd_capabilitiesr   r   r   r   r   Úhermes_cli.plugins_cmd_gitr   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   Úhermes_cli.plugins_cmd_installr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Úhermes_cli.plugins_cmd_listingr-   r.   r/   Úhermes_cli.plugins_cmd_remover0   r1   r2   Úhermes_cli.plugins_cmd_toggler3   r4   r5   r6   r7   Úhermes_cli.plugins_cmd_updater8   r9   r:   r;   r<   r=   Ú	getLoggerrz   rÈ   rÆ   rÊ   Ú_CLONE_TIMEOUT_HINTÚ	lru_cacherj   r¾   rl   rƒ   r‘   r›   r¤   rª   Úinputr¶   r¿   rÌ   rÑ   rÔ   rÞ   râ   rö   r  r  r  r  r)  r%  r4  r<  rD  rK  rQ  rV  r^  ra  rl  ru  r|  r„  rƒ  ÚpartialrÁ  rÀ  r‘  r™  r¦  Ú	frozensetr«  r­  r²  r¼  rÃ  rÎ  rÏ  Ú__annotations__rÔ  rÒ  rÕ  rÂ  rÞ  ré  rñ  rü  rç  r  r  r$  r+  r/  r9  r;  rD  r»  rV  rZ  rT  Ú_get_current_context_engineÚ_save_memory_providerÚ_save_context_enginer  r#  r  r—  r  r‚  r¤  rª  r¬  r°  r´  rî  rð  )rû  s   @rF   Ú<module>r     sØ  øðôSõ #ã Û Û 	Û Û 
Û Ý ß *Ñ *ç =Ý %Ý 6å 9Ý !÷õ ÷÷ ÷ ÷ õ ÷÷ ÷ ÷
ñ ÷ñ ÷õ ÷÷ ð
 
×	Ò	˜8Ó	$€Ø!$Ð Ø!Ð ØaÐ ð ×Ò˜QÔôJó  ðJô&/˜9ô /ô'Ð,ô 'òòõ6õð "'÷ "õõ
õ<õ<õ
õKð
%ÐZ^ð %Ø+0÷%õP
õjõðÐPU÷ ò4Ð ð D€õ$)õNõ"õXõ@õ/õõ&.õ`õBõ	5õ
ð	BÀ%÷ 	Bð ×%Ò%Ð&6¸	À:ÓNÐ Ø×$Ò$Ð%5°yÀ)ÓLÐ õõCð
!Ø/1ð!Ø;?ð!ØOWð!Øimð!à ÷!ñJ $ WÐ.DÐ$EÓFÐ õõ&÷ð°T÷ õðF /1Ð Ð+Ó 0Ø"Ÿ›Ó)Ð õPð
e¸Bð eÈ÷ eõ /õ-õ/õõ(3÷)1õXHõVõ Sõ2ñ &Ò&OÓPÐ õcõ>Dõ<õ&?ñÐ[]ð Ø ðÙ<E»K÷ð ð(  )×0Ò0°¸hÈ
Ð\^Ô_Ð Ø'×/Ò/°¸YÈÐZfÔgÐ Ø!×)Ò)Ð*=¸xÈÓTÐ Ø ×(Ò(Ð)<¸iÈÓRÐ õ!õH)ðÐTX÷ õ4"\õJJõCñ°u÷ ð õjò
ò
	4òð"Øñ 3ð"ð ñ Sð"ð Ñ4ð"ð ñ lð"ð ˆnð"ð Ñ.ð"ð  ÑDð!"ð" Ñ9ð#"ð$ Ñ1ð%"ð& Ñ0ð'"ð( 	Ñ
,ð)"ð* Ñ3ð+"ð, ñ dð-"ð2 Ñ2ð3"ð4 ÑNð5"ð6 Ñ'ð7"ð8 	Ñ
%ð9"ð: ÑXØ
ˆLØ
Ñ,Ø
Ñ7ØÑ
#ñC"€÷JrH   