Skip to content

catalog: hindsight memory provider from vectorize-io/hindsight (subdir, pin dc75038; memory-provider migration) - #119767

Merged
teknium1 merged 1 commit into
mainfrom
catalog/hindsight
Sep 23, 2026
Merged

teknium1 merged 1 commit into
mainfrom
catalog/hindsight

Conversation

@teknium1

@teknium1 teknium1 commented Sep 23, 2026 •

Copy link
Copy Markdown
Collaborator

Lists the maintainer-owned copy of the hindsight memory provider (vectorize-io/hindsight, subdir hindsight-integrations/hermes) in the plugin catalog so hermes_cli/memory_provider_migration.py (#114569) can install it for existing memory.provider: hindsight users once the bundled plugins/memory/hindsight leaves core.

Do not merge from a sweep — Teknium lands this one himself (memory-provider migration, first provider).

Entry

Pin dc75038866a3966b5bf5c82ff57c7a758bb4070a — last default-branch commit touching the subdir (2026-09-21); tag v0.10.1 (f8950b0) has a byte-identical subdir tree
subdir hindsight-integrations/hermes
Maintainer vectorize-io (@nicoloboschi) — copied from the Nous handoff repo, now the live source
Category / tier memory / community
Disclosure in local_embedded mode the plugin self-installs the hindsight-all PyPI package on first use via core's lazy-install path (honours security.allow_lazy_installs); hermes memory setup fetches its bank-template catalog from raw.githubusercontent.com (vectorize-io/hindsight main)

Intake gates at the pin

  • hermes plugins validate — ok, 13/13 checks, 0 warnings, in the main venv and a bare py3.11 pip install -e venv (with and without --install-deps).
  • plugin_python_deps.resolve(..., dry_run=True) — ok (hindsight-client>=0.6.1,<1, hindsight-embed>=0.6.1,<1; hindsight-client stays at core's 0.6.1 pin).
  • Install scanner — safe; the medium findings are README/docstring uv pip install hints, an example LAN URL and a test fixture.
  • No desktop/ bundle; no subprocess; no vendor credential stores; egress = Hindsight API/UI hosts, the templates JSON above, openrouter default base URL for embedded mode.
  • Upstream's own test suite: 21 passed.
  • scripts/validate_plugin_catalog.py plugin-catalog/ — OK: 242 file(s) valid; extract-plugins.py emits the entry.

Diff vs the bundled copy (origin/main 731e99d)

The handoff was byte-identical; the pin is a ruff format pass plus a 188-line semantic delta:

Live E2E — bundled→catalog migration (#114569) on a real scratch home

Fake HOME/HERMES_HOME, editable venv of this branch, fake OpenAI stub for the LLM, HINDSIGHT_API_KEY fake with api_url on an unreachable loopback; live catalog cache seeded with this branch's extract-plugins.py output (the entry is not published yet).

Step Result
Baseline, bundled present: hermes memory status, hermes chat -Q -q hi provider installed/available; registered (3 tools), activated; tools hindsight_recall/reflect/retain
Bundled dir deleted (uncommitted), same home: hermes chat -Q -q hi auto-install at agent start: ✓ Memory provider 'hindsight' moved out of core — installed its plugin from the catalog…; installed tree byte-identical to the pin; .install-metadata.json pinned: true, sha = pin; .env + hindsight/config.json unchanged; config.yaml gains only plugins.enabled: [hindsight]
After install hermes memory status installed/available; hermes plugins list → catalog:community; plugins.manage list row source: user with catalog_name/sha/version; Desktop Memory surface GET /api/memory/providers/hindsight/config?surface=declared → 5 fields
hermes update hook (migrate_all_homes) ×2 installs on pass 1, silent no-op on pass 2
security.allow_lazy_installs: false at agent start one-line warning, no install (line is agent.log-only — #119769)
security.allow_lazy_installs: false on the update hook installs (as documented in #114569 / memory-providers.md)
hermes profile create x --clone copies config (memory.provider, plugins.enabled) but not plugins/; the update hook and hermes -p x chat both install into the clone home; --clone-all copies plugins/

Full transcript: lane scratch RESULTS.md (every command + output).

Infographic

hindsight moves to the plugin catalog

…r hindsight-integrations/hermes)

Pins the maintainer-owned copy of the formerly bundled plugins/memory/hindsight at
dc75038866a3966b5bf5c82ff57c7a758bb4070a (tree identical to tag v0.10.1). Same provider name,
memory.hindsight section, data dir and tool names, so hermes_cli/memory_provider_migration.py
can install it for existing users once the bundled copy leaves core.
@teknium1 teknium1 added the Plugin Catalog Plugin catalog entries, discovery, metadata, and catalog management label Sep 23, 2026
@github-actions

github-actions Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

૮ >ﻌ< ა ci review

ran on 4d3892b — catalog: hindsight memory provider from vectorize-io/hindsig

debug info

CI timings

CI timings · View report · View job

Wall time 6m16s vs 6m15s (+0.3%). 3 job(s) slower, 6 faster, 3 unchanged.

  • OS-specific tests / Windows-only tests: -10.0s
  • Python lints / ruff enforcement (blocking): -5.0s
  • Python lints / Windows footguns (blocking): +5.0s
  • Profile artifact check / Reject profile archives: -3.0s
  • Python tests / e2e: +1.0s

@alt-glitch alt-glitch added type/feature New feature or request P3 Low — cosmetic, nice to have comp/plugins Plugin system and bundled plugins tool/memory Memory tool and memory providers labels Sep 23, 2026
@teknium1
teknium1 merged commit 344c522 into main Sep 23, 2026
38 checks passed
@teknium1
teknium1 deleted the catalog/hindsight branch September 23, 2026 08:08
nicoloboschi added a commit to vectorize-io/hindsight that referenced this pull request Sep 23, 2026
teknium authored the real entry in NousResearch/hermes-agent#119767, so
plugin-catalog-entry.yaml is a second copy of a file we do not own and would
silently drift from the one that actually ships. The README now points at
theirs and states the consequence that matters: changes here reach nobody
until that pin moves.
nicoloboschi added a commit to vectorize-io/hindsight that referenced this pull request Sep 23, 2026
…#4655)

* fix(hermes): port two post-handoff fixes and floor the deps at 0.10.1

Closes #4640.

Two fixes landed on hermes-agent's bundled copy after the 2026-09-17 handoff and
never reached this tree. Users moved onto our copy by the catalog migration would
have regressed on both.

- Bounded append-mode turn buffer (hermes-agent 6e1de4850e6, their #62950).
  sync_turn now clears _session_turns after an append retain instead of moving the
  watermark to its length. The retain job snapshots its own content and append
  retains only ever read the un-retained tail, so keeping the turns pinned the
  whole session in memory on long-running gateway sessions. Overwrite mode is
  untouched — it resends the full session each retain and must keep every turn.

  This also removes a duplicate write: on_session_switch flushes the WHOLE buffer
  under the old document id, so after an append retain it re-shipped turns that
  had already been stored. test_session_switch_starts_a_new_document was pinning
  that second retain; it now expects one per session.

- Gated root warning (hermes-agent cd3de040ab9). initialize() records
  warning_callback/platform and _start_embedded_daemon routes the "cannot run as
  root" notice through the host's sink, falling back to
  gateway.warning_notifications.render_notification, instead of an unconditional
  stderr print. That is what lets users opt out of user-channel warnings on
  messaging platforms.

Also drops the `hooks:` key from plugin.yaml. Hermes reads `provides_hooks`, and
the bundled copy dropped the declaration in 72ee40fa680 because memory providers
get their lifecycle calls through the provider interface, not registered hooks.

Separately, floors the declared deps at >=0.10.1. hindsight-embed 0.10.0 (on PyPI
2026-09-14 to 2026-09-21) shipped a probe that ran asyncio.run on the caller's
thread, clearing its event loop, so the next client call hit an aiohttp session
bound to a dead loop and local_embedded failed outright. Anyone who installed in
that window is pinned to the broken release until a floor moves them off it;
_MIN_CLIENT_VERSION moves with it so _maybe_upgrade_client() pulls the client
forward on session start rather than waiting for a `hermes update`.

Both behaviour fixes have a regression test, each verified to fail on the
pre-fix code.

* chore(hermes): drop our copy of the catalog entry

teknium authored the real entry in NousResearch/hermes-agent#119767, so
plugin-catalog-entry.yaml is a second copy of a file we do not own and would
silently drift from the one that actually ships. The README now points at
theirs and states the consequence that matters: changes here reach nobody
until that pin moves.

* review: read the warning sink directly and pin its defaults

__init__ now guarantees _warning_callback/_platform, so the getattr fallbacks
carried over from the upstream port were dead defensiveness. Reading the
attributes directly makes the __init__ defaults load-bearing, so a test pins
them: availability probes construct a provider without ever calling
initialize(), and _start_embedded_daemon reads both.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/plugins Plugin system and bundled plugins P3 Low — cosmetic, nice to have Plugin Catalog Plugin catalog entries, discovery, metadata, and catalog management tool/memory Memory tool and memory providers type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants