Introduces optional-plugins/ — a new category for plugins that ship with
the repo but are NOT auto-discovered. They live alongside the code but only
land in ~/.hermes/plugins/ (and thus get loaded) when the user explicitly
installs them.
Core changes:
- optional-plugins/observability/langfuse-tracing/ — langfuse tracing plugin
(pre/post LLM + tool hooks, usage/cost normalization, fail-open when SDK
missing). NOT in plugins/ so zero import overhead on devices that don't
want it.
- hermes_cli/plugins_cmd.py — official install path: _resolve_official_plugin()
recognises 'official/<category>/<name>' identifiers and copies from
optional-plugins/ into ~/.hermes/plugins/ (no git clone, no network).
_list_official_plugins() enumerates available optional plugins.
cmd_list(available=True) shows not-yet-installed official plugins.
- hermes_cli/main.py — hermes plugins list --available flag
- hermes_cli/tools_config.py — Langfuse Observability in TOOL_CATEGORIES;
post_setup handler installs the langfuse SDK and runs cmd_install()
- hermes_cli/config.py — Langfuse credentials in OPTIONAL_ENV_VARS;
optional tuning keys in _EXTRA_ENV_KEYS
User flows:
hermes plugins install official/observability/langfuse-tracing
hermes plugins list --available
hermes tools (-> Langfuse Observability -> credentials -> auto-installs)
Closes#15764