+
    lHàjÚn  ã                  óü	  € R t ^ RIHt ^ RIHt ^RIHtHtHtH	t	 ^RI
HtHtHt ^RIHtHt ^RIHt  ! R R]4      t ! R	 R
]4      t ! R R]4      t]! R]]RR7       ]! R]]RR7        ! R R]4      t ! R R]4      t ! R R]4      t]! R]]RR7        ! R R]	4      t ! R R]4      t ! R R]4      t]! R ]]R!R7        ! R" R#]4      t ! R$ R%]4      t]! R&]]R'R7        ! R( R)]4      t ! R* R+]	4      t ! R, R-]	4      t  ! R. R/]4      t!]! R0]]!R1R7        ! R2 R3]	4      t" ! R4 R5]4      t# ! R6 R7]4      t$ ! R8 R9]4      t% ! R: R;]4      t& ! R< R=]4      t']! R>]#]'R?R7        ! R@ RA]4      t( ! RB RC]4      t) ! RD RE]4      t* ! RF RG]4      t+]! RH](]+RIR7        ! RJ RK]4      t, ! RL RM]4      t- ! RN RO]4      t. ! RP RQ]4      t/ ! RR RS]4      t0 ! RT RU]4      t1 ! RV RW]4      t2]! RX],]2RYR7        ! RZ R[]4      t3 ! R\ R]]34      t4 ! R^ R_]4      t5 ! R` Ra]54      t6]! Rb]3]6RcR7       ]! Rd]3]5ReR7       ]! Rf]4]5RgR7        ! Rh Ri]4      t7 ! Rj Rk]4      t8]! Rl]]8RmR7        ! Rn Ro]	4      t9 ! Rp Rq]4      t: ! Rr Rs]4      t;]! Rt]];RuR7        ! Rv Rw]	4      t< ! Rx Ry]4      t= ! Rz R{]4      t>]! R|]]>R}R7        ! R~ R]4      t? ! R€ R�]?4      t@ ! R‚ Rƒ]4      tA]! R„]@]AR…R7        ! R† R‡]?4      tB ! Rˆ R‰]4      tC]! RŠ]B]CR‹R7        ! RŒ R�]4      tD ! RŽ R�]4      tE]! R�]?]ER‘R7        ! R’ R“]4      tF]! R”]?]FR•R7        ! R– R—]?4      tG ! R˜ R™]4      tH]! Rš]G]HR›R7        ! Rœ R�]?4      tI ! Rž RŸ]	4      tJ ! R  R¡]4      tK]! R¢]I]KR£R7        ! R¤ R¥]4      tL]! R¦]I]LR§R7        ! R¨ R©]I4      tM ! Rª R«]4      tN]! R¬]M]NR­R7        ! R® R¯]4      tO ! R° R±]4      tP ! R² R³]4      tQ ! R´ Rµ]4      tR]! R¶]O]RR·R7        ! R¸ R¹]	4      tS ! Rº R»]4      tT ! R¼ R½]	4      tU ! R¾ R¿]4      tV ! RÀ RÁ]	4      tW ! RÂ RÃ]4      tX ! RÄ RÅ]4      tY ! RÆ RÇ]4      tZ ! RÈ RÉ]4      t[ ! RÊ RË]4      t\ ! RÌ RÍ]4      t] ! RÎ RÏ]4      t^ ! RÐ RÑ]4      t_ ! RÒ RÓ]4      t` ! RÔ RÕ]4      ta]! RÖ]T]aR×R7        ! RØ RÙ]	4      tb ! RÚ RÛ]4      tc ! RÜ RÝ]4      td ! RÞ Rß]4      te]! Rà]c]eRáR7       Râ# )ãa  Tools / toolsets / MCP servers / plugins / skills / learning graph / reload contracts
(``tui_gateway/methods_tools.py``).

Every ``mcp.servers.*``, ``mcp.catalog``, ``skills.manage`` and ``plugins.manage`` handler runs under
``_profile_scoped_rpc`` and the desktop routes them via ``requestGatewayForProfile`` /
``requestForBot``, so all of them accept the optional ``profile`` key.
)Úannotations)ÚField)Ú	JsonValueÚParamsÚResultÚWireEnum)Ú	OpenModelÚProfileParamsÚSessionLiveInfo)ÚCatalogAppStateÚCatalogTier)Úmethodc                  ó*   € ] tR t^t$ RtRtR]R&   RtR# )Ú_SessionScopedz±Handlers that look a live session up with ``_sessions.get(params.get("session_id"))``: an
absent / unknown id falls back to the launch profile's config, so it is never required.Nú
str | NoneÚ
session_id© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__annotations__Ú__static_attributes__r   ó    ÚL/home/ubuntu/.hermes/hermes-agent/tui_gateway/contracts/tools_mcp_plugins.pyr   r      s   ‡ ñ_ð "€J�
×!r   r   c                  óR   € ] tR t^t$ RtR]R&   R]R&   R]R&   R]R&   R	tR
]R&   RtR	# )Ú
ToolsetRowzkOne row of ``methods_tools._toolset_rows``; ``tools`` only when the caller asked for them
(``tools.list``).ÚstrÚnameÚdescriptionÚintÚ
tool_countÚboolÚenabledNúlist[str] | NoneÚtoolsr   )r   r   r   r   r   r   r&   r   r   r   r   r   r      s)   ‡ ñð ƒIØÓØƒOØƒMØ"€EÐ×"r   r   c                  ó"   € ] tR t^(t$ R]R&   RtR# )ÚToolsetsListResultzlist[ToolsetRow]Útoolsetsr   N©r   r   r   r   r   r   r   r   r   r(   r(   (   s   ‡ Ø×r   r(   z
tools.listzdEvery toolset with its resolved tool names, flagged against the session's (or config's) enabled set.)ÚparamsÚresultÚdocztoolsets.listz?Toolset summaries (no tool names) for the desktop Toolsets tab.c                  ó,   € ] tR t^3t$ R]R&   R]R&   RtR# )ÚToolShowRowr   r   r    r   Nr*   r   r   r   r/   r/   3   ó   ‡ Ø
ƒIØ×r   r/   c                  ó,   € ] tR t^8t$ R]R&   R]R&   RtR# )ÚToolShowSectionr   r   zlist[ToolShowRow]r&   r   Nr*   r   r   r   r2   r2   8   s   ‡ Ø
ƒIØ×r   r2   c                  ó,   € ] tR t^=t$ R]R&   R]R&   RtR# )ÚToolsShowResultzlist[ToolShowSection]Úsectionsr!   Útotalr   Nr*   r   r   r   r4   r4   =   s   ‡ Ø#Ó#Ø‡Jr   r4   z
tools.showz^The /tools listing grouped by toolset, including tools deferred behind the tool_search bridge.c                  ó   € ] tR t^FtRtRtRtR# )ÚToolsActionÚenableÚdisabler   N)r   r   r   r   r9   r:   r   r   r   r   r8   r8   F   s   † Ø€FØ„Gr   r8   c                  óL   € ] tR t^Kt$ RtR]R&   R]R&   RtR]R&   RtR]R	&   R
tR# )ÚToolsConfigureParamsz”``names`` are toolset keys or ``server:tool`` MCP targets; with ``session_id`` the live session's
profile is authoritative and its agent is rebuilt.r8   Úactionú	list[str]ÚnamesNr   r   Úprofiler   )	r   r   r   r   r   r   r   r@   r   r   r   r   r<   r<   K   s)   ‡ ñ:ð ÓØÓØ!€J�
Ó!Ø€GˆZ×r   r<   c                  óX   € ] tR t^Ut$ R]R&   R]R&   RtR]R&   R]R&   R]R	&   R]R
&   RtR# )ÚToolsConfigureResultr>   ÚchangedÚenabled_toolsetsNzSessionLiveInfo | NoneÚinfoÚmissing_serversr#   ÚresetÚunknownr   )r   r   r   r   r   rE   r   r   r   r   rB   rB   U   s*   ‡ ØÓØÓØ#'€DÐ
 Ó'ØÓØƒKØ×r   rB   ztools.configurezcPersist a toolset / MCP enable-disable change and rebuild the session agent so it takes effect now.c                  ó8   € ] tR t^et$ RtRtR]R&   RtR]R&   RtR# )ÚReloadEnvParamszYThe shared owner serves ``/reload`` for one session the caller controls (``session_id``).Nr   r   r@   r   ©	r   r   r   r   r   r   r   r@   r   r   r   r   rJ   rJ   e   s   ‡ Ùcà!€J�
Ó!Ø€GˆZ×r   rJ   c                  ó"   € ] tR t^lt$ R]R&   RtR# )ÚReloadEnvResultr!   Úupdatedr   Nr*   r   r   r   rM   rM   l   s   ‡ Ø‡Lr   rM   z
reload.envzURe-read ~/.hermes/.env (CLI /reload parity); built agents keep their pool until /new.c                  óT   € ] tR t^tt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R	&   R
t
R# )ÚReloadMcpParamszÍWithout ``confirm`` the handler may answer ``confirm_required`` (per ``approvals.mcp_reload_confirm``);
``always`` persists the opt-out; ``rev`` is the config revision the caller wants loaded (coalescing).Nr   r   Fr#   ÚconfirmÚalwaysÚrevr   )r   r   r   r   r   r   r   rQ   rR   rS   r   r   r   r   rP   rP   t   s2   ‡ ñmð "€J�
Ó!Ø€GˆTÓØ€FˆDÓØ€Cˆ×r   rP   c                  ó   € ] tR t^~tRtRtRtR# )ÚReloadMcpStatusÚconfirm_requiredÚreloadedr   N)r   r   r   r   rV   rW   r   r   r   r   rU   rU   ~   s   † Ø)ÐØ„Hr   rU   c                  ó"   € ] tR t^ƒtRtRtRtRtR# )ÚReloadMcpSessionÚappliedÚ	unchangedÚbusyr   N)r   r   r   r   rZ   r[   r\   r   r   r   r   rY   rY   ƒ   s   † Ø€GØ€IØ„Dr   rY   c                  ó–   € ] tR t^‰t$ RtR]R&   RtR]R&   RtR]R&   RtR]R	&   Rt	R]R
&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚReloadMcpResulta.  ``session``: what the calling local session's MCP servers did (a new policy generation, nothing to
change, or deferred while a turn runs or waits); ``unavailable``: configured servers that did not connect
beside what did apply; ``session_servers``: the MCP servers that session's committed policy runs.rU   ÚstatusNr   ÚmessageÚ
loaded_revúbool | NoneÚ	coalescedÚturn_isolationúJsonValue | NoneÚhost_ackzReloadMcpSession | NoneÚsessionr%   ÚunavailableÚsession_serversr   )r   r   r   r   r   r   r`   ra   rc   rd   rf   rg   rh   ri   r   r   r   r   r^   r^   ‰   sd   ‡ ñið ÓØ€GˆZÓØ!€J�
Ó!Ø!€Iˆ{Ó!Ø"&€N�KÓ&Ø!%€HÐÓ%Ø'+€GÐ$Ó+Ø$(€KÐ!Ó(Ø(,€OÐ%×,r   r^   z
reload.mcpzZTear down and rediscover MCP servers for every live session (prompt cache is invalidated).c                  ó*   € ] tR t^ tRtRtRtRtRtRt	R# )ÚSkillsActionÚlistÚsearchÚinstallÚbrowseÚinspectr   N)
r   r   r   r   rl   rm   rn   ro   rp   r   r   r   r   rk   rk       s   † Ø€DØ€FØ€GØ€FØ„Gr   rk   c                  óh   € ] tR t^¨t$ Rt]P                  tR]R&   Rt	R]R&   Rt
R]R&   RtR]R	&   R
tR# )ÚSkillsManageParamszs``query`` is the search text / hub identifier / browse page (digits); ``page`` / ``page_size``
apply to ``browse``.rk   r=   Nr   Úqueryú
int | NoneÚpageÚ	page_sizer   )r   r   r   r   r   rk   rl   r=   r   rs   ru   rv   r   r   r   r   rr   rr   ¨   s7   ‡ ñð (×,Ñ,€FˆLÓ,Ø€Eˆ:ÓØ€Dˆ*ÓØ €Iˆz× r   rr   c                  ó,   € ] tR t^²t$ R]R&   R]R&   RtR# )ÚSkillHubHitr   r   r    r   Nr*   r   r   r   rx   rx   ²   r0   r   rx   c                  ób   € ] tR t^·t$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R	&   Rt
R]R
&   RtR# )ÚSkillBrowseItemz,``hermes_cli.skills_hub.browse_skills`` row.Ú r   r   r    ÚsourceNr   ÚtrustÚ
identifierr   )r   r   r   r   r   r   r   r    r|   r}   r~   r   r   r   r   rz   rz   ·   s6   ‡ Ù6à€Dˆ#ƒNØ€K�ÓØ€FˆCÓØ€Eˆ:ÓØ!€J�
×!r   rz   c                  óp   € ] tR t^Át$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R	&   RtR]R
&   RtR# )ÚSkillInspectInfozU``hermes_cli.skills_hub.inspect_skill``; ``{}`` when the identifier resolves nowhere.Nr   r   r    r|   r~   r%   ÚtagsÚskill_md_previewr   )r   r   r   r   r   r   r   r    r|   r~   r�   r‚   r   r   r   r   r€   r€   Á   sC   ‡ Ù_à€Dˆ*ÓØ"€K�Ó"Ø€FˆJÓØ!€J�
Ó!Ø!€DÐ
Ó!Ø#'Ð�j×'r   r€   c                  óš   € ] tR t^Ìt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R	]R
&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚSkillsManageResultuÊ   Shape follows the action: ``list`` â†’ ``skills`` (category â†’ names); ``search`` â†’ ``results``;
``install`` â†’ ``installed`` + ``name``; ``browse`` â†’ ``items`` + paging; ``inspect`` â†’ ``info``.Núdict[str, list[str]] | NoneÚskillszlist[SkillHubHit] | NoneÚresultsrb   Ú	installedr   r   zlist[SkillBrowseItem] | NoneÚitemsrt   ru   Útotal_pagesr6   zSkillInspectInfo | NonerE   r   )r   r   r   r   r   r†   r   r‡   rˆ   r   r‰   ru   rŠ   r6   rE   r   r   r   r   r„   r„   Ì   sh   ‡ ñnð +/€FÐ'Ó.Ø(,€GÐ%Ó,Ø!€Iˆ{Ó!Ø€Dˆ*ÓØ*.€EÐ'Ó.Ø€Dˆ*ÓØ"€K�Ó"Ø€Eˆ:ÓØ$(€DÐ
!×(r   r„   zskills.managezbSkills hub backend: list the profile's skills or search / browse / inspect / install from the hub.c                  ó8   € ] tR t^ßt$ RtRtR]R&   RtR]R&   RtR# )ÚSkillsReloadParamszƒ``session_id`` binds the rescan to that session's profile and workspace (project skills);
``profile`` scopes a session-less rescan.Nr   r   r@   r   rK   r   r   r   rŒ   rŒ   ß   s   ‡ ñ1ð "€J�
Ó!Ø€GˆZ×r   rŒ   c                  ó0   € ] tR t^çt$ R]R&   RtR]R&   RtR# )ÚSkillCommandRefr   r   r{   r    r   N)r   r   r   r   r   r    r   r   r   r   rŽ   rŽ   ç   s   ‡ Ø
ƒIØ€K�×r   rŽ   c                  óŒ   € ] tR t^ìt$ Rt]! ]R7      tR]R&   ]! ]R7      t	R]R&   ]! ]R7      t
R]R&   ^ tR]R	&   ^ tR]R
&   RtR# )ÚSkillsReloadDiffz'``agent.skill_commands.reload_skills``.©Údefault_factoryzlist[SkillCommandRef]ÚaddedÚremovedr>   r[   r!   r6   Úcommandsr   N)r   r   r   r   r   r   rl   r“   r   r”   r[   r6   r•   r   r   r   r   r�   r�   ì   sG   ‡ Ù1á#(¸Ô#>€EÐ Ó>Ù%*¸4Ô%@€GÐ"Ó@Ù °Ô6€IˆyÓ6Ø€Eˆ3ƒNØ€Hˆc×r   r�   c                  ó,   € ] tR t^öt$ R]R&   R]R&   RtR# )ÚSkillsReloadResultr   Úoutputr�   r,   r   Nr*   r   r   r   r—   r—   ö   s   ‡ ØƒKØ×r   r—   zskills.reloadzNRe-scan skill dirs; the pre-rendered ``output`` is what /reload-skills prints.c                  óB   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR# )ÚLearningFramesParamsi  Nrt   ÚcolsÚrowsÚframesr   )	r   r   r   r   r›   r   rœ   r�   r   r   r   r   rš   rš     s    ‡ Ø€Dˆ*ÓØ€Dˆ*ÓØ€FˆJ×r   rš   c                  ó`   € ] tR tRt$ RtR]R&   R]R&   R]R&   R	]R
&   ]! ]R7      tR]R&   Rt	R# )ÚLearningFramei  z„``agent.learning_graph_render.render_graph`` projection; ``grid`` rows are lists of
``[text, styleKey, alpha?, hexOverride?]`` runs.ÚfloatÚrevealr   Údater!   Úvisiblezlist[list[JsonValue]]Úgridr‘   zlist[dict[str, JsonValue]]Úlabelsr   N)
r   r   r   r   r   r   r   rl   r¥   r   r   r   r   rŸ   rŸ     s.   ‡ ñ8ð ƒMØ
ƒIØƒLØ
ÓÙ).¸tÔ)D€FÐ&×Dr   rŸ   c                  óH   € ] tR tRt$ R]R&   R]R&   RtR]R&   RtR]R&   R	tR# )
ÚLearningLegendItemi  r   ÚglyphÚlabelNr   ÚstyleÚcolorr   )r   r   r   r   r   rª   r«   r   r   r   r   r§   r§     s    ‡ ØƒJØƒJØ€Eˆ:ÓØ€Eˆ:×r   r§   c                  ó^   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R
tR# )ÚLearningNodeRowi  r   Úidr¨   r©   Ú	fullLabelÚmetaÚbodyrª   r   Nr*   r   r   r   r­   r­     s%   ‡ ØƒGØƒJØƒJØƒNØ
ƒIØ
ƒIØ‡Jr   r­   c                  óz   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R
tR]R&   R
tR]R&   R]R&   RtR
# )ÚLearningBucketRowi$  r!   Úindexr   r©   r¢   r†   Úmemoriesr6   Nr   Úcategoryr«   zlist[LearningNodeRow]Únodesr   )r   r   r   r   r   r¶   r«   r   r   r   r   r³   r³   $  s:   ‡ ØƒJØƒJØ
ƒIØƒKØƒMØƒJØ€HˆjÓØ€Eˆ:ÓØ × r   r³   c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚLearningAxisi0  r   ÚstartÚendr   Nr*   r   r   r   r¹   r¹   0  s   ‡ ØƒJØ	‡Hr   r¹   c                  ór   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   R]R&   R]R&   R]R&   RtR# )ÚLearningFramesResulti5  zlist[LearningFrame]r�   zlist[LearningLegendItem]ÚlegendÚ
categorieszlist[LearningBucketRow]Úbucketsr>   Úsummaryr¹   Úaxisr!   Úcountr›   rœ   r   Nr*   r   r   r   r½   r½   5  s5   ‡ ØÓØ$Ó$Ø(Ó(Ø$Ó$ØÓØ
ÓØƒJØ
ƒIØ
‡Ir   r½   zlearning.frameszWPre-render the /journey timeline (frames + legend/summary) so the TUI walks it locally.c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚLearningNodeParamsiE  Nr   r®   r   )r   r   r   r   r®   r   r   r   r   r   rÅ   rÅ   E  s   ‡ Ø€Bˆ
×r   rÅ   c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚLearningEditParamsiI  Nr   Úcontentr   )r   r   r   r   rÈ   r   r   r   r   r   rÇ   rÇ   I  s   ‡ Ø€GˆZ×r   rÇ   c                  ó4   € ] tR tRt$ RtR]R&   RtR]R&   RtR# )	ÚLearningMutationResultiM  uQ   ``agent.learning_mutations`` â€” ``ok: false`` carries the reason in ``message``.r#   ÚokNr   r`   r   )r   r   r   r   r   r   r`   r   r   r   r   rÊ   rÊ   M  s   ‡ Ù[àƒHØ€GˆZ×r   rÊ   c                  óP   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R# )	ÚLearningDetailResultiT  Nr   Úkindr®   r©   rÈ   r   )
r   r   r   r   rÎ   r   r®   r©   rÈ   r   r   r   r   rÍ   rÍ   T  s*   ‡ Ø€Dˆ*ÓØ€Bˆ
ÓØ€Eˆ:ÓØ€GˆZ×r   rÍ   zlearning.detailz<Node content (SKILL.md or memory chunk) for an edit prefill.zlearning.deletezBArchive a skill (restorable via curator) or remove a memory chunk.zlearning.editz4Rewrite a node's content (SKILL.md or memory chunk).c                  ób   € ] tR tRt$ R]R&   R]R&   RtR]R&   R]R	&   R]R
&   R]R&   R]R&   RtR# )ÚMcpCatalogEntryih  r   r   r    Nr   Úconnector_slugr#   rˆ   r$   r>   ÚrequiresÚ	transportr   )r   r   r   r   r   rÑ   r   r   r   r   rÐ   rÐ   h  s,   ‡ Ø
ƒIØÓØ!%€N�JÓ%ØƒOØƒMØÓØ‡Nr   rÐ   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚMcpCatalogResultir  zlist[McpCatalogEntry]Úserversr   Nr*   r   r   r   rÕ   rÕ   r  s   ‡ Ø"×"r   rÕ   zmcp.catalogzYCurated MCP presets with per-profile installed/enabled state and the env keys each needs.c                  ó   € ] tR tRtRtRtRtR# )ÚMcpServerSourceiz  ÚconfigÚpluginr   N)r   r   r   r   rÙ   rÚ   r   r   r   r   rØ   rØ   z  s   † Ø€FØ„Fr   rØ   c                  ó¬   € ] tR tRt$ RtR]R&   R]R&   RtR]R&   RtR]R	&   R
]R&   R
]R&   RtR]R&   Rt	R]R&   R]R&   Rt
R]R&   R]R&   RtR]R&   RtR# )ÚMcpServerSummaryi  u]   ``tui_gateway/mcp_rpc_helpers.summarize_server`` â€” a server's config without secret values.r   r   rÓ   Nr   ÚurlÚcommandr>   ÚargsÚenvÚauthrb   Úoauth_tokens_presentr#   r$   re   r&   rØ   r|   rÚ   r   )r   r   r   r   r   r   rÝ   rÞ   rá   râ   r&   rÚ   r   r   r   r   rÜ   rÜ     sb   ‡ Ùgà
ƒIØƒNØ€CˆÓØ€GˆZÓØ
ƒOØ	ƒNØ€Dˆ*ÓØ(,Ð˜+Ó,ØƒMØ"€EÐÓ"ØÓØ€FˆJ×r   rÜ   c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚMcpServersListResulti�  zlist[McpServerSummary]rÖ   r   Nr*   r   r   r   rä   rä   �  s   ‡ Ø#×#r   rä   zmcp.servers.listzSConfigured MCP servers for the (scoped) profile, secrets redacted to env-key names.c                  ó.   € ] tR tRtRtRtRtRtRtRt	Rt
R	# )
ÚMcpRuntimeStatusi˜  Ú	connectedÚdisabledÚ
connectingÚfailedÚlazyÚ
configuredr   N)r   r   r   r   rç   rè   ré   rê   rë   rì   r   r   r   r   ræ   ræ   ˜  s    † Ø€IØ€HØ€JØ€FØ€DØ„Jr   ræ   c                  óp   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   R]R&   RtR]R&   RtR# )ÚMcpServerRuntimeRowi¡  zDSafe projection of ``tools.mcp_tool_discovery.get_mcp_status`` rows.r   r   rÓ   r!   r&   r#   rç   rè   ræ   r_   rØ   r|   Nr   rÚ   r   )r   r   r   r   r   r   rÚ   r   r   r   r   rî   rî   ¡  s4   ‡ ÙNà
ƒIØƒNØƒJØƒOØƒNØÓØÓØ€FˆJ×r   rî   c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚMcpServersStatusResulti®  zlist[McpServerRuntimeRow]rÖ   r!   Ú
checked_atr   Nr*   r   r   r   rð   rð   ®  s   ‡ Ø&Ó&Ø‡Or   rð   zmcp.servers.statuszSCached runtime state per configured server; never connects, probes, or starts auth.c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚMcpServerNameParamsi·  r   r   r   Nr*   r   r   r   ró   ró   ·  ó   ‡ Ø
‡Ir   ró   c                  óF   € ] tR tRt$ RtRtR]R&   RtR]R&   RtR]R&   R	t	R# )
ÚMcpServersAddParamsi»  z¬``preset`` (catalog id) and/or ``config`` (url/command/args/env/headers/auth/tools); a
``bearer_token`` is written to the profile's .env, only the header template persists.Nr   Úpresetúdict[str, JsonValue] | NonerÙ   Úbearer_tokenr   )
r   r   r   r   r   r÷   r   rÙ   rù   r   r   r   r   rö   rö   »  s)   ‡ ñ]ð €FˆJÓØ*.€FÐ'Ó.Ø#€L�*×#r   rö   c                  ó6   € ] tR tRt$ R]R&   R]R&   R]R&   RtR	# )
ÚMcpServersAddResultiÄ  r#   rË   r   r   rÜ   Úserverr   Nr*   r   r   r   rû   rû   Ä  s   ‡ ØƒHØ
ƒIØ×r   rû   zmcp.servers.addzUAdd a server to the profile's config from a catalog preset and/or an explicit config.c                  ó0   € ] tR tRt$ R]R&   RtR]R&   RtR# )ÚMcpServersSetApiKeyParamsiÎ  r   ÚvalueNr   Úenv_varr   )r   r   r   r   r   r   r   r   r   r   rþ   rþ   Î  s   ‡ ØƒJØ€GˆZ×r   rþ   c                  ó@   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R	tR
# )ÚMcpServersSetApiKeyResultiÓ  r#   rË   r   r   r   rÜ   rü   r   Nr*   r   r   r   r  r  Ó  s   ‡ ØƒHØ
ƒIØƒLØ×r   r  zmcp.servers.set_api_keyzaStore a credential in the profile's .env and reference it from the server config (header or env).c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚMcpProbeTooliÞ  r   r   r    r   Nr*   r   r   r   r  r  Þ  r0   r   r  c                  ór   € ] tR tRt$ RtR]R&   R]R&   RtR]R	&   RtR
]R&   RtR
]R&   R]R&   Rt	R]R&   Rt
R# )ÚMcpServersTestResultiã  zY``ok: false`` carries ``error``; ``prompts`` / ``resources`` are only counted on success.r#   rË   zlist[McpProbeTool]r&   Nr   Úerrorrt   ÚpromptsÚ	resourcesÚoauth_neededrb   râ   r   )r   r   r   r   r   r   r  r  r	  râ   r   r   r   r   r  r  ã  s?   ‡ ÙcàƒHØÓØ€Eˆ:ÓØ€GˆZÓØ €IˆzÓ ØÓØ(,Ð˜+×,r   r  zmcp.servers.testu`   Connect, list tools, disconnect â€” an OAuth server with no token on disk is reported as not ok.c                  ó,   € ] tR tRt$ R]R&   R]R&   RtR# )ÚMcpServersRemoveResultió  r#   rË   r”   r   Nr*   r   r   r   r  r  ó  s   ‡ ØƒHØ‡Mr   r  zmcp.servers.removez-Drop a server from the profile's config.yaml.c                  ó*   € ] tR tRt$ RtRtR]R&   RtR# )ÚMcpOauthStartParamsiü  zrWith ``client_redirect_uri`` the CLIENT hosts the loopback and relays the code via
``mcp.servers.oauth.callback``.Nr   Úclient_redirect_urir   )r   r   r   r   r   r  r   r   r   r   r   r  r  ü  s   ‡ ñ'ð '+Ð˜×*r   r  c                  ó@   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   RtR	# )
ÚMcpOauthStartResulti  r#   rË   r   r   Úauth_urlÚflowr   Nr*   r   r   r   r  r    s   ‡ ØƒHØƒOØƒMØ
‡Ir   r  zmcp.servers.oauth.startzTBegin a PKCE OAuth flow; the client opens auth_url and polls mcp.servers.oauth.poll.c                  ó&   € ] tR tRt$ RtR]R&   RtR# )ÚMcpOauthFlowParamsi  zX``session_id`` is the OAuth flow id returned by ``oauth.start`` (not a gateway session).r   r   r   N©r   r   r   r   r   r   r   r   r   r   r  r    s
   ‡ Ùbà‡Or   r  c                  ó"   € ] tR tRtRtRtRtRtR# )ÚMcpOauthPollStatusi  ÚpendingÚapprovedr  r   N)r   r   r   r   r  r  r  r   r   r   r   r  r    s   † Ø€GØ€HØ„Er   r  c                  ód   € ] tR tRt$ R]R&   R]R&   RtR]R&   RtR]R	&   RtR]R
&   RtR]R&   Rt	R# )ÚMcpOauthPollResulti  r#   rË   r  r_   Nr   r   Úerror_messager  zlist[McpProbeTool] | Noner&   r   )
r   r   r   r   r   r   r  r  r&   r   r   r   r   r  r    s6   ‡ ØƒHØÓØ!€J�
Ó!Ø $€M�:Ó$Ø€HˆjÓØ'+€EÐ$×+r   r  zmcp.servers.oauth.pollzSPoll a flow; approved persists tokens for the profile and returns the probed tools.c                  ó>   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   RtR# )	ÚMcpOauthCancelResulti'  r#   rË   Nr   r_   r  r   )r   r   r   r   r   r_   r  r   r   r   r   r  r  '  s   ‡ ØƒHØ€FˆJÓØ $€M�:×$r   r  zmcp.servers.oauth.cancelzHCancel a flow owned by the resolved profile, waking its callback worker.c                  óP   € ] tR tRt$ RtR]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R# )	ÚMcpOauthCallbackParamsi1  Nr   ÚcodeÚstater  Úissr   )
r   r   r   r   r"  r   r#  r  r$  r   r   r   r   r!  r!  1  s*   ‡ Ø€Dˆ*ÓØ€Eˆ:ÓØ€Eˆ:Óà€Cˆ×r   r!  c                  ó>   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   RtR# )	ÚMcpOauthCallbackResulti9  r#   rË   Nr   r   r  r   )r   r   r   r   r   r   r  r   r   r   r   r&  r&  9  s   ‡ ØƒHØ!€J�
Ó!Ø $€M�:×$r   r&  zmcp.servers.oauth.callbackzARelay a client-captured redirect into a client_redirect_uri flow.c                  ó   € ] tR tRtRtR# )ÚPluginsListParamsiF  r   N)r   r   r   r   r   r   r   r   r(  r(  F  s   † Ûr   r(  c                  ó|   € ] tR tRt$ R]R&   R]R&   R]R&   RtR]R	&   RtR
]R&   RtR
]R&   RtR
]R&   Rt	R]R&   Rt
R# )ÚLegacyPluginRowiJ  r   r   Úversionr#   r$   Nr   Úkeyrt   r&   Úhooksr•   r  r   )r   r   r   r   r   r,  r&   r-  r•   r  r   r   r   r   r*  r*  J  sC   ‡ Ø
ƒIØƒLØƒMà€CˆÓØ€Eˆ:ÓØ€Eˆ:ÓØ€HˆjÓØ€Eˆ:×r   r*  c                  ó6   € ] tR tRt$ R]R&   R]R&   R]R&   RtR# )ÚPluginToolsetRowiV  r   r,  r©   r    r   Nr*   r   r   r   r/  r/  V  s   ‡ Ø	ƒHØƒJØ×r   r/  c                  ó>   € ] tR tRt$ R]R&   RtR]R&   RtR]R&   R	tR# )
ÚPluginsListResulti\  zlist[LegacyPluginRow]ÚpluginsNzlist[PluginToolsetRow] | Noner)   r%   Úportable_mcp_serversr   )r   r   r   r   r   r)   r3  r   r   r   r   r1  r1  \  s   ‡ Ø"Ó"à.2€HÐ+Ó2Ø-1ÐÐ*×1r   r1  zplugins.listz[Loaded plugin manager entries (legacy flat view); the Plugins Hub uses plugins.manage list.c                  ó6   € ] tR tRtRtRtRtRtRtRt	Rt
R	tR
tR# )ÚPluginsActionig  rl   Útogglern   ÚupdateÚremoveÚsettingsÚ
onboardingÚpresencer   N)r   r   r   r   rl   r6  rn   r7  r8  r9  r:  r;  r   r   r   r   r5  r5  g  s*   † Ø€DØ€FØ€GØ€FØ€FØ€HØ€JØ„Hr   r5  c                  óØ   € ] tR tRt$ Rt]P                  tR]R&   Rt	R]R&   Rt
R]R&   RtR	]R
&   RtR]R&   RtR]R&   RtR]R&   RtR	]R&   RtR]R&   RtR	]R&   RtR]R&   RtR]R&   RtR# )ÚPluginsManageParamsir  a7  ``toggle``: ``key``/``name`` + ``enable``; ``install``: ``identifier``/``repo`` or ``catalog_name``
(+ ``force``, ``enable``, ``ref``); ``update``: ``name`` (+ ``accept_capabilities`` to apply a re-pin
that widened the plugin after the user confirmed the ``delta``, + ``force`` to apply an update whose
security scan returned caution after the user saw the findings); ``remove``: ``name`` (user installs only);
``settings``: ``key`` + ``values`` (``{setting_key: value}``, non-secret schema keys only);
``presence``: ``names`` (catalog names, answered in that order).r5  r=   Nr   r,  r   rb   r9   r~   ÚrepoÚcatalog_nameÚforceÚrefÚaccept_capabilitiesrø   Úvaluesr%   r?   r   )r   r   r   r   r   r5  rl   r=   r   r,  r   r9   r~   r>  r?  r@  rA  rB  rC  r?   r   r   r   r   r=  r=  r  s‹   ‡ ñHð *×.Ñ.€FˆMÓ.Ø€CˆÓØ€Dˆ*ÓØ€FˆKÓØ!€J�
Ó!Ø€Dˆ*ÓØ#€L�*Ó#Ø€Eˆ;ÓØ€CˆÓØ'+Ð˜Ó+Ø*.€FÐ'Ó.Ø"€EÐ×"r   r=  c                  ó.   € ] tR tRtRtRtRtRtRtRt	Rt
R	# )
ÚPluginSettingFieldTypeiˆ  ÚstringÚnumberÚbooleanÚenumÚsecretÚjsonr   N)r   r   r   r   rF  rG  rH  rI  rJ  rK  r   r   r   r   rE  rE  ˆ  s    † Ø€FØ€FØ€GØ€DØ€FØ„Dr   rE  c                  ó”   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R	]R
&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   RtR# )ÚPluginSettingFieldi‘  zðOne ``config_schema`` key of a plugin manifest, rendered by the Plugins hub
(``hermes_cli.plugins_settings.plugin_settings_fields``). ``secret`` fields carry no value: ``env``
names the ``.env`` variable and ``has_value`` whether it is set.r   r,  rE  Útyper©   r    r#   ÚrequiredNre   rÿ   Údefaultr%   Úchoicesr   rà   rb   Ú	has_valuer   )r   r   r   r   r   r   rÿ   rP  rQ  rà   rR  r   r   r   r   rM  rM  ‘  sZ   ‡ ñHð 
ƒHØ
 Ó ØƒJØÓØƒNØ"€EÐÓ"Ø $€GÐÓ$Ø $€GÐÓ$Ø€CˆÓØ!€Iˆ{×!r   rM  c                  ó:   € ] tR tRtRtRtRtRtRtRt	Rt
R	tR
tRtR# )ÚPluginServerStatei¢  rç   Úapp_not_runningÚhermes_not_connectedÚendpoint_unavailableÚno_interactive_sessionÚversion_too_oldÚmissing_appÚunsupported_gpurH   r   N)r   r   r   r   rç   rU  rV  rW  rX  rY  rZ  r[  rH   r   r   r   r   rT  rT  ¢  s2   † Ø€IØ'€OØ1ÐØ1ÐØ5ÐØ'€OØ€KØ'€OØ„Gr   rT  c                  ó6   € ] tR tRt$ R]R&   R]R&   R]R&   RtR# )	ÚPluginServerRowi®  r   r   rT  r#  Úsentencer   Nr*   r   r   r   r]  r]  ®  s   ‡ Ø
ƒIØÓØ‡Mr   r]  c                  óþ   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R
]R&   R]R&   R
]R&   R]R&   RtR]R&   RtR]R&   RtR]R&   Rt	R]R&   Rt
R]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR# )ÚAgentPluginRowi´  zW``methods_tools._plugin_rows`` + ``plugins_cmd_catalog.catalog_row_fields`` provenance.r   r   r,  r+  r    r|   r_   r#   ÚportableÚinstall_dirÚhas_desktop_halfzlist[PluginServerRow]rÖ   Nr   r?  Úcatalog_tierÚinstalled_shaÚcatalog_shaÚcatalog_versionrb   Úupdate_availableÚupdate_targetÚ
pinned_shazlist[PluginSettingField] | NoneÚsettings_schemar   )r   r   r   r   r   r   r?  rd  re  rf  rg  rh  ri  rj  rk  r   r   r   r   r`  r`  ´  s™   ‡ Ùaà
ƒIØ	ƒHØƒLØÓØƒKØƒKØƒNØÓØÓØ"Ó"Ø#€L�*Ó#Ø#€L�*Ó#Ø $€M�:Ó$Ø"€K�Ó"Ø"&€O�ZÓ&Ø$(Ð�kÓ(ð !%€M�:Ó$Ø!€J�
Ó!Ø7;€OÐ4×;r   r`  c                  óZ   € ] tR tRt$ RtR]R&   R]R&   ]! ]R7      tR]R	&   R
t	R]R&   Rt
R
# )ÚPluginLiveServeriÎ  ziOne plugin MCP server connected at activation: its callable tool names, or the reason it did not connect.r   r   r#   rç   r‘   r>   r&   Nr   r  r   )r   r   r   r   r   r   r   rl   r&   r  r   r   r   r   rm  rm  Î  s(   ‡ Ùsà
ƒIØƒOÙ¨TÔ2€Eˆ9Ó2Ø€Eˆ:×r   rm  c                  ó4   € ] tR tRt$ RtR]R&   RtR]R&   RtR# )	ÚPluginLiveSkilli×  zTOne plugin skill usable now through ``skill_view`` (qualified ``<plugin>:<skill>``).r   r   r{   r    r   N)r   r   r   r   r   r   r    r   r   r   r   ro  ro  ×  s   ‡ Ù^à
ƒIØ€K�×r   ro  c                  óP   € ] tR tRt$ ]! ]R7      tR]R&   ]! ]R7      tR]R&   Rt	R# )	ÚPluginLiveNowiÞ  r‘   zlist[PluginLiveServer]Úmcp_serverszlist[PluginLiveSkill]r†   r   N)
r   r   r   r   r   rl   rr  r   r†   r   r   r   r   rq  rq  Þ  s"   ‡ Ù*/ÀÔ*E€KÐ'ÓEÙ$)¸$Ô$?€FÐ!×?r   rq  c                  óv   € ] tR tRt$ RtR]R&   R]R&   ]! ]R7      tR]R&   R	t	R
]R&   ]! ]R7      t
R]R&   RtR	# )ÚPluginActivationiã  u¾  What a plugin loaded mid-run does NOW vs later (``hermes_cli.plugins_activation``). ``activated_now``
kinds (``{kind: [names]}``): ``gateway_commands`` (slash names), ``locales`` (``<lang>.<surface>``
language-pack layers), ``gateway_transforms`` / ``hooks`` (hook
names), ``callbacks`` (platforms / ``slack:<action_id>``) â€” live in the running gateway once it reloaded
(``gateway_reloaded``). ``live_now``: the plugin's MCP servers (connected, with their tools, or the
error) and skills, usable in every open chat of the profile from its next turn â€” the chats also get a
note listing them. ``deferred`` kinds: ``tools`` (Python tool names) and ``prompt`` (section ids)
apply from the next session.r   r   r,  r‘   zdict[str, list[str]]Úactivated_nowNzPluginLiveNow | NoneÚlive_nowÚdeferredr   )r   r   r   r   r   r   r   Údictru  rv  rw  r   r   r   r   rt  rt  ã  s>   ‡ ñ$ð ƒIØ	ƒHÙ*/ÀÔ*E€MÐ'ÓEØ%)€HÐ"Ó)Ù%*¸4Ô%@€HÐ"×@r   rt  c                  ób   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   R]R&   RtR# )ÚOnboardingCatalogPluginiô  zëA catalog plugin curated for the onboarding card (``onboarding: true``) that this OS runs.
``app_state`` is the pinned ``plugin.json`` declaration judged on this host; ``sentence`` names what
is missing (empty when present or unknown).r   r   Útitler    r   Útierr>   Ú	platformsr   Ú	app_stater^  r   Nr  r   r   r   rz  rz  ô  s0   ‡ ñ3ð ƒIØƒJØÓØ
ÓØÓØÓØ‡Mr   rz  c                  óN   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R
tR# )ÚCatalogPluginPresencei  a  A named catalog plugin this OS runs. ``state`` is the pinned ``plugin.json`` app declaration judged
on this host; ``sentence`` names what is missing (empty when present or unknown); ``disclosure`` is the
catalog description's ``Disclosure:`` sentence (empty when it has none).r   r   r{  r   r#  r^  Ú
disclosurer   Nr  r   r   r   r€  r€    s$   ‡ ñPð ƒIØƒJØÓØƒMØ‡Or   r€  c                  óX   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   RtR# )ÚPluginScanFindingi  zUOne security-scan finding (``tools.plugin_guard``) on a plugin tree the scan blocked.r   Ú
pattern_idÚseverityr¶   Úfiler!   Úliner    r   Nr  r   r   r   rƒ  rƒ    s$   ‡ Ù_àƒOØƒMØƒMØ
ƒIØ
ƒIØ×r   rƒ  c                  ó²  € ] tR tRt$ RtRtR]R&   RtR]R&   RtR]R&   Rt	R	]R
&   Rt
R	]R&   RtR	]R&   RtR	]R&   RtR]R&   RtR	]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR]R&   RtR	]R&   RtR]R&   RtR	]R&   RtR]R &   RtR]R!&   RtR	]R"&   RtR]R#&   RtR$]R%&   RtR]R&&   Rt R]R'&   Rt!R(]R)&   Rt"R*]R+&   R,t#R# )-ÚPluginsManageResulti  uá  ``list`` â†’ ``plugins`` + counts; ``toggle`` â†’ ``ok``/``unchanged``/``restart_required``/``name``
(the canonical key written)/``plugin``; ``install`` â†’ ``hermes_cli.plugins_cmd.dashboard_install_plugin``'s
ok payload; ``toggle``/``install``/``update`` that loaded a plugin also carry ``gateway_reloaded`` (the
running gateway picked it up and re-wired its handlers) and ``activation`` â€” the honest split of what is
live now vs deferred, so ``restart_required`` is True only when no gateway answered; ``update`` â†’ ``ok``/``unchanged``/``sha``, or ``ok=false`` + ``consent_required`` with the
``delta`` (``{surface: [added...]}``) / ``delta_lines`` a widened pin adds â€” nothing changed until the
client retries with ``accept_capabilities`` â€” or ``ok=false`` + ``scan_blocked`` with ``scan_verdict`` /
``scan_findings`` (retry a caution verdict with ``force``); ``remove`` â†’ ``ok``/``name`` plus
``cleared_memory_provider`` when the removed plugin was the live ``memory.provider``.Nzlist[AgentPluginRow] | Noner2  rt   Ú
user_countÚbundled_countrb   rË   r[   Úrestart_requiredÚgateway_reloadedzPluginActivation | NoneÚ
activationÚcleared_memory_providerr   r   zAgentPluginRow | NonerÚ   Úplugin_namer%   ÚwarningsÚmissing_envÚpython_dependenciesÚknown_issuesÚafter_install_pathr$   ÚshaÚconsent_requiredr…   ÚdeltaÚdelta_linesÚscan_blockedÚscan_verdictzlist[PluginScanFinding] | NoneÚscan_findingsr  Úwrittenz$list[OnboardingCatalogPlugin] | Noner:  z"list[CatalogPluginPresence] | Noner;  r   )$r   r   r   r   r   r2  r   rŠ  r‹  rË   r[   rŒ  r�  rŽ  r�  r   rÚ   r�  r‘  r’  r“  r”  r•  r$   r–  r—  r˜  r™  rš  r›  rœ  r  r�  r:  r;  r   r   r   r   r‰  r‰    sA  ‡ ñ]ð ,0€GÐ(Ó/Ø!€J�
Ó!Ø $€M�:Ó$Ø€BˆÓØ!€Iˆ{Ó!Ø$(Ð�kÓ(Ø$(Ð�kÓ(Ø*.€JÐ'Ó.Ø+/Ð˜[Ó/Ø€Dˆ*ÓØ$(€FÐ!Ó(Ø"€K�Ó"Ø!%€HÐÓ%Ø$(€KÐ!Ó(à,0ÐÐ)Ó0à%)€LÐ"Ó)Ø%)Ð˜
Ó)Ø€Gˆ[ÓØ€CˆÓØ$(Ð�kÓ(Ø)-€EÐ&Ó-Ø$(€KÐ!Ó(ð !%€L�+Ó$Ø#€L�*Ó#Ø48€MÐ1Ó8Ø€Eˆ:ÓØ $€GÐÓ$à7;€JÐ4Ó;à37€HÐ0×7r   r‰  zplugins.managezuPlugins Hub backend: list installed plugins, toggle, git-install, re-pin a catalog install, or remove a user install.c                  ó&   € ] tR tRtRtRtRtRtRtR# )ÚPluginCatalogLookupStatusiN  ÚfoundÚinvalid_namerH   rh   r   N)	r   r   r   r   r   r¡  rH   rh   r   r   r   r   rŸ  rŸ  N  s   † Ø€EØ!€LØ€GØ„Kr   rŸ  c                  ó"   € ] tR tRt$ R]R&   RtR# )ÚPluginCatalogLookupParamsiU  r   r   r   Nr*   r   r   r   r£  r£  U  rô   r   r£  c                  óR   € ] tR tRt$ RtR]R&   R]R&   R]R&   R]R&   RtR]R	&   R
tR# )ÚPluginCatalogLookupEntryiY  zWThe fields an install needs: the same ones the embedded catalog picker posts on a pick.r   r   r>  r–  ÚsubdirÚ	communityr|  r   N)r   r   r   r   r   r   r|  r   r   r   r   r¥  r¥  Y  s#   ‡ Ùaà
ƒIØ
ƒIØ	ƒHØƒKØ€Dˆ#×r   r¥  c                  ó4   € ] tR tRt$ RtR]R&   RtR]R&   RtR# )	ÚPluginCatalogLookupResultic  zº``found`` carries ``entry``. ``unknown`` covers a name the catalog doesn't list and one it removed;
``unavailable`` means neither the live catalog nor the in-tree fallback could be read.rŸ  r_   NzPluginCatalogLookupEntry | NoneÚentryr   )r   r   r   r   r   r   rª  r   r   r   r   r©  r©  c  s   ‡ ñ^ð &Ó%Ø-1€EÐ*×1r   r©  zplugins.catalog.lookupz¯One curated plugin-catalog entry by name, from the backend's live catalog (cached, with the in-tree fallback and kill list); backs hermes://plugin/install?catalog= deep links.N)fr   Ú
__future__r   Úpydanticr   Úbaser   r   r   r   Úcommonr   r	   r
   Úconnectors_operationr   r   Úregistryr   r   r   r(   r/   r2   r4   r8   r<   rB   rJ   rM   rP   rU   rY   r^   rk   rr   rx   rz   r€   r„   rŒ   rŽ   r�   r—   rš   rŸ   r§   r­   r³   r¹   r½   rÅ   rÇ   rÊ   rÍ   rÐ   rÕ   rØ   rÜ   rä   ræ   rî   rð   ró   rö   rû   rþ   r  r  r  r  r  r  r  r  r  r  r!  r&  r(  r*  r/  r1  r5  r=  rE  rM  rT  r]  r`  rm  ro  rq  rt  rz  r€  rƒ  r‰  rŸ  r£  r¥  r©  r   r   r   Ú<module>r±     sZ  ðñõ #å ç 5Ó 5ß =Ñ =ß >Ý ô"�Vô "ô#�ô #ô˜ô ñ €|˜NÐ3EØqõsñ €˜~Ð6HØLõNô�&ô ô
�fô ô
�fô ñ
 €|˜N°?Økõmô�(ô ô
˜6ô ô˜6ô ñ ÐÐ!5Ð>RØpõrô�fô ô�fô ñ €|˜O°OØbõdô�fô ô�hô ô
�xô ô-�fô -ñ  €|˜O°OØgõiô�8ô ô!˜ô !ô�&ô ô
"�iô "ô(�yô (ô)˜ô )ñ €Ð1Ð:LØoõqô˜ô ô�fô ô
�yô ô˜ô ñ
 €Ð1Ð:LØ[õ]ô˜6ô ôE�Fô Eô˜ô ô�fô ô	!˜ô 	!ô�6ô ô
	˜6ô 	ñ ÐÐ!5Ð>RØdõfô˜ô ôÐ+ô ô˜Vô ôÐ1ô ñ ÐÐ!3Ð<PØIõKñ ÐÐ!3Ð<RØOõQñ €Ð1Ð:PØAõCô�fô ô#�vô #ñ €}˜]Ð3CØfõhô�hô ô
�vô ô"$˜6ô $ñ Ð -Ð8LØ`õbô�xô ô
˜&ô 
ô˜Vô ñ
 Ð MÐ:PØ`õbô˜-ô ô$Ð-ô $ô˜&ô ñ ÐÐ!4Ð=PØbõdôÐ 3ô ô
 ô ñ Ð Ð)BÐKdØnõpô�6ô ô
	-˜6ô 	-ñ ÐÐ"5Ð>RØmõoô˜Vô ñ
 ÐÐ$7Ð@VØ:õ<ô+Ð-ô +ô˜&ô ñ Ð Ð)<ÐEXØaõcôÐ,ô ô˜ô ô,˜ô ,ñ ÐÐ(:ÐCUØ`õbô%˜6ô %ñ Ð!Ð*<ÐEYØUõWôÐ/ô ô%˜Vô %ñ Ð#Ð,BÐKaØNõPô	˜ô 	ô	�fô 	ô�vô ô2˜ô 2ñ €~Ð/Ð8IØhõjô�Hô ô#˜-ô #ô,˜Xô ô"˜ô "ô"	˜ô 	ô�fô ô<�Vô <ô4�vô ô�fô ô@�Fô @ô
A�vô Aô"˜fô ô	˜Fô 	ô˜ô ô-8˜&ô -8ñ` ÐÐ 3Ð<Oð'õ(ô
  ô  ô ô ô˜vô ô2 ô 2ñ ÐÐ(AÐJcða÷br   