hermes-agent/website/docs/developer-guide
Greg Gibeau c600fd46bd fix(memory): complete discovery and registration parity for out-of-tree providers
Builds on the three salvaged commits: adds the sources and integration points
they leave out, so a pip-installed memory provider is not a second-class
citizen next to a directory install.

Discovery
- Project-local providers (./.hermes/plugins/<name>/), gated on
  HERMES_ENABLE_PROJECT_PLUGINS exactly as PluginManager gates its own project
  scan. Completes the four sources CONTRIBUTING.md and AGENTS.md already
  promised; memory was the only discovery system missing two of them.
- find_provider_dir() now resolves a package entry point to its directory.
  This is load-bearing: config_schema.py (the dashboard panel) and cli.py (the
  `hermes <provider>` subcommands) are read from disk rather than imported, so
  without a directory a pip-installed provider silently lost both.
- list_memory_provider_names() includes entry-point providers, so they appear
  in the dashboard's memory.provider dropdown.

Resolution stays import-free. hermes_cli.plugins.resolve_module_origin() is
extracted from _resolve_module_source() (added by the salvaged #76567) and
shared, so discovery walks a module's file layout instead of importing it.
find_provider_dir() is called from the dashboard and from argparse setup, long
before the operator has chosen a provider — importing every installed candidate
would execute third-party code on the strength of a package being present.
A test asserts the resolution leaves no side effects and no sys.modules entry.

Registration
- PluginContext gains register_memory_provider(). Memory was the only provider
  category without one; context engine, image gen, video gen, web search,
  browser, TTS, transcription, secret source, dashboard auth and platform all
  have one.
- _ProviderCollector delegates unknown register_* calls to a real
  PluginContext instead of carrying three hand-written no-ops. It silently
  dropped register_tool/register_hook, and had no register_auxiliary_task at
  all — despite PluginContext.register_auxiliary_task documenting a memory
  provider (hindsight's pre-retain dedup) as its worked example. It can no
  longer drift behind PluginContext.
- A raise after register_memory_provider() no longer costs the provider. The
  loader caught it into a debug log, discarded the registered instance, and
  fell through to "instantiate any MemoryProvider subclass" — returning a
  different, unconfigured provider. A silent downgrade that looked like
  success, and the exact outcome of calling register_auxiliary_task.

Activation is unchanged: still gated on memory.provider naming the plugin, and
covered by a test so the real PluginContext cannot start requiring
plugins.enabled — that would break every existing user-installed provider.

Verified end to end against a real third-party provider (kainappsinc/elephant)
installed by pip alone, with no directory copy: it appears in the dropdown,
resolves its directory, loads with its tools, and renders its dashboard panel.

Closes #40101.
2026-08-13 11:49:14 -07:00
..
plugins feat(plugins): manifest v2 — schema version, api_version, inter-plugin deps, pip-dependency declaration seam, config schema (#64165) 2026-08-12 18:39:22 -07:00
_category_.json
…
acp-internals.md
…
adding-platform-adapters.md feat(platforms): add typed plugin send paths 2026-08-12 16:27:19 -07:00
adding-providers.md
…
adding-tools.md
…
agent-loop.md
…
architecture.md
…
browser-provider-plugin.md docs: update agent-browser install docs for npx-based resolution 2026-08-13 02:38:28 -07:00
browser-supervisor.md
…
codebase-ownership.md
…
context-compression-and-caching.md
…
context-engine-plugin.md
…
contributing.md
…
creating-skills.md
…
cron-internals.md
…
desktop-plugin-sdk.md docs: unified desktop halves are opt-in 2026-08-13 13:18:49 -05:00
egress-internals.md
…
extending-the-cli.md
…
gateway-internals.md
…
image-gen-provider-plugin.md
…
memory-provider-plugin.md fix(memory): complete discovery and registration parity for out-of-tree providers 2026-08-13 11:49:14 -07:00
model-provider-plugin.md fix: gate entry-point provider scan on plugins.enabled and skip register(ctx) targets 2026-08-13 11:11:53 -07:00
plugin-llm-access.md fix(plugins): complete task-routed LLM integration 2026-08-12 16:25:20 -07:00
programmatic-integration.md feat(api): steer active runs 2026-08-13 09:34:08 -07:00
prompt-assembly.md
…
provider-runtime.md
…
secret-source-plugin.md fix: track secret source registration origin 2026-08-12 16:25:10 -07:00
session-storage.md
…
subagent-lifecycle-api.md
…
tools-runtime.md
…
trajectory-format.md
…
video-gen-provider-plugin.md
…
web-search-provider-plugin.md
…
worktree-ui-dev.md
…